On 7/20/2011 1:04 PM, Joe Hourcle wrote: > On Jul 19, 2011, at 11:33 AM, Ralph LeVan wrote: > >> Where at all possible, I want a true REST interface. I recognize that >> sometimes you need to use POST to send data, but I've found it very helpful >> to be able to craft URLs that can be shared that contain a complete request. > But there's more than just the URL that's used in REST. As it uses > HTTP, you could vary the response based on the Accept-Language or > Accept headers. While that is pure REST, I find it very difficult to debug, and also very difficult to then have a unified architecture for browsers as well as non-browser software clients -- since you cant' really control what accept headers a browser sends (and sometimes you DO want a non-HTML response to a browser -- download in EndNote format for instance), and most browsers can't send PUT/DELETE either. The best compromise seems to having equivalents for everything that can be expressed in a GET/POST with standard headers. For instance, the Rails framework will respect Accept headers for content-negotiation if sent, but you can ALSO use elements in the URL path instead: GET /foo with Accept header application/xml is equivalent to: GET /foo.xml And likewise, the Rails framework provides "magic query" params that let you express PUT/DELETE as a POST. (This isn't perfect, because PUT/DELETE _are_ supposed to be idempotent, whereas POST is not neccesarily. But PUT/DELETE are _not_ 'safe', and GET is 'safe', so it's not safe to use GET to represent a PUT/DELETE). PUT /foo is equivalent to POST /foo with key/value _method=PUT included in form-encoded body But even that kind of assumes that the body will be form-encoded, whereas with 'pure REST' it's often convenient to have it be something else (like XML), but then there's no clear way to send that _method=PUT. It gets complicated. But I think trying for pure REST just for the sake of purity ends up making things more complicated, including making your application code much more complicated, which serves nobody. Even this kind of modified "pure REST but with simulation through GET/POST without relying on request headers", like Rails does, kind of requires a framework like Rails to do it for you to keep from getting out of hand. I think we just do the best we can, keep in mind the principles/goals of REST, rather than any particular picky rules, try to get as close to them as you can without having to make your application code become monstrous (and hard to understand for the developer/debugger). Jonathan