Presentation is loading. Please wait.

Presentation is loading. Please wait.

REpresentational State Transfer.  Resources  Representations  Verbs  Links  Headers  HTTP Status Codes.

Similar presentations


Presentation on theme: "REpresentational State Transfer.  Resources  Representations  Verbs  Links  Headers  HTTP Status Codes."— Presentation transcript:

1 REpresentational State Transfer

2  Resources  Representations  Verbs  Links  Headers  HTTP Status Codes

3  A resource is identified by a Uri.  Uri’s are considered Opaque. http://localhost/api/customers http://localhost/api/customers/1

4  Fetching a resource returns a Representation.  Representations have a content type i.e. text/xml, application/json, text/html etc. http://localhost/api.svc/customers/12 DevDefined 1 http://localhost/api.svc/customers/12/orders

5 ConceptualSQLHTTP (REST) FindSELECTGET CreateINSERTPOST... Or PUT UpdateUPDATEPUT DestroyDELETE  HTTP Verbs are used to operate on resources.  GET must be Side Effect Free  PUT must be Idempotent.

6  Links are returned in representations.  Clients follow links, allowing them to transition state.  Using Links can provide elegant ways to scale out or integrate 3 rd party services.

7  If-Modified-Since  Etag  Cache-Control  Accept  Content-Type  Authorization

8 CodeNameDescription 200OKSuccessful Request. 201CreatedNew resource created, returns Uri. 202AcceptedRequest accepted, but resources haven’t been created yet. 304Not ModifiedConditional get, resource is unchanged (so we can use a previously cached resource) 400Bad RequestError in request(i.e. request failed validation) 404Not FoundResource was not found. 405Method Not Allowed i.e. If you try to delete a read-only resource, or the whole resource container. 500Internal Server ErrorSomething else went wrong (default status for errors in WCF).

9  WCF – Building a Simple Rest Service  Linq & REST – ADO.Net Data Services ▪ Entity Framework ▪ Custom classes  MVC meets REST - MonoRail  OAuth – RESTful Authorization

10  WCF Demo - A quick tour of a WCF REST service.  webHttpBinding  WebGet vs WebInvoke  UriTemplates  GET, POST, PUT, & Delete  Changing the representation.

11  Fiddler is very useful when developing REST services.  There are some catches for first time users:  Disable IPV6 in Fiddler when using Cassini (it doesn’t like the ::1 loopback address)  Use “.” after localhost when testing with IE 7 to stop proxy being bypassed. ▪ i.e. http://localhost.:8080/api.svc/customers/http://localhost.:8080/api.svc/customers/  FireFox users - you need to manually configure proxy settings.

12  Exceptions end up as 500 errors on client. ▪ You need to explicitly set status for non-server errors (i.e. For invalid requests)  Uri Templates are fussy ▪ Trailing slashes will cause a match to fail, contrary to many peoples expectations.  HTTP Method names are case-sensitive. ▪ Using “Post” instead of “POST” can make for confusing 405 errors  The input/output Representation format is defined at the contract operation level. ▪ Targeting multiple representations “across the board” is ugly.  Support for linking resources is non-existent.

13  ADO.Net Data Services (Was Astoria)  Building Service using ADO.Net Entity Framework.  Exploring Query Syntax.

14  Using EF - Out of scope  However... Provides easy way to quickly play with Astoria.  Add Item -> Entity Model  Use AdventureWorks database, just the tables should do, call it “AdventureWorks”  Add Item -> ADO.Net Data Service  Edit the.cs file, set entities class for service to AdventureWorksModel.AdventureWorksEntities.  Alter InitializeService method to look like this (Don’t do this for production use) public static void InitializeService(IDataServiceConfiguration config) { config.SetEntitySetAccessRule("*", EntitySetRights.All); config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); } public static void InitializeService(IDataServiceConfiguration config) { config.SetEntitySetAccessRule("*", EntitySetRights.All); config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); }

15 UriConceptual /List of types / tables - “Workspace” in AtomPub. /EmployeeList of instances / rows - “Collection” or “Feed’ in AtomPub. /Employee(1)Instance / Row by Key(s) – Collection “Member” or “Entry” in AtomPub /Employee(1)/ContactForeign Key / Relationship /Employee(1)/GenderProperty / Column /ProductProductPhoto(ProductID=332,ProductP hotoID=160) Instance (Composite Key) /Product?$orderby=NameOrder the results by the Name property. /Product?$orderby=ListPrice desc, NameOrder by ListPrice in descending Order, then Name ascending.

16 UriConceptual /Product?$filter=contains(Name,'wheel')All products matching filter:.Select(p=>p.Name.Contains(“wheel’)) /Shift(1)/EmployeeDepartmentHistory?$ filter=EmployeeID eq 30 Navigated Relationship with clause, same as: Shifs.Select(s => s.Id == 1).SelectMany(s => s.EmployeeDepartmentHistory).Where(history => history.EmployeeID == 30) /Product(528)?$expand=BillOfMaterialsWill expand the Navigation Property in-line instead of linking to it. /Product?$top=20Top 20 results, same as:.Take(20) /Product?$skip=20&$take=10Display page 3 (with page size of 10) same as:.Skip(20).Take(10)

17  ADO.Net Data Services isn’t limited to the EF.  Anything implementing IQueryable interface will work too.  Let’s try!

18

19  Entities comes with a.Net Client. ▪ Found in the System.Data.Services.Client assembly.  Client allows Linq -> Uri -> Linq -> Whatever. ▪ With different Types on the client and Server! ▪ Client types can be POCO objects, even if the server side representations are not. ▪ [DataServiceKey(...)] attribute required to support non-GET requests.  Client implements a “unit of work” like pattern, allowing changes to be collected and then persisted at once.  Changes can be batched in a single request (though this can be viewed as a perversion of HTTP principles).


Download ppt "REpresentational State Transfer.  Resources  Representations  Verbs  Links  Headers  HTTP Status Codes."

Similar presentations


Ads by Google