SharePoint REST vs CSOM

Preview:

DESCRIPTION

Heads up competition between REST and CSOM. Who's going to win???

Citation preview

Client Side Development – REST or CSOM

Mark RackleySolutions Architect

Level: Intermediate

• 18+ years software architecture and development experience

• SharePoint Junkie since 2007

• Event Organizer• Blogger, Writer, Speaker• Bacon aficionado

• @mrackley• http://www.sharepointhillbilly.com

About Mark Rackley

Agenda

• Pre-Game Highlights– What is CSOM and REST?

• First Quarter– API Coverage

• Second Quarter– Platforms and Standards

• Third Quarter– Ease of Use / Flexibility

• Fourth Quarter– Batch Processing / Performance

ROB WINDSOR - SHAREPOINT 2013 DEVELOPMENT: CLIENT OBJECT MODEL AND REST API.

http://www.pluralsight.com/training/Courses/TableOfContents/sharepoint-2013-client-object-model-rest

CLIENT SIDE OBJECT MODEL (CSOM)

Client Side Object Model

Rookie Year: 2010

API used when building remote applications

• Introduced in SharePoint 2010• Designed to be similar to Server

Object Model• Three implementations

• .NET managed, Silverlight, JavaScript

• Communication with SharePoint done in batches

JavaScript Client Object Model (JSOM)

context = SP.ClientContext.get_current();

var speakerList = context.get_web().get_lists().getByTitle("Vendors");

var camlQuery = SP.CamlQuery.createAllItemsQuery();

this.listItems = speakerList.getItems(camlQuery);

context.load(listItems);

context.executeQueryAsync(ReadListItemSucceeded, ReadListItemFailed);

function ReadListItemSucceeded(sender, args) {

var enumerator = listItems.getEnumerator();

var options = "<option value='0'>(None)</option>";

while (enumerator.moveNext()) {

var listItem = enumerator.get_current();

var Vendor = listItem.get_item('Vendor');

var ID = listItem.get_id();

options += "<option value='"+ ID +"'>"+Vendor+"</option>";

}

$("select[title='<Field Display Name>']").append(options);

}

function ReadListItemFailed(sender, args) {

alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());

}

SHAREPOINT REST

REST

Rookie Year: 2010

Data-centric web services based on the Open Data Protocol (OData)

• Each resource or set of resources is addressable

• http://<site url>/_api/web• http://<site

url>/_api/web/lists• http://<site

url>/_api/web/lists/getByTitle(‘Customers’)

• Operations on resources map to HTTP Verbs

• GET, PUT, POST, DELETE, …

• Results from service returned in AtomPub (XML) or JavaScript Object Notation (JSON) format

REST Service Access Points

• Site – http://server/site/_api/site

• Web – http://server/site/_api/web

• User Profile – http://

server/site/_api/SP.UserProfiles.PeopleManager

• Search – http:// server/site/_api/search

• Publishing – http:// server/site/_api/publishing

SHAREPOINT 2010 REST

var call = $.ajax({

url: "http://<Url To Site>/_vti_bin/listdata.svc/Vendors?$select=Vendor,Id&$top=1000",

type: "GET",

dataType: "json",

headers: {

Accept: "application/json;odata=verbose"

}

});

call.done(function (data,textStatus, jqXHR){

var options = "<option value='0'>(None)</option>";

for (index in data.d.results) //results may exist in data.d

{

options += "<option value='"+ data.d.results[index].Id +"'>"+data.d.results[index].Title+"</option>";

}

$("select[title='<Field Display Name>']").append(options);

});

call.fail(function (jqXHR,textStatus,errorThrown){

alert("Error retrieving Tasks: " + jqXHR.responseText);

});

SHAREPOINT 2013 REST

var call = $.ajax({

url: _spPageContextInfo.webAbsoluteUrl + "/_api/Web/Lists/GetByTitle('ListName')/items",

type: "GET",

dataType: "json",

headers: {

Accept: "application/json;odata=verbose"

}

});

call.done(function (data,textStatus, jqXHR){

var options = "<option value='0'>(None)</option>";

for (index in data.d.results)

{

options += "<option value='"+ data.d.results[index].Id +"'>"+data.d.results[index].Title+"</option>";

}

$("select[title='<Field Display Name>']").append(options);

});

call.fail(function (jqXHR,textStatus,errorThrown){

alert("Error retrieving Tasks: " + jqXHR.responseText);

});

REST and CSOM Behind the Scenes

FIRST QUARTERAPI Coverage

• Sites, Webs, Features, Event Receivers, Site Collections

• Lists, List Items, Fields, Content Types, Views, Forms, IRM

• Files, Folders• Users, Roles, Groups, User Profiles, Feeds• Search

REST’s Roster

