{"id":130,"date":"2008-11-01T23:51:57","date_gmt":"2008-11-02T03:51:57","guid":{"rendered":"http:\/\/steve.vinoski.net\/blog\/?p=130"},"modified":"2008-11-01T23:51:57","modified_gmt":"2008-11-02T03:51:57","slug":"restful-web-services-development-checklist","status":"publish","type":"post","link":"https:\/\/steve.vinoski.net\/blog\/2008\/11\/01\/restful-web-services-development-checklist\/","title":{"rendered":"RESTful Web Services Development Checklist"},"content":{"rendered":"<p>My Nov.\/Dec. <a href=\"http:\/\/www.computer.org\/internet\">Internet Computing<\/a> column is now available. It&#8217;s entitled <em>&#8220;<a href=\"\/blog\/internet-computing-columns\/#2008-6\">RESTful Web Services Development Checklist<\/a>&#8220;<\/em> and as its name implies, it covers some of the primary areas developers need to focus on to write good RESTful web services. These areas are:<\/p>\n<ul>\n<li>Resources and their URIs<\/li>\n<li>Applications and Hypermedia<\/li>\n<li>Representations and Media Types<\/li>\n<li>Methods<\/li>\n<li>Conditional <code>GET<\/code><\/li>\n<\/ul>\n<p>Regarding the &#8220;Applications and Hypermedia&#8221; area, I feel <a href=\"http:\/\/roy.gbiv.com\/untangled\/2008\/rest-apis-must-be-hypertext-driven\">Roy Fielding&#8217;s pain<\/a> that many efforts labeled as being RESTful seem to completely ignore the hypermedia constraint. I believe many developers tend to miss this constraint because they&#8217;re so used to using libraries and frameworks that offer lots of entry points, and having knowledge of those entry points in the client normally isn&#8217;t that bad since the client and library\/framework are tightly coupled into the same address space anyway. In a distributed system, though, this definitely does not hold true; when the client knows a bunch of entry points into the service, it ties the client to that service and inhibits their independent evolution.<\/p>\n<p>Anyway, please read the column and let me know what you think, and thanks again to <a href=\"http:\/\/www.innoq.com\/blog\/st\/\">Stefan Tilkov<\/a> for his helpful review of the draft.<\/p>\n<p>Coincidentally I also feel <a href=\"http:\/\/roy.gbiv.com\/untangled\/2008\/specialization\">Roy&#8217;s pain when it comes to writing about REST<\/a>. He states:<\/p>\n<blockquote><p><em>I don\u2019t try to tell them exactly what to do because, quite frankly, I don\u2019t have anywhere near enough knowledge of their specific context to make such a decision.<br \/>\n&#8230;<br \/>\nSo, when you find it hard to understand what I have written, please don\u2019t think of it as talking above your head or just too philosophical to be worth your time. I am writing this way because I think the subject deserves a particular form of precision. Instead, take the time to look up the terms. Think of it as an opportunity to learn something new, not because I said so, but because it will do you some personal good to better understand the depth of our field.<\/em><\/p><\/blockquote>\n<p>Exactly.<\/p>\n<p>Obviously, Roy is the ultimate REST authority, given that he defined it, so I&#8217;m not at all claiming to be anywhere near as authoritative about it as he is, yet I&#8217;ve also experienced what he says above. For example, consider this informal review of my columns I received a few months ago in a comment on someone else&#8217;s blog:<\/p>\n<blockquote><p><em>The articles of yours that I&#8217;ve read are&#8230;amorphous to me. They speak in generalities. I haven&#8217;t read an article where you sit down and write the same service using both REST and RPC and compare the two. When you speak in generalities, we can&#8217;t objectively evaluate any of the specific trade-offs between approaches&#8230; Arguments that happen at too abstract a level can&#8217;t go anywhere, because our positions aren&#8217;t specific enough for anyone to evaluate anybody else&#8217;s claims.<\/em><\/p><\/blockquote>\n<p>In other words, &#8220;since your columns don&#8217;t do my thinking and experimentation for me, they&#8217;re useless to me.&#8221; Hmm. Maybe I&#8217;m just old school, but I&#8217;d much rather understand mathematics than require someone to hold my hand while I blindly punch buttons on a calculator. In other words, as the old proverb goes, I&#8217;d much rather try to teach you to fish so you can feed yourself. As I state in this new column:<\/p>\n<blockquote><p><em>Whether developers of RESTful HTTP-based services write their code in IDEs or with simple text editors, and regardless of which programming languages they use, they must understand REST and HTTP fundamentals to succeed.<\/em><\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>My Nov.\/Dec. Internet Computing column is now available. It&#8217;s entitled &#8220;RESTful Web Services Development Checklist&#8220; and as its name implies, it covers some of the primary areas developers need to focus on to write good RESTful web services. These areas are: Resources and their URIs Applications and Hypermedia Representations and Media Types Methods Conditional GET [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14,44,25,21,43,10,7],"tags":[85,146,91],"class_list":["post-130","post","type-post","status-publish","format-standard","hentry","category-column","category-coupling","category-design","category-distributed-systems","category-http","category-rest","category-services","tag-development","tag-rest","tag-web-services"],"_links":{"self":[{"href":"https:\/\/steve.vinoski.net\/blog\/wp-json\/wp\/v2\/posts\/130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/steve.vinoski.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/steve.vinoski.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/steve.vinoski.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/steve.vinoski.net\/blog\/wp-json\/wp\/v2\/comments?post=130"}],"version-history":[{"count":18,"href":"https:\/\/steve.vinoski.net\/blog\/wp-json\/wp\/v2\/posts\/130\/revisions"}],"predecessor-version":[{"id":151,"href":"https:\/\/steve.vinoski.net\/blog\/wp-json\/wp\/v2\/posts\/130\/revisions\/151"}],"wp:attachment":[{"href":"https:\/\/steve.vinoski.net\/blog\/wp-json\/wp\/v2\/media?parent=130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/steve.vinoski.net\/blog\/wp-json\/wp\/v2\/categories?post=130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/steve.vinoski.net\/blog\/wp-json\/wp\/v2\/tags?post=130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}