"Mr. Burke" lol...my kid's friends don't even call me that. :) Thanks for the writeup.
On 2/28/2014 9:14 AM, J Coder wrote: > Mr. Burke and I had a conversation that stemmed from this question but > it never made it's way onto the mailing list. I've summarized the > discussion and I'm posting it here so others can benefit from his wisdom. > > J > > ------------------------------------------------------------------------------- > > From: Coder > > I do have a follow up question if you have a few more moments. If not, I > understand. I don't want to monopolize too much of your time. > >> I'm saying that GET /cars/honda would return a reprsentation that had >> links to the actions. Then the client knows which URL to invoke from >> the representation of the car instead of having to know the URL scheme. > > This makes sense, but I have a question about this approach. Since this > saves the client from needing to know the URL scheme beyond the basic > resource retrieval, I have to assume that the same concept extends to > required parameters and possible values, otherwise, saving the client > from needing to know the scheme isn't 'full serve'. > > So, given this URL that would have come back as a copy action from the > original GET /file/{file_id}: > >> POST /file/{file_id}/copy >> Content-Type: application/json >> >> { >> "from" : "dir1", >> "to" : "dir2" >> } > > Where would the information for the from and to parameters, plus the > potential dir values come from? Would those be something that would have > come back from a different call that is perhaps associated to the form > (or client interface), rather than to the individual resource that was > retrieved? Perhaps it depends on the application context? > > Thanks! > > J > > ------------------------------------------------------------------------------- > > From: Burke > >> I see. So, in your example, a representation of an assembled honda might be >> returned by a call to POST /cars/honda/assemble? > > I'm saying that GET /cars/honda would return a reprsentation that had > links to the actions. Then the client knows which URL to invoke from the > representation of the car instead of having to know the URL scheme. > >> In my case, I want to perform a file copy based on a file ID (internal >> representation), so I might do a call like POST >> /file/{file_id}/copy?from=dir1&to=dir2 and the result might be: > > Query parameters should be attributes of a resource only, not parameters > for an action. Parameters for an action should be encapsulated in a > representation: > > POST /file/{file_id}/copy > Content-Type: application/json > > { > "from" : "dir1", > "to" : "dir2" > } > > Response: > > 201 > Location: /file/new-copy-id > > The above doesn't have to be json. Form params are fine too. > > URLs should always point to something that is linkable. In your example, > /file/{file_id}/copy?from=dir1&to=dir2 is not a linkable thing because > it contains parameters of an action. > >> >> { >> "file": { >> "file_id": "8477KSHIU88", >> "locations": { >> "location": [ >> { >> "name": "dir1", >> "value": "/dirs/dir1/1.2.3.txt" >> }, >> { >> "name": "dir2", >> "value": "/dirs/dir2/1.2.3.txt" >> } >> ] >> } >> } >> } >> >> This output might be the same as a call to GET /file/{file_id} >> >> Am I getting the general idea? > > You don't have to return the result, just a URL to it if you've created > a new resource. Not sure I understand your example enough to know if you > have. > > Honestly though, IMO, just do what's simplest to both implement and for > clients to consume. Just stay away from adding new HTTP methods or > embedding actions within Query parameters (JAX-RS can only dispatch by > path). > > ------------------------------------------------------------------------------- > > From: Coder > > I see. So, in your example, a representation of an assembled honda might > be returned by a call to POST /cars/honda/assemble? In my case, I want > to perform a file copy based on a file ID (internal representation), so > I might do a call like POST /file/{file_id}/copy?from=dir1&to=dir2 and > the result might be: > { > "file": { > "file_id": "8477KSHIU88", > "locations": { > "location": [ > { > "name": "dir1", > "value": "/dirs/dir1/1.2.3.txt" > }, > { > "name": "dir2", > "value": "/dirs/dir2/1.2.3.txt" > } > ] > } > } > } > > This output might be the same as a call to GET /file/{file_id} > > Am I getting the general idea? > > J > > ------------------------------------------------------------------------------- > > From: Burke > > If you have a representation for the action, then it becomes a resource > that you could possibly link to and retrieve. It becomes even more > important to represent the action as a URL as you can then link to the > action: > > { > "car" : "honda", > links : { > "assemble" : "/cars/honda/assemble" > } > } > > The client then never has to know the URL scheme, only the data format. > > ------------------------------------------------------------------------------- > > From: Coder > > Understood. It adds no value to extend a concept if some implementations > can't make use of it. > > I struggle with the concept of putting the action in the URL because I > have a hard time opening my mind to the idea of 'an action is a > resource'. Hard for me to let go of the 'R' in URL in other words. > > If this is the defacto approach however, it makes sense to give client > developers what they expect so it remains consistent and intuitive. > > Much thanks for your time, Bill. The advice is appreciated. > > J > > ------------------------------------------------------------------------------- > > From: Burke > > I don't suggest that approach. Instead, put the action in the URL. > > i.e. > > POST /cars/honda/assemble > Content-Type: application/work-order+json > > Some clients or servers and/or their APIs might have issues dealing with > non-standard HTTP methods. Plus HTTP methods have well defined semantics > that client developers will expect to be followed. i.e. PUT/GET/DELETE > is supposed to be idempotent. > > ------------------------------------------------------------------------------- > > From: Coder > > Wonderful! Thank you very much, this is exactly what I was hoping for. I > was incorrectly assuming that the method had to be annotated with one of > the pre-defined values. I am not sold, in general, on the idea of either > treating resources as actions or as passing actions in as parameters, so > this gives a very nice option. I suppose it should have occurred to me > that I could just create a new annotation... > > Thanks, > > J > > ------------------------------------------------------------------------------- > > From: Burke > > By extension-method you mean something like PATCH? Yes, JAX-RS supports > that > > @HttpMethod("PATCH") > public @interface PATCH{} > > ------------------------------------------------------------------------------- > > From: Coder > > Can this be done? > > Similar to how WebDAV has PROPFIND, MOVE and COPY in addition to the > standard GET, POST, DELETE and such. > > If so, a pointer to an example would be much appreciated. > > > > > ----- Original Message ----- > From: J Coder <jco...@superheromail.com> > To: resteasy-users@lists.sourceforge.net > Sent: Tuesday, January 28, 2014 09:48 AM > Subject: [Resteasy-users] Can JAX-RS support an extension-method? > > Can this be done? > > Similar to how WebDAV has PROPFIND, MOVE and COPY in addition to the > standard GET, POST, DELETE and such. > > If so, a pointer to an example would be much appreciated. > > > > > > ------------------------------------------------------------------------------ > Flow-based real-time traffic analytics software. Cisco certified tool. > Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer > Customize your own dashboards, set traffic alerts and generate reports. > Network behavioral analysis & security monitoring. All-in-one tool. > http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk > > > > _______________________________________________ > Resteasy-users mailing list > Resteasy-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/resteasy-users > -- Bill Burke JBoss, a division of Red Hat http://bill.burkecentral.com ------------------------------------------------------------------------------ Flow-based real-time traffic analytics software. Cisco certified tool. Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer Customize your own dashboards, set traffic alerts and generate reports. Network behavioral analysis & security monitoring. All-in-one tool. http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk _______________________________________________ Resteasy-users mailing list Resteasy-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/resteasy-users