Click here to load reader
Upload
mark-rackley
View
4.043
Download
2
Embed Size (px)
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…