[Catalyst] REST - like uri design for CRUD
Ian Docherty
catalyst at iandocherty.com
Sat Jan 26 18:57:53 GMT 2008
Thomas L. Shinnick wrote:
> <SNIP>
> One important topic in the book is that people mix 'verbs' into their =
> URIs when they shouldn't, or at least when they don't _have_ to. =
> Using the book's concepts your URIs would become
>
> 1) GET /class?pattern=3Dbreadbox
> 2) GET /class/id/1111
> 3) PUT /class/id/1111
> 4) POST /class
>
> 1) is your "/class/search" and says "let me retrieve the =
> representation/list of the items selected by searching for the given =
> pattern", where the base URI would indicate the set/list of items, and =
> the pattern is kept in the query parameters because it could be =
> anything. Note that the idea is that "GET /class" references the list =
> of all items, and you here are just qualifying that search with the =
> pattern.
>
> 2) Your "/class/id/1111/view" would be seen in strict REST as just a =
> GET of "/class/id/1111". The HTTP 'verb' GET already says give me a =
> representation of the item. Done.
>
> 3) Your "/class/id/1111/update" would become a PUT of =
> "/class/id/1111", where the new representation coming from the remote =
> client would _replace_ the old representation/data for that item. =
> This strict use of the HTTP 'PUT' verb is actually the hardest to =
> accomplish, as it assumes that the remote client can receive and =
> update a representation on the client, and then send it back using =
> PUT. It is easiest to picture this usage when the client completely =
> replaces the old representation held on the server. (see farther =
> below for why)
>
> 4) Your "/class/create" becomes a POST to "/class". This was another =
> concept brought out by the book. The matter of "who determines the =
> item's 'id'" is important. Here we assume that the _server_ will =
> determine the id of the new added item. You do a POST to the base URI =
> of the data area, and the server determines the new id, stores the =
> data into the item, and does a redirect to tell the remote client =
> where the new item is, that is, what is the new item's URI, for =
> instance "/class/id/1234".
I am just doing this now. The way I have implemented it is that an item =
is created by doing a POST to /class/create and the item is saved in the =
database. Then the browser is redirected to GET /class/id/1234 (for =
example) where the newly created item (with id 1234) can be read.
Now, this means that the client system will have a http response =
returned with 'status' '302' and 'location' '/class/id/1234' which I =
presume they will have to parse to determine the ID of the newly created =
item?
Is this correct?
>
> Why is "who determines the id" important? Because it says what HTTP =
> verb you should use to create a new item. If the server, you use POST =
> to "add another" item. (Much discussion of "that most misunderstood =
> of HTTP methods: POST" in the book) But if the remote client were to =
> determine the id, say because the id is a license plate number input =
> at the client, then strict REST would say the client should do a PUT =
> to "/class/id/STRWBYP" and the client would send the complete data for =
> the item. The server would create the item using the id 'STRWBYP" as =
> requested by the client.
>
> Creation using POST would say create a new item and tell me (the =
> client) where you (the server) put it. Creation using PUT defines =
> where to put it to the server, because the client knows what the id =
> should be.
>
> So under some designs it is possible that PUT will be used for both =
> creation of new items and update (replacement) of existing items. In =
> both these cases (under such a design) the client knows the correct id =
> for the item. =
>
> Anyway this spew was prompted by the new pedant seeing 'REST' in the =
> subject and then no mention of 'PUT', etc. The book tries to be clear =
> that it depends on both your design and the >>capabilities of the =
> client<< whether you can implement using the strict REST HTTP verb set =
> GET, PUT, and POST, or whether you must compromise on a REST-like set =
> of GET and POST. The authors discuss how to "overload POST" to effect =
> PUT-like usage, because we have to implement in the real world. But =
> they are clear about the goals of RESTful design, the problems it =
> solves, and the benefits it brings "in the real world".
>
> It looks to be very useful to consider URI design with a view towards =
> "how would I accomplish this by splitting my data objects into URI =
> addressable data that can be manipulated using the full set of HTTP =
> verbs GET, PUT, POST and HEAD. (And not putting verbs into URIs that =
> might be cached)"
>
> </spew>
> ------------------------------------------------------------------------
>
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.u=
k/
> Dev site: http://dev.catalyst.perl.org/
> =
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.scsys.co.uk/pipermail/catalyst/attachments/20080126/77f01=
77a/attachment.htm
More information about the Catalyst
mailing list