<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Ruby and the Rest</title>
	<atom:link href="http://soleone.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://soleone.wordpress.com</link>
	<description></description>
	<lastBuildDate>Wed, 14 Jan 2009 04:11:18 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='soleone.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/997f7e5fcb01a33f7c2a558fe6a79b57?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Ruby and the Rest</title>
		<link>http://soleone.wordpress.com</link>
	</image>
			<item>
		<title>How to become a better Ruby programmer</title>
		<link>http://soleone.wordpress.com/2009/01/08/how-to-become-a-better-ruby-programmer/</link>
		<comments>http://soleone.wordpress.com/2009/01/08/how-to-become-a-better-ruby-programmer/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 00:49:07 +0000</pubDate>
		<dc:creator>soleone</dc:creator>
				<category><![CDATA[general programming]]></category>
		<category><![CDATA[general tips]]></category>

		<guid isPermaLink="false">http://soleone.wordpress.com/?p=36</guid>
		<description><![CDATA[1. Buy the Pickaxe and put it on the John
Idea: Know the standard library
When I got an actual copy of Programming Ruby on paper, I found myself looking into it whenever I had spare time and no computer available &#8211; usually this was mostly on the toilet.  
That way I discovered so many useful [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=soleone.wordpress.com&blog=4435851&post=36&subd=soleone&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h2>1. Buy the Pickaxe and put it on the John</h2>
<p><strong>Idea:</strong> Know the standard library</p>
<p>When I got an actual copy of <a href="http://www.pragprog.com/titles/ruby/programming-ruby">Programming Ruby</a> on paper, I found myself looking into it whenever I had spare time and no computer available &#8211; usually this was mostly on the toilet. <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>That way I discovered so many useful methods and classes in Ruby&#8217;s standard library, you won&#8217;t believe it. Often times developers tend to reinvent some functionality, just because they don&#8217;t realize it&#8217;s already provided for them. And trust me, Ruby comes with quite some distinct features out of the box.</p>
<p>So my tip is to <strong>get a good book that covers the Standard Library or print it out somehow</strong>, and have it with you whenever you have to kill time, e.g. in a bus or the bathroom (or even for 10 minutes in bed).</p>
<h2>2. Necromancer-Style: Create skeletons</h2>
<p><strong>Idea:</strong> When using a new tool or trying to implement a bigger feature, get started with just the boilerplate code</p>
<p>Often times, when I want to try out a new library, I hesitate, because of the steps necessary to get started with it. First I have to install it, and maybe some dependencies, then create a file with some boilerplate code, and sometimes also do some configuration.</p>
<p>Not until then can I really start with the actual functionality I want to try. And the worst thing is, weeks later I&#8217;d like to use the same library again in another project, can&#8217;t remember the procedure and have to do it all over again. And sometimes this keeps me from using that new library (e.g. RSpec) at all, because I can just resort to a good old tool I know (e.g. Test/Unit).</p>
<p>Another exemplification is starting a big feature, where you don&#8217;t know how to implement the actual business logic. My suggestion is, just start with something, even if it&#8217;s an empty file. And then <strong>create a test case</strong>, to tell yourself where you want to go. Remember, that you can also write empty (<em>deferred</em>) tests, which just exist to remind you of the behavior you want to realize.</p>
<p>Now when you take a break from the project, and have a <abbr title="sudden inspiration">Geistesblitz</abbr>, you can directly open the file and start typing. Believe me, this shouldn&#8217;t be underestimated!</p>
<p>Rails is an ideal role model with all it&#8217;s generators. It is an important step to get a complete application skeleton<br />
with the <code>rails</code> command, so can directly start with your business logic. And when you create a controller, it also creates a test case for you, to motivate you writing functional tests at all. Sometimes just creating that file and filling it with the necessary boilerplate seems to be too much for us (at least for me).</p>
<p>I recommend preparing the installation and initial configuration of new tools and features, and sometimes even automate this step. There are various ways to do this:</p>
<ol>
<li>You can add a snippet to TextMate (e.g. try <code>Command+N</code> in your test-folder, choose a filename, hit <code>ENTER</code>,  type <code>tc</code> and press <code>TAB</code>).</li>
<li>Maybe it&#8217;s even enough to have a file somewhere in a directory, where you can just copy and paste the configuration.</li>
<li>Ruby is also the perfect language for writing a small shell script to download a library or create necessary files.</li>
<li>You could also <a title="How to write a generator" href="http://drnicwilliams.com/2007/08/20/newgem-using-rubigen-for-generator-support/" target="_blank">write a complex generator</a> for more elaborated tasks.</li>
</ol>
<p>To sum it up: <strong>have a place where you can directly start typing your ideas</strong> without being distracted. Create <strong>file skeletons</strong>, and for more complex tasks, try to automate this step.</p>
<h2>3. Don&#8217;t be shy</h2>
<p><strong>Idea:</strong> Communicate with other people on IRC to reinforce your comprehension</p>
<p>Chatting with fellow programmers has a number of advantages:</p>
<ol>
<li>You can ask questions to Ruby experts, which you haven&#8217;t been able to solve with the API documentation or a google search. Sometimes a question can spark really interesting discussions, you weren&#8217;t able to predict.</li>
<li>When you help other people with a specific problem, oftentimes you increase your understanding in that area or see things from a different perspective. Many times when someone asks something I&#8217;m not sure of,  I open up IRB and just try it out. This lead to some new revelations, but also consolidated things I was already quite certain about. And don&#8217;t forget that your helping other people learning the language, which will keep the mutually assistence up.</li>
<li>Hanging in the different channels will possibly bring new connections: maybe you find a project you&#8217;re interested in, because some people are constantly talking about it, or you just keep talking to the same guys over again. Which brings us the the next point:</li>
<li>IRC is also a good place to meet new friends, after all everyone in <code>#ruby-lang</code> shares the same hobby, which is a good foundation, right?</li>
</ol>
<p>So I suggest to just give it a try and download an IRC Client (on OS X i recommend <a href="http://colloquy.info/">Colloquy</a>), connect to <strong>irc.freenode.net</strong>, and join <code>#ruby</code> plus <code>#ruby-lang</code> (there is also <code>#rubyonrails</code> or <code>#shoes</code> and many more specialized channels). But beware: it can get pretty addictive and distracting if you don&#8217;t watch it. <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/soleone.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/soleone.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/soleone.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/soleone.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/soleone.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/soleone.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/soleone.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/soleone.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/soleone.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/soleone.wordpress.com/36/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=soleone.wordpress.com&blog=4435851&post=36&subd=soleone&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://soleone.wordpress.com/2009/01/08/how-to-become-a-better-ruby-programmer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/64ac4afdcf405be710b07ec4a8679a74?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">soleone</media:title>
		</media:content>
	</item>
		<item>
		<title>What is REST ?</title>
		<link>http://soleone.wordpress.com/2008/08/28/what-is-rest/</link>
		<comments>http://soleone.wordpress.com/2008/08/28/what-is-rest/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 19:29:11 +0000</pubDate>
		<dc:creator>soleone</dc:creator>
				<category><![CDATA[web services]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://soleone.wordpress.com/2008/08/28/what-is-rest/</guid>
		<description><![CDATA[What it is not
Too often I have heard the term REST used in a wrong way. Sometimes people think that when they are accessing a Web Service via a simple HTTP GET and the URL, they are using REST.
For example I&#8217;ve seen stuff like this in the Axis2 documentation, where they say, that you invoke [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=soleone.wordpress.com&blog=4435851&post=1&subd=soleone&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h2>What it is not</h2>
<p>Too often I have heard the term <a title="REST" href="http://en.wikipedia.org/wiki/REST">REST</a> used in a wrong way. Sometimes people think that when they are accessing a <a title="Web Service" href="http://en.wikipedia.org/wiki/Web_service">Web Service</a> via a simple HTTP GET and the URL, they are using REST.</p>
<p>For example I&#8217;ve seen stuff like this in the <a href="http://en.wikipedia.org/wiki/Axis2">Axis2</a> documentation, where they say, that you invoke a deployed <a title="SOAP" href="http://en.wikipedia.org/wiki/SOAP">SOAP</a> service the REST way by using your browser and navigating to a certain URL:</p>
<p><strong><span style="text-decoration:underline;">http://domain.com/service-name/service-method?parameter=value</span></strong></p>
<p>This is not RESTful!</p>
<p>So a lot of times you can see services claiming having a REST interface, when in reality they only have a HTTP GET interface, which totally misses the point. <em>(Don&#8217;t get me wrong here, Axis2 actually seems to have real REST support, but the above example is not part of that!)</em></p>
<h2>Okay, so what is REST then?</h2>
<p><abbr title="Representational State Transfer">REST</abbr> uses the HTTP architecture and (usually) XML, which are basically used everywhere. It does not add a new protocol layer (like the SOAP envelope for example) on top of that. Unlike SOAP, you don&#8217;t define <em>services</em> with <em>actions</em> (methods) and <em>arguments. </em></p>
<p><em></em>Instead it&#8217;s all about <em>resources </em>and <em>representations.</em> All resources can be <em>listed</em>, <em>viewed</em>, <em>created</em>, <em>updated</em> or <em>deleted</em>. And every resource has at least one representation (think of it as rendering the raw data), for example in XML, HTML or Plaintext.</p>
<p>It is best described using an example:</p>
<h3>A bookstore example</h3>
<p>Say we have a <em>bookstore</em> where we want to <em>publish</em> books and let authors <em>upload</em> their own books.</p>
<p>So what we need to do is <strong>create</strong>, <strong>read, </strong><strong>update</strong> and <strong>delete</strong> books. (Note the 4 verbs and the noun <em>books</em> in there) This is basically what all RESTful web services do: basic <strong>CRUD</strong>ing. That&#8217;s also what databases do by the way in addition to allowing complex search queries.</p>
<p>The nice thing now is that <a href="http://en.wikipedia.org/wiki/Http">HTTP</a> already supports keywords for exactly these use cases. I guess you all know <strong>GET</strong> and <strong>POST</strong> requests. But there are also some other verbs defined like <strong>PUT</strong> and <strong>DELETE</strong> for example.</p>
<h3>Listing all items</h3>
<p>Listing resources is usually the first step for a user of the REST service to get an overview of what&#8217;s available. It is similar to viewing the items, but instead it returns all resources of a certain type. To list all books of our store we simple send a <strong>GET</strong> request to the following URL:</p>
<p><strong><span style="text-decoration:underline;">http://domain.com/books</span></strong></p>
<p>This will return a list of &lt;book&gt; elements in the HTTP response body, like this:</p>
<pre><code>&lt;books&gt;
  &lt;book&gt;
    &lt;id&gt;1&lt;/id&gt;
    &lt;title&gt;Cryptonomicon&lt;/title&gt;
    &lt;author&gt;Neal Stephenson&lt;/author&gt;
    &lt;price&gt;19.95&lt;/price&gt;
  &lt;/book&gt;
&lt;/books&gt;</code></pre>
<p>Currently there is only one book, let&#8217;s upload a new one.</p>
<h3>Creating resources</h3>
<p>To upload a book, we <strong>POST</strong> to the very same URL. The nice thing about REST is, that we reuse URLs (<em>resource</em>s) all over again, we just change the <em>verb</em> to tell the service what we want to do with it. So just send a POST request to the <em>books resource</em>:</p>
<p><strong><span style="text-decoration:underline;">http://domain.com/books</span></strong></p>
<p>As you can see there are <span style="text-decoration:underline;">no parameters supplied in the URL</span>, the actual <em>payload</em> is in the HTTP request body, like this:</p>
<pre><code>&lt;book&gt;
  &lt;title&gt;World War Z&lt;/title&gt;
  &lt;author&gt;Max Brooks&lt;/author&gt;
  &lt;price&gt;14.95&lt;/price&gt;
&lt;/book&gt;
</code></pre>
<p>Note that there&#8217;s no id-parameter supplied yet, as this is not needed, because the web service will create one when it actually stores the book in its database backend. (You as the web service author are responsible for doing this, <a title="Ruby on Rails" href="http://rubyonrails.org/">Rails</a> does it automatically)</p>
<p>Now what do we do if we want to <em>update</em> the price of a book? Let&#8217;s use 2 steps for that, to see a real world use case, and also learn some theory and vocabulary.</p>
<h3>Representations</h3>
<p>Your data is usually saved in a (relational) database. But your users need a certain <em>view</em> (a.k.a. <em>representation</em>) of this raw data. And you can represent your data not only as XML, but also as HTML, <a href="http://en.wikipedia.org/wiki/JSON">JSON</a>, <a title="Comma Separated Values" href="http://en.wikipedia.org/wiki/Comma-separated_values">CSV</a> or whatever format you need. If you want you can also support multiple formats, and let your users decide which representation of the data they want to see.</p>
<p>For this HTTP has the <strong>content-type</strong> header, which you would set to <code>application/xml</code> to get your book in XML as we need to do in our examples. <em>(</em><strong><em>Note:</em></strong><em> We needed to send this content-type for every request so far, but I haven&#8217;t mentioned it yet, to keep it simple at the beginning.)</em><br />
 </p>
<h3>Show me a resource</h3>
<p>To get a book with the ID 2, we send a GET request with the content-type header of <code>application/xml</code> to the following URL:</p>
<p><strong><span style="text-decoration:underline;">http://domain.com/books/2</span></strong></p>
<p style="padding-left:30px;"><em><span style="text-decoration:underline;">Note:</span></em><em> <span style="font-style:normal;">We could also identify our books via something more descriptive, e.g. their title, but then we have to make sure that <strong>a)</strong> each title is unique and <strong>b)</strong> the id-part of the URL is all lowercase and uses dashes instead of spaces (this is not absolutely needed, but makes the URLs much easier to read &#8211; it&#8217;s really confusing to use mixed case in URLs for the end user). An example URL for the above book would be:</span></em></p>
<p style="padding-left:30px;"><strong><span style="text-decoration:underline;">http://domain.com/books/world-war-z</span></strong></p>
<h3>Modifying the Show view</h3>
<p>In any way we get the following XML back, which is basically the same we uploaded before, but with an additional ID field, which was inserted by our backend. (<em>Note: If we would use the title as our ID, then obviously this field is not present)</em></p>
<pre><code>&lt;book&gt;
  &lt;id&gt;2&lt;/id&gt;
  &lt;title&gt;World War Z&lt;/title&gt;
  &lt;author&gt;Max Brooks&lt;/author&gt;
  &lt;price&gt;14.95&lt;/price&gt;
&lt;/book&gt;</code></pre>
<p>So lets say, we want to increase the price of the book, because it&#8217;s so good. We just set the text of the <code>&lt;price&gt;</code> element (with our XML library of choice or a simple String-replace) to our new value.</p>
<h3>Updating a resource</h3>
<p>Now that we have the updated XML representation of the book, we are ready to upload it to the server. REST uses the HTTP method <strong>PUT</strong> for updating.</p>
<p>Just send a PUT request (with the XML payload in the http-body) to the URL of this resource:</p>
<p><strong><span style="text-decoration:underline;">http://domain.com/books/2</span></strong></p>
<p>If everything went well, the server should send a HTTP status code of 200 (OK) or 201 (Created). The nice thing is that HTTP already <a title="Look at all the status codes" href="http://www.codyfauser.com/2008/7/4/rails-http-status-code-to-symbol-mapping">defines</a> all the status codes you need, so no need to reinvent the wheel. And you can always send additional status messages in the body of the response.</p>
<h3>Delete with DELETE</h3>
<p>So you think this was easy? (I hope so) Then wait till you see how we remove resources. There is a HTTP method for exactly this use case, which was not really used before REST. Just send a <strong>DELETE</strong> request to the target resource:</p>
<p><strong><span style="text-decoration:underline;">http://domain.com/books/2</span></strong></p>
<p>There you have it, same URL again, different method.</p>
<h2>Summary</h2>
<p>That is the basic architecture of a REST based web service. Basically you send one of the four HTTP request methods to a URL and put any payload directly in the HTTP body. The server sends a response with an appropriate HTTP status code and also puts any content in the body.</p>
<h2>Advanced uses</h2>
<p>Let&#8217;s say you also want to view certain chapters of a book. Usually you would think of something like this:</p>
<p><strong><span style="text-decoration:underline;">h</span></strong><strong><span style="text-decoration:underline;">ttp://domain.com/books/2?chapter=1</span></strong></p>
<p><strong><span style="font-weight:normal;">This is also the way Axis2 handles arguments to a service&#8217;s method. But doesn&#8217;t it look way better the following way:</span></strong></p>
<p><strong><span style="font-weight:normal;"><strong><span style="text-decoration:underline;">http://domain.com/books/2/chapters/1</span></strong></span></strong></p>
<p><strong><span style="font-weight:normal;"><strong><span style="font-weight:normal;">This is the concept of <em>nested resources.</em> You have a full URL (without any URL parameters) that identifies a given resource. It gets even clearer when you have an even deeper nesting than two. Let&#8217;s say we also want to view certain pages of a chapter. Compare the following:</span></strong></span></strong></p>
<p><strong><span style="font-weight:normal;"><strong><span style="font-weight:normal;"><strong><span style="text-decoration:underline;">http://domain.com/books/2?chapter=1&amp;page=2</span></strong></span></strong></span></strong></p>
<p><strong><span style="font-weight:normal;"><strong><span style="font-weight:normal;"><strong><span style="font-weight:normal;">This doesn&#8217;t make clear if we mean the 2nd page of the book or the 2nd page of a chapter. With nested resources it&#8217;s unambiguous:</span></strong></span></strong></span></strong></p>
<p><strong><span style="font-weight:normal;"><strong><span style="font-weight:normal;"><strong><span style="font-weight:normal;"><strong><span style="text-decoration:underline;">http://domain.com/books/2/chapters/1/pages/2</span></strong></span></strong></span></strong></span></strong></p>
<p><strong><span style="font-weight:normal;"><strong><span style="font-weight:normal;"><strong><span style="font-weight:normal;"><strong><span style="font-weight:normal;">It should be clear, that this returns the 2nd page of the 1st chapter of the 2nd book. <span style="text-decoration:underline;">Note</span> that we always used the <em>plural</em> version of a resource. This allows us to GET a list of all chapters using the URL:</span></strong></span></strong></span></strong></span></strong></p>
<p><strong><span style="font-weight:normal;"><strong><span style="font-weight:normal;"><strong><span style="font-weight:normal;"><strong><span style="font-weight:normal;"><span style="text-decoration:underline;"><strong>http://domain.com/books/2/chapters</strong></span></span></strong></span></strong></span></strong></span></strong></p>
<p>And it also allows us to POST new chapters to the very same URL!</p>
<h2>Advantages of the REST approach</h2>
<p>First of all I think it&#8217;s really <strong>simple</strong> (you need to have a basic understanding of HTTP though &#8211; which every web developer should have anyways). And you are <strong>reusing existing technology</strong>, instead of adding even more to the already crowded IT world. For example you can use <a href="http://en.wikipedia.org/wiki/Https">HTTPS</a> in combination with <a href="http://en.wikipedia.org/wiki/Basic_access_authentication">HTTP basic authentication</a> for security.</p>
<p>Because <a title="Service Oriented Architectures" href="http://en.wikipedia.org/wiki/Service-oriented_architecture">SOAs</a> often forward messages and act as middleware, you can make use of the lightweight <strong>HTTP redirection</strong> and <strong>referrer</strong> mechanisms.</p>
<p>All REST services have a <strong>uniform interface</strong>. Unlike SOAP you don&#8217;t really need a <abbr title="Web Service Description Language">WSDL</abbr> to see what methods are available for your service: if you know which resources are available, you know that you can GET, POST, PUT or DELETE them.</p>
<p>REST services can be <strong>invoked by the browser</strong>. When you have HTML representations, you can GET them with the browser, and you can also POST resources (e.g. as JSON). Unfortunately current browsers do not support PUT and DELETE requests from HTML forms (maybe Firefox3 does, not sure?), but I&#8217;m sure we will see these in the future.</p>
<h2>Disadvantages</h2>
<p>As REST uses the <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</a> approach, it is sometimes <strong>not easy to implement certain service designs</strong>. For example a calculator in SOAP style would have <em>add()</em> and <em>multiply()</em> methods with 2 (or more) arguments.</p>
<p>In REST you have to rely on the GET, POST, PUT and DELETE methods, so at first this problem might seem untackable. But with a different way of thinking, it could be realized like this: You have <em>sum</em> and <em>product</em> resource, which you will GET for different arguments, for example:</p>
<p><strong><span style="text-decoration:underline;">http://domain.com/calculator/sum/1/2</span></strong></p>
<p>Which simply return <code>3</code> in the body. You could always use dynamic number of arguments like the following:</p>
<p><strong><span style="text-decoration:underline;">http://domain.com/calculator/product/1/2/3/4</span></strong></p>
<p>And this would return <code>24</code> and a status code of 200 (ok).</p>
<h2>Additional Reading</h2>
<p>There&#8217;s a lot more to REST than I could cover in one mere article (for example <em>caching</em>). Whole books can be written about RESTful design (somehow I know only one). To get started here are some links I found helpful:</p>
<ul>
<li><a href="http://tomayko.com/writings/rest-to-my-wife">How I explained REST to my wife </a>(Simple words, but yet helpful for the big picture)</li>
<li><a title="Chapter 5 about REST from his dissertation" href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm">The original dissertation by Roy Fielding</a> (Who defined the term REST)</li>
<li><a title="PDFs in english, german and spanish" href="http://www.b-simple.de/documents">RESTful Rails development</a> (A short and free ebook showing Rails&#8217; REST support)</li>
<li><a title="See what wikipedia has to say about REST" href="http://en.wikipedia.org/wiki/Representational_State_Transfer">Wikipedia article about REST</a> (Interesting read and a whole bunch of more links)</li>
</ul>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/soleone.wordpress.com/1/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/soleone.wordpress.com/1/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/soleone.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/soleone.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/soleone.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/soleone.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/soleone.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/soleone.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/soleone.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/soleone.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/soleone.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/soleone.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=soleone.wordpress.com&blog=4435851&post=1&subd=soleone&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://soleone.wordpress.com/2008/08/28/what-is-rest/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/64ac4afdcf405be710b07ec4a8679a74?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">soleone</media:title>
		</media:content>
	</item>
	</channel>
</rss>