Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Communication Protocols And Web Services

15,634 views

Published on

Published in: Technology
  • Be the first to comment

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 />

×