Communication Protocols And Web Services

13,640 views
13,266 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
13,640
On SlideShare
0
From Embeds
0
Number of Embeds
33
Actions
Shares
0
Downloads
141
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Communication Protocols And Web Services

  1. 1. Communication Protocols and Web Services<br />Created by Omer Katz, 2010<br />Omer Katz © Some Rights Reserved<br />
  2. 2. Structure of a standard networkingstack for the Web<br />
  3. 3. Common serialization formats<br />JSON<br />Natively supported within JavaScript<br />Capable of referencing other records by convention<br />Human readable format<br />Lightweight<br />Easy to parse<br />Uses JSON-Schema to validate itself<br />Key-Value based syntax<br />XML<br />JavaScript exposes a proprietary DOM API<br />Human readable format for hierarchal data<br />Hard to parse<br />Consumes more memory than JSON<br />Supports XSLT and XPath<br />Uses XML-Schema or DTD to validate itself<br />Markup based syntax<br />
  4. 4. What is a web service?<br />A web service is typically an application programming interface (API) or Web API that is accessed via Hypertext Transfer Protocol (HTTP) and executed on a remote system, hosting the requested service.<br />Web services do not provide the user with a GUI.<br />Web services instead share business logic, data and processes through a programmatic interface across a network. <br />Developers can then add the Web service to a GUI (such as a Web page or an executable program) to offer specific functionality to users.<br />
  5. 5. Web services communication protocols<br />RPC<br />XML-RPC<br />HTTP Bound<br />JSON-RPC<br />SMD – Service Mapping Description<br />JSONP<br />Allows cross domain Ajax requests<br />SOA<br />SOAP<br />XML Based<br />Strongly typed<br />WSDL dependant<br />REST<br />Stateless<br />Cacheable<br />Code On Demand<br />Client and Server are unaware of each other’s state<br />Layered System<br />Uniform Interface<br />Service may be described through SMD, WSDL, WADL or not at all<br />
  6. 6. What is RPC?<br />Remote Procedure Call.<br />Allows to access server-side/inter-process operations from a client through a well-defined protocol.<br />Examples: COBRA, XML-RPC, JSON-RPC, DCOM, RMI<br />Client is tightly coupled with the server<br />
  7. 7. JSON-RPC<br />Request/Response model<br />Request<br />Notification<br />Response<br />Error<br />Batch operations<br />Advantages<br />Lightweight<br />JSON-Schemas can be extended to validate specific message<br />Not bound to HTTP by the specification, but might be used with it<br />Can be natively serialized from within JavaScript<br />Service discovery can be achieved through SMD or WADL<br />Disadvantages<br />Procedural<br />The web service's methods grow linearly with the number of client request types<br />Not bound to a URI<br />Conclusion<br />Fits for low resources environment (embedded devices)<br />Does not fit for rapidly growing web services<br />Does not fit for web services operating on many entities unless the web service is an HTTP service<br />
  8. 8. JSON-RPC Examples<br />A Notification:<br />{     ”jsonrpc”: ”2.0”,     ”method”: ”update”,     ”params”: [1,2,3,4,5] } <br />
  9. 9. JSON-RPC Examples<br />A Request<br />{     ”jsonrpc”: ”2.0”,     ”method”: ”subtract”,     ”params”: {                    ”subtrahend”: 23,                    ”minuend”: 42                },     ”id”: 3 } <br />
  10. 10. JSON-RPC Examples<br />An Error:<br />{<br /> ”jsonrpc”: ”2.0”,<br /> ”error”: {<br /> ”code”: -32601, <br /> ”message”: ”Procedure not found.”<br /> },<br /> ”id”: ”1”<br />} <br />
  11. 11. JSON-RPC Examples<br />Batch Request:<br />[{<br /> ”jsonrpc”: ”2.0”, <br /> ”method”: ”sum”,<br /> ”params”: [1,2,4],<br /> ”id”: ”1”<br /> },{<br /> ”jsonrpc”: ”2.0”,<br /> ”method”: ”notify_hello”,<br /> ”params”: [7]<br /> },{<br /> ”jsonrpc”: ”2.0”,<br /> ”method”: ”subtract”,<br /> ”params”: [42,23],<br /> ”id”: ”2”<br /> }<br />]<br />
  12. 12. JSON-RPC Examples<br />Batch Response:<br />[<br /> {      ”jsonrpc”:”2.0”,      ”result”:7,      ”id”:”1” }, {      ”jsonrpc”:”2.0”,      ”result”:19,      ”id”:”2  <br />  },{      ”jsonrpc”:”2.0”,      ”error”:{         ”code”:-32601,         ”message”:” Procedure not found.”      },      ”id”:”5”<br /> },<br />]<br />
  13. 13. XML-RPC<br />Request/Response model<br />Request<br />Response<br />Error<br />Advantages<br />Bound to a URI<br />Can represent hierarchical data in a readable way<br />XSLT & XPath<br />Can be validated through XML-Schema or DTD<br />Disadvantages<br />Procedural<br />The web service's methods grow linearly with the number of client request types<br />Bound to HTTP<br />Only appropriate for the web<br />Hard to parse<br />Heavy payload<br />Consumes a lot of memory<br />No bulk operations<br />Conclusion<br />Does not fit for rapidly growing web services<br />Does not fit for embedded devices<br />Fits to represent hierarchical data<br />
  14. 14. XML-RPC Examples<br />Request: <br /><?xml version=”1.0”?><methodCall><br /> <methodName>examples.getStateName</methodName>            <params>                <param>                    <value>                        <i4>40</i4>                    </value>                </param>            </params></methodCall><br />
  15. 15. XML-RPC Examples<br />Response:<br /><?xml version=”1.0”?>    <methodResponse>        <params><param>                <value>                    <string>South Dakota</string>                </value>            </param>        </params>    </methodResponse><br />
  16. 16. XML-RPC Examples<br />Error:<br /><?xml version=”1.0”?>    <methodResponse>        <fault>            <value>                <struct>                    <member><name>faultCode</name>                        <value><int>4</int></value>                    </member>                    <member>                        <name>faultString</name>                        <value><string>Too many parameters.</string></value>                    </member>                </struct>            </value>    </fault></methodResponse><br />
  17. 17. What is SOA?<br />Service Oriented Architecture.<br />Allows to access server-side from a client through a well-defined protocol.<br />Examples: SOAP, REST, SOAPjr<br />Client does not have to be tightly coupled with the server.<br />Unlike RPC based web services which usually are not discoverable there is a way to discover services in SOA based web service.<br />
  18. 18. Service Description Standards<br />WSDL<br />Web Services Description Language<br />Well known<br />Verbose<br />Uses XML<br />Not human readable<br />Used by WCF<br />Feels natural for SOAP services<br />Endorsed by Microsoft<br />WSDL 1.1 supports only GET and POST requests<br />
  19. 19. Service Description Standards - Continued<br />WADL<br />Web Application Description Language<br />Not very well known<br />A bit less verbose than WSDL<br />Uses XML<br />A bit more human readable<br />Used by Java<br />Feels natural for REST Services<br />Endorsed by Sun Microsystems<br />
  20. 20. Service Description Standards - Continued<br />SMD<br />Service Mapping Description <br />Working Draft status<br />Less verbose<br />Uses JSON<br />Human readable<br />Used by the Dojo Toolkit<br />Not stable<br />Endorsed by Sitepen and The Dojo Foundation<br />
  21. 21. WSDL Example<br /><description> <types>    <schema>        <element name=”myMethod”>            <complexType>                <sequence>                    <element name=”x” type=”xsd:int”/>                    <element name=”y” type=”xsd:float”/>                </sequence>            </complexType>        </element>        <element name=”myMethodResponse”>            <complexType/>        </element>    </schema></types>…<br />
  22. 22. WSDL Example<br /> <message name=”myMethodRequest”>    <part name=”parameters” element=”myMethod”/></message><message name=”empty”>    <part name=”parameters” element=”myMethodResponse”/></message><portTypename=”PT”>    <operation name=”myMethod”>        <input message=”myMethodRequest”/>        <output message=”empty”/>    </operation></portType><br />Hold your horses, there’s more…<br />
  23. 23. WSDL Example<br /> <binding interface=”...”>        <!-- The binding of a protocol to an interface, same structure              as the interface element -->     </binding>     <service interface=”...”>        <!-- Defines the actual addresses of the bindings, as in 1.1,              but now ”ports” are called ”endpoints” -->        <endpoint binding=”...” address=”...”/>     </service></description><br />And it goes on and on… I actually tried to keep it short.<br />
  24. 24. Have I already mentioned that WSDL is verbose?<br />
  25. 25. SMD Example<br />{<br /> target:”/jsonrpc”, // this defines the URL to connect for the services transport:”POST”, // We will use POST as the transport envelope:”JSON-RPC-1.2”, // We will use JSON-RPC SMDVersion:”2.0”, services: {   add : { // define a service to add two numbers   parameters: [     {name:”a”,type:”number”}, // define the two parameters     {name:”b”,type:”number”}],   returns:{”type”:”number”} }, foo : {   // nothing is required to be defined, all definitions are optional.   //This service has nothing defined so it can take any parameters   //and return any value }, getNews : {   // we can redefine the target, transport, and envelope for specific services   target: ”/newsSearch”,   transport: ”GET”,   envelope: ”URL”,   parameters:[ { name: ”query”, type: ”string”, optional: false, default: ”” } ],   returns:{type:”array”} }<br />}<br />
  26. 26. But that’s not even a standard yet<br />
  27. 27. WADL Example<br /><application xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance      xsi:schemaLocation=http://research.sun.com/wadl/2006/10 wadl.xsd      xmlns:xsd=http://www.w3.org/2001/XMLSchema      xmlns:ex=http://www.example.org/types      xmlns=http://research.sun.com/wadl/2006/10>      <grammars>        <include href=ticker.xsd/>      </grammars>…<br />
  28. 28. WADL Example<br /><resources base=http://www.example.org/services/>         <resource path=getStockQuote>            <method name=GET>                 <request>                   <paramname=symbol style=query type=xsd:string/>                 </request>                <response>                   <representation mediaType=application/xml                        element=ex:quoteResponse/>                    <fault status=400 mediaType=application/xml                        element=ex:error/>                 </response>           </method>        </resource>    <! many other URIs>     </resources></application><br />
  29. 29. Looks a bit better, but it’s not widely adopted.<br />So what do we do?<br />
  30. 30. Service Discovery - Summery<br />Use whatever your platform allows you (WSDL for .NET, WADL for JAVA and SMD for Dojo)<br />Don’t allow service discovery – this may happen if:<br /> You intend the web service to be used only internally.<br />You are not using a tool to generate a proxy.<br />You intend the web service to always be on a fixed IP<br />Allow gradual service discovery<br />Each call will expose different operations that are available<br />Occasionally adds an unnecessary overhead<br />Can be solved using a parameter in the request to turn off and on gradual discovery<br />Only exposes a part of the service that is related to the call<br />
  31. 31. Service Discovery – WS-Discovery<br />Web Services Dynamic Discovery<br />A multicast discovery protocol that allows to locate web services over local network<br />Uses web services standards like SOAP<br />
  32. 32. SOAP<br />Simple Object Access Protocol<br />Message model:<br />Request<br />Response<br />Error<br />Advantages:<br />Type safe<br />WCF support feels more natural<br />More appropriate for event driven use cases<br />Services are discoverable<br />Can carry any kind of data<br />Disadvantages:<br />Verbose<br />WSDL<br />Heavy payload, especially over HTTP<br />Does not fit for streaming<br />HTTP already knows how to handle requests/responses<br />Accessing from a non-WCF client is nearly impossible<br />Uses XML for the envelope, which makes the possibility to send any kind of data pretty much obsolete<br />Conclusion<br />Major pain in the ass<br />
  33. 33. SOAP Example<br />SOAP Request<br />POST /InStock HTTP/1.1Host: www.example.orgContent-Type: application/soap+xml; charset=utf-8Content-Length: nnn<?xml version=”1.0”?><soap:Envelopexmlns:soap=”http://www.w3.org/2001/12/soap-envelope” soap:encodingStyle=”http://www.w3.org/2001/12/soap-encoding”><soap:Bodyxmlns:m=”http://www.example.org/stock”>  <m:GetStockPrice>    <m:StockName>IBM</m:StockName>  </m:GetStockPrice> </soap:Body></soap:Envelope><br />
  34. 34. SOAP Example<br />SOAP Response<br />HTTP/1.1 200 OKContent-Type: application/soap+xml; charset=utf-8Content-Length: nnn<?xml version=”1.0”?><soap:Envelopexmlns:soap=”http://www.w3.org/2001/12/soap-envelope” soap:encodingStyle=”http://www.w3.org/2001/12/soap-encoding”> <soap:Bodyxmlns:m=”http://www.example.org/stock”>  <m:GetStockPriceResponse>    <m:Price>34.5</m:Price>  </m:GetStockPriceResponse> </soap:Body></soap:Envelope><br />
  35. 35. Oh dear, take this abomination away<br />
  36. 36. REST<br />Representational State Transfer<br />Constrains<br />Stateless<br />Uniform Interface<br />Layered System<br />Cacheable<br />Code On Demand (Optional)<br />Guiding principles<br />Identification of resources<br />Manipulation of resources through these representations<br />Self-descriptive messages<br />Hypermedia As The Engine Of Application State (HATEOAS)<br />
  37. 37. REST is an architecture, not a standard.<br />This means we relay on whatever application protocol we have to use.<br />
  38. 38. REST is not bound to HTTP but feels natural with HTTP<br />
  39. 39. REST – Web Services<br />A RESTful web service is implemented over HTTP<br />URI – Unique Resource Identifier<br />Provides unified interface to access resources.<br />/Foos/ - A collection of resources<br />/Foos/[Identifier]/ - An object instance inside a collection<br />Uses HTTP Verbs<br />GET<br />Used to get content, no side effects are guaranteed<br />POST<br />Used to update content<br />PUT<br />Used to create/replace content<br />DELETE<br />Used to delete content<br />OPTIONS<br />HEAD<br />Discoverable through OPTIONS and HEAD Verbs<br />Allows request to refer to different representation through MIME-types<br />Responds with HTTP Status Codes<br />
  40. 40. Hands On – A Simple RESTful Web Service using ASP.NET MVC<br />We’re going to write a simple blog application<br />Why ASP.NET MVC?<br />Easy to implement<br />Appropriate for small services<br />What are our entities?<br />A Post<br />A Tag<br />A Comment<br />A User<br />Both tags and comments entities are sub-entities of a post<br />Both posts and comments entities are sub-entities of a user<br />
  41. 41. Hands On – A Simple RESTful Web Service using ASP.NET MVC<br />The URI Scheme:<br />To represent a resource collection of posts: /Posts/<br />To represent a specific post resource: /Posts/[id]/<br />To represent a resource collection of comments of a specific post resource: /Posts/[id]/Comments/<br />To represent a specific comment resource of a specific post resource: /Posts/[id]/Comments/[commentId]<br />Well, you got the idea, right?<br />How to implement:<br />Go to your Global.asax file<br />Define the routes<br />Use constrains to avoid routes clashes<br />Use constrains to define allowed HTTP Verbs<br />
  42. 42. Hands On – A Simple RESTful Web Service using ASP.NET MVC<br />Implementing the URI Scheme:<br />publicstaticvoidRegisterRoutes(RouteCollection routes) { // …<br />routes.MapRoute(”DeleteComment”, ”Comments/{commentId}/”,<br />new { controller = ”Comments”, action = ”Delete” },<br />new { commentId = @”d+”, httpMethod = newHttpMethodConstraint(”DELETE”) });<br />routes.MapRoute(”EditComment”, ”Comments/{commentId}/”,<br />new { controller = ”Comments”, action = ”Edit” },<br />new { commentId = @”d+”, httpMethod = newHttpMethodConstraint(”PUT”) });  routes.MapRoute(”AddPostComment”, ”Posts/{postId}/Comments/”,<br />new { controller = ”Comments”, action = ”Add” },<br />new { postId = @”d+”, httpMethod = newHttpMethodConstraint(”POST”) });<br /> routes.MapRoute(”PostComment”, ”Posts/{postId}/Comments/{commentId}/”,<br />new { controller = ”Comments”, action = ”PostComment” },<br />new { postId = @”d+”, commentId = @”d+”, httpMethod = newHttpMethodConstraint(”GET”) });<br /> routes.MapRoute(”PostComments”, ”Posts/{postId}/Comments/”,<br />new { controller = ”Comments”, action = ”PostComments” },<br />new { postId = @”d+”, httpMethod = newHttpMethodConstraint(”GET”) });<br />routes.MapRoute(”Comment”, ”Comments/{commentId}”,<br />new { controller = ”Comments”, action = ”Comment” },<br />new { commentId = @”d+”, httpMethod = newHttpMethodConstraint(”GET”) });  routes.MapRoute(”UserComments”, ”Users/{user}/Comments/”,<br />new { controller = ”Comments”, action = ”UserComments” },<br />new { user = @”^[a-zA-Z0-9_]*$”, httpMethod = newHttpMethodConstraint(”GET”) });  routes.MapRoute(”UserComment”, ”Users/{user}/Comments/{commentId}/”, <br />new { controller = ”Comments”, action = ”UserComment” },<br />  new { user = @”^[a-zA-Z0-9_]*$”, httpMethod = newHttpMethodConstraint(”GET”) }); // …}<br />
  43. 43. Hands On – A Simple RESTful Web Service using ASP.NET MVC<br />The URI Scheme - Explained:<br />Defines a route that maps to an action that allows to delete a comment<br />commentId is limited to integral values (for more information, read about Regular Expressions)<br />You can reach to this action only by a DELETE request<br />publicstaticvoidRegisterRoutes(RouteCollection routes) { // …<br />routes.MapRoute(”DeleteComment”, ”Comments/{commentId}/”,<br />new { controller = ”Comments”, action = ”Delete” },<br />new { commentId = @”d+”, httpMethod = newHttpMethodConstraint(”DELETE”) }); // …}<br />
  44. 44. Hands On – A Simple RESTful Web Service using ASP.NET MVC<br />The URI Scheme - Explained:<br />Defines a route that maps to an action that allows to edit a comment<br />commentId is limited to integral values<br />You can reach to this action only by a PUT request<br />Why are we using PUT instead of POST?<br />The Comments/{commentId}/ URI refers to a specific item in a collection, since we are not sending only what is updated in our request we prefer to replace the resource instead of updating it<br />publicstaticvoidRegisterRoutes(RouteCollection routes) { // …<br />routes.MapRoute(”EditComment”, ”Comments/{commentId}/”,<br />new { controller = ”Comments”, action = ”Edit” },<br />new { commentId = @”d+”, httpMethod = newHttpMethodConstraint(”PUT”) }); // …}<br />
  45. 45. Hands On – A Simple RESTful Web Service using ASP.NET MVC<br />The URI Scheme - Explained:<br />Defines a route that maps to an action that allows to add a comment to a post<br />postId is limited to integral values<br />You can reach to this action only by a POST request<br />Why are we using POST instead of PUT?<br />The Posts/{postId}/Comments/ URI refers to a collection, PUT will replace all of our existing comments with a new one<br />POST only updates a resource, so a new comment is added to our existing comments collection<br />publicstaticvoidRegisterRoutes(RouteCollection routes) { // …<br />routes.MapRoute(”AddPostComment”, ”Posts/{postId}/Comments/”,<br />new { controller = ”Comments”, action = ”Add” },<br />new { postId = @”d+”, httpMethod = newHttpMethodConstraint(”POST”) });<br /> // …}<br />
  46. 46. Hands On – A Simple RESTful Web Service using ASP.NET MVC<br />The URI Scheme - Explained:<br />Those are the routes we are familiar with, the ones that use GET requests and most of the time return HTML<br />In this example, this route maps to an action that allows us to access a specific comment on a post<br />publicstaticvoidRegisterRoutes(RouteCollection routes) { // …<br /> routes.MapRoute(”PostComment”, ”Posts/{postId}/Comments/{commentId}/”,<br />new { controller = ”Comments”, action = ”PostComment” },<br />new { postId = @”d+”, commentId = @”d+”, httpMethod = newHttpMethodConstraint(”GET”) }); // …}<br />
  47. 47. Hands On – A Simple RESTful Web Service using ASP.NET MVC<br />The comments controller:<br />Now that our routes are defined we know what actions we need to implement<br />All actions should use valid HTTP Status Codes<br />All actions must be able to represent themselves in different formats (JSON, XML, HTML, RSS etc.)<br />How to implement:<br />Create a new controller called CommentsController<br />Follow your routing scheme and create the needed actions<br />Create a new action result decorator that allows you to select the HTTP Status code<br />Use attributes to define allowed content types and HTTP Verbs<br />
  48. 48. Hands On – A Simple RESTful Web Service using ASP.NET MVC<br />Implementing the comments controller:<br />publicclassCommentsController : Controller {         // …        [AcceptVerbs(HttpVerbs.Delete)] // Or [HttpDelete] if you are using MVC 2 and above publicActionResult Delete(intcommentId)         {              // Delete operation occurs here returnnewHttpResponseCodeActionResultDecorator(204); // 204 No content }         [AcceptVerbs(HttpVerbs.Post)] // Or [HttpPost] if you are using MVC 2 and above publicActionResult Add(intpostId)         {         // Create a new comment that belongs to a post with a post Id of postIdreturnJson(new {CommentId = newCommentId}) ;         }         [AcceptVerbs(HttpVerbs.Put)] // Or [HttpPut] if you are using MVC 2 and above publicActionResult Add(intcommentId)         {             // Create a new comment that belongs to a post with a post Id of postIdreturnnewHttpResponseCodeActionResultDecorator(201, Json(new {CommentId = newCommentId}) ); // 201 - Created }         // …}<br />
  49. 49. Hands On – A Simple RESTful Web Service using ASP.NET MVC<br />Implementing the HttpResponseCodeActionResultDecorator:<br />publicclassHttpResponseCodeActionResultDecorator : ActionResult{         privatereadonlyintstatusCode;         privatereadonlyActionResultactionResult;         publicHttpResponseCodeActionResultDecorator(intstatusCode)         {             this.statusCode = statusCode;         }         publicHttpResponseCodeActionResultDecorator(intstatusCode, ActionResultactionResult)             : this(statusCode)         {             this.actionResult = actionResult;         }         publicoverridevoidExecuteResult(ControllerContext context)         {             context.HttpContext.Response.StatusCode = statusCode;<br />if(actionResult != null) <br />             actionResult.ExecuteResult(context);         } }<br />
  50. 50. Hands On – A Simple RESTful Web Service using ASP.NET MVC<br />Resources with multiple representations:<br />Our list of posts should be representable through RSS and Atom feeds but also display them as HTML.<br />An HTTP request containing an Accept header with a value other than application/rss+xml, application/atom+xml, text/html or application/xhtml+xml will return the HTTP response code “406 Not Acceptable”.<br />The implementation is not trivial<br />An example of an implementation can be seen here: http://aleembawany.com/2009/03/27/aspnet-mvc-create-easy-rest-api-with-json-and-xmlhowever it does not conform to HTTP due to the fact that it will either return 404 or the default view.<br />How to implement:<br />Create an ActionResult class that inspects the request’s Accept header and executes the requested ActionResult or return 406 Not Acceptable<br />
  51. 51. Hands On – A Simple RESTful Web Service using ASP.NET MVC<br />Implementing the AcceptTypeResult:<br />publicclassAcceptTypeResult : ActionResult{         privatereadonlyint?successStatusCode;<br /> private readonly object result;<br />        publicAcceptTypeResult(objectresult)         {            this.result = result;        }<br />        publicAcceptTypeResult(intsuccessStatusCode, object result)<br /> : this(result)         {            this.successStatusCode = successStatusCode;        }        publicoverridevoidExecuteResult(ControllerContext context)         {<br />var request = context.HttpContext.Request;<br />            context.HttpContext.Response.StatusCode = successStatusCode ?? 200;<br />if (request.AcceptTypes.Contains(“application/rss+xml”))<br />Rss(result).ExecuteResult(context);<br />else if (request.AcceptTypes.Contains(“application/atom+xml”))<br />Atom(result).ExecuteResult(context);<br />else if (request.AcceptTypes.Contains(“application/xhtml+xml”) || request.AcceptTypes.Contains(“text/html”))<br />View(result).ExecuteResult(context);<br />else<br />            context.HttpContext.Response.StatusCode= 406;        } }<br />
  52. 52. Bibliography<br />http://www.infoq.com/articles/webber-rest-workflow<br />http://www.infoq.com/articles/mark-baker-hypermedia<br />http://barelyenough.org/blog/2007/05/hypermedia-as-the-engine-of-application-state/<br />http://third-bit.com/blog/archives/1746.html<br />http://www.learnxpress.com/create-restful-wcf-service-api-step-by-step-guide.html<br />http://www.infoq.com/articles/rest-soap-when-to-use-each<br />http://www.prescod.net/rest/<br />http://www.prescod.net/rest/rest_vs_soap_overview/<br />http://www.devx.com/DevX/Article/8155<br />http://tomayko.com/writings/rest-to-my-wife<br />http://en.wikipedia.org/wiki/Representational_State_Transfer<br />http://en.wikipedia.org/wiki/HATEOAS<br />http://en.wikipedia.org/wiki/SOAP<br />http://en.wikipedia.org/wiki/SOA<br />http://en.wikipedia.org/wiki/Web_Application_Description_Language<br />http://en.wikipedia.org/wiki/WSDL<br />http://en.wikipedia.org/wiki/JSON-RPC<br />http://en.wikipedia.org/wiki/XML-RPC<br />http://www.sitepen.com/blog/2008/03/19/pluggable-web-services-with-smd/<br />
  53. 53. For further reading<br />http://jcalcote.wordpress.com/2009/08/10/restful-authentication/<br />http://jcalcote.wordpress.com/2009/08/06/restful-transactions/<br />http://www.artima.com/lejava/articles/why_put_and_delete.html<br />http://www.markbaker.ca/2002/08/HowContainersWork/<br />http://www.w3.org/Protocols/rfc2616/rfc2616.html<br />http://www.elharo.com/blog/software-development/web-development/2005/12/08/post-vs-put/<br />http://blog.whatfettle.com/2006/08/14/so-which-crud-operation-is-http-post/<br />http://cafe.elharo.com/web/why-rest-failed/<br />http://en.wikipedia.org/wiki/Windows_Communication_Foundation<br />
  54. 54. Thank you for listening!<br />

×