FIELD GOAL FOR REST!It’s good!

CSOM’s Roster• Sites, Webs, Features, Event Receivers, Site

Collections• Lists, List Item s, Fields, Content Types, Views, Forms,

IRM• Files, Folders• Users, Roles, Groups, User Profiles, Feeds• Web Parts• Search• Taxonomy• Workflow• E-Discovery• Analytics• Business Data

TOUCHDOWN CSOM!And the extra point…. Is good!

CSOM REST

7 3

0QTR

1

0 0 0:

SECOND QUARTERPlatforms and Standards

“REST is something Roy Fielding wrote back in 2000 that described a way to share data over HTTP. Unfortunately companies created very different implementation of RESTful services so a bunch got together to define an agreed upon protocol called the Open Data Protocol, also known as OData). The OData spec defines the data formats returned as well as the specific vocabularies used to interact with OData services. Each vendor then implemented it on their own technology stack. Microsoft did this and called their OData product WCF Data Services (notice the URL is actually odata.aspx on MSDN). SharePoint 2013's REST interface is built using WCF Data Services 5.0 which implements the OData v3.0 specification. Unfortunately the SharePoint 2013 implementation does not include everything the spec states, but it's pretty close.”

Read more at http://www.andrewconnell.com/blog/sharepoint-2013-csom-vs.-rest-...-my-preference-and-why

REST’s Playbook

MSDN Magazine - Understanding and Using the SharePoint 2013 REST Interfacehttp://msdn.microsoft.com/en-us/magazine/dn198245.aspx

Use OData query operations in SharePoint REST requestshttp://msdn.microsoft.com/en-us/library/office/fp142385.aspx

Another field goal for REST!

REST’s Playbook

CSOM’s Playbook

.NET, Silverlight, JavaScript

CSOM responds with a field goal!

• Platform independent– PHP, Java, JavaScript, .NET, etc.. Etc

• Many Libraries to choose from that support oData

• Test queries in browser– Chrome app PostMan

REST ends the quarter strong

with Another field goal!

REST’s Playbook

CSOM REST

10 9

0

QTR2

0 0 0:

HALF-TIME SHOW!SPServices

SPServices

jQuery library that wraps SharePoint’s .asmx Web Services in easy to call methods• Pros

– Shorter learning curve for those already comfortable with jQuery

– Cross site access– More universal Anonymous Access– Works in SharePoint 2007

• Cons– .asmx web services have been deprecated– Results returned as XML that must be manually parsed

http://spservices.codeplex.com

SPServices

$().SPServices({

operation: "GetListItems",

async: true,

listName: "Vendors",

CAMLViewFields: "<ViewFields><FieldRef Name='Vendor' /></ViewFields>",

CAMLQuery: "<Query><Where><Neq><FieldRef Name='ID' /><Value

Type='Number'>0</Value></Neq></Where></Query>";,

completefunc: function(xData, Status) {

var options = "<option value='0'>(None)</option>“

$(xData.responseXML).SPFilterNode("z:row").each(function() { var Vendor = ($(this).attr("ows_Vendor"));

var ID = $(this).attr("ows_ID");

options += "<option value='"+ ID +"'>"+Vendor+"</option>";

});

$("select[title='<Field Display Name>']").append(options);

}});

THIRD QUARTEREase of Use / Flexibility

Working with SCOM

CAML

'<Query><Where>' +

'<Or><Or><And><Geq><FieldRef Name="StartDate" /><Value IncludeTimeValue="TRUE" Type="DateTime"> 2013-11-01 ‘+

‘</Value></Geq><Leq><FieldRef Name="StartDate" /><Value IncludeTimeValue="TRUE" Type="DateTime"> 2013-12-31 '+

'</Value></Leq></And><And><Geq><FieldRef Name="DueDate" /><Value IncludeTimeValue="TRUE" Type="DateTime"> 2013-11-01 '+

'</Value></Geq><Leq><FieldRef Name="DueDate" /><Value IncludeTimeValue="TRUE" Type="DateTime">’ 2013-12-31’</Value></Leq></And></Or>' +

'<And><Geq><FieldRef Name="DueDate" /><Value IncludeTimeValue="TRUE" Type="DateTime">' 2013-12-31'</Value></Geq><Leq><FieldRef Name="StartDate" /><Value IncludeTimeValue="TRUE" Type="DateTime"> 2013-11-01 '+

'</Value></Leq></And></Or>' +

'</Where></Query>'

Working with SCOM

CAML

There’s a flag on the play

• Simplified Queries

((StartDate ge ‘2013-11-01’ and StartDate le ‘2013-12-31’) or (DueDate ge ‘2013-11-01’ and DueDate le ‘2013-12-31’) or (DueDate ge ' 2013-12-31 ' and StartDate le ‘2013-11-01’))

Working with REST

Touchdown!!

2 Point Conversion is good!!!

Working with REST

Working with CSOM

Easier learning curve for .NET Devs

Similar to Server Object Model

Compilation in non JavaScript implementations

FIELD GOAL FOR CSOM!It’s good!

CSOM REST

13 17

0QTR

3

0 0 0:

F0URTH QUARTERBatch Processing/Performance

CSOM Batch Processing• Batch Updates• Batch Exception Handling

– One call to server to handle try, catch, finally

CSOM Batch Processing

Batch Insert

function CreateListItems(objArray) {

var itemArray = [];

var clientContext = SP.ClientContext.get_current();

var oList = clientContext.get_web().get_lists().getByTitle('ListName');

for(index in objArray){

var curObject = itemArray[index];

var itemCreateInfo = new SP.ListItemCreationInformation();

var oListItem = oList.addItem(itemCreateInfo);

oListItem.set_item('Title', curObject.title);

oListItem.update();

itemArray[i] = oListItem;

clientContext.load(itemArray[i]);

}

clientContext.executeQueryAsync(onQuerySucceeded, onQueryFailed);

}

CSOM Batch Processing

Batch Exception Handling

scope = new SP.ExceptionHandlingScope(context); var scopeStart = scope.startScope();

var scopeTry = scope.startTry(); list = web.get_lists().getByTitle("Tasks"); context.load(list); scopeTry.dispose();

var scopeCatch = scope.startCatch(); var lci = new SP.ListCreationInformation(); lci.set_title("Tasks"); lci.set_quickLaunchOption(SP.QuickLaunchOptions.on); lci.set_templateType(SP.ListTemplateType.tasks); list = web.get_lists().add(lci); scopeCatch.dispose();

var scopeFinally = scope.startFinally(); list = web.get_lists().getByTitle("Tasks"); context.load(list); scopeFinally.dispose();

scopeStart.dispose();

context.executeQueryAsync(success, fail);

CSOM Batch Processing

TOUCHDOWN!

REST Batch Processing

FUMBLE!

REST vs. CSOM Performance

• REST is “chattier”– No batching

• CSOM returns more data– Bigger packets

• REST can return array of JSON objects– Can feed array directly to libraries without

transformation or iteration

FIELD GOAL FOR REST!!It’s good!

CSOM REST

20 20

0QTR

4

0 0 0:

OVERTIME!Anonymous Access

KIRK EVANS - WHAT EVERY DEVELOPER NEEDS TO KNOW ABOUT SHAREPOINT APPS, CSOM, AND ANONYMOUS PUBLISHING SITES

http://blogs.msdn.com/b/kaevans/archive/2013/10/24/what-every-developer-needs-to-know-about-sharepoint-apps-csom-and-anonymous-publishing-sites.aspx

REST & CSOM Anonymous Access

On-Premises

REST & CSOM Anonymous Access

On-Premises

• According to Microsoft “Not Advisable”– Exposes too much information to nosey people– Opens you up to DoS attacks

• Reality– SPServices can be used by nosey people (can’t turn it

off)– Everyone is open to a DoS attack

REST & CSOM Anonymous Access

Office 365

Anonymous Access with REST* or CSOM is not possible in Office 365

*It Depends

CSOM Anonymous• Blocked by default

– GetItems and GetChanges on SPLists– GetChanges and GetSubwebsForCurrentUser on SPWebs– GetChanges on SPSites

• Use PowerShell to enable$webapp = Get-SPWebApplication "http://WebAppUrl"

$webapp.ClientCallableSettings.AnonymousRestrictedTypes.Remove([microsoft.sharepoint.splist], "GetItems")

$webapp.Update()

REST Anonymous

Search in REST

Waldek Mastykarz - Configuring SharePoint 2013 Search REST API for anonymous users

http://blog.mastykarz.nl/configuring-sharepoint-2013-search-rest-api-anonymous-users/

FIELD GOAL REST!!!!!!!!

REST WINS!

CSOM REST

20 23

0QTR

OT

0 0 0:

Game HighlightsCSOM REST

More API Coverage Than REST

Designed to be similar to .NET Object Model, more comfortable for .NET Devs

Handles batch processing Well

CAML still sucks

Anonymous possible but not advised

Game HighlightsCSOM REST

More API Coverage Than REST NO MORE CAML!

Designed to be similar to .NET Object Model, more comfortable for .NET Devs

Platform independent, REST/oData play well with other libraries

Handles batch processing Well Easy testing in browser using URL

CAML still sucks Can perform better than CSOM

Anonymous possible but not advised

Anonymous search works well, other anonymous possible as well but not advised

QUESTIONS??There are no stupid ones…

Recommended