Non-CRUD operations in a RESTful service

前端 未结 4 1798
梦谈多话
梦谈多话 2020-12-02 05:13

What is the \"RESTful\" way of adding non-CRUD operations to a RESTful service? Say I have a service that allows CRUD access to records like this:

GET /api/         


        
相关标签:
4条回答
  • 2020-12-02 05:42

    The RESTful way as I understand it is that you don't need new HTTP verbs, there's a noun somewhere that will mean what you need to do.

    Purchase a car? Well isn't that

    POST /api/order
    
    0 讨论(0)
  • 2020-12-02 05:46

    Think about purchase as a business entity or a resource in RESTful dictionary. That being said, making a purchase is actually creating a new resource. So:

    POST /api/purchase
    

    will place a new order. The details (user, car, etc.) should be referenced by id (or URI) inside the contents sent to this address.

    It doesn't matter that ordering a car is not just a simple INSERT in the database. Actually, REST is not about exposing your database tables as CRUD operations. From logical point of view you are creating an order (purchase), but the server side is free to do as many processing steps as it wants.

    You can even abuse HTTP protocol even further. Use Location header to return a link to newly created order, carefully choose HTTP response codes to inform users about problems (server- or client-side), etc.

    0 讨论(0)
  • 2020-12-02 06:07

    What you're really doing is creating an order. So add another resource for order and post and put there during the order process.

    Think in terms of resources rather than method calls.

    To finalize the order you'd probably POST /api/order//complete or something similar.

    0 讨论(0)
  • 2020-12-02 06:09

    I feel REST APIs help in lot more ways than just providing semantics. So cannot choose RPC style just because of some calls that seem to make more sense in RPC operation style. Example is the google maps api to find directions between two places. Looks like this: http://maps.googleapis.com/maps/api/directions/json?origin=Jakkur&destination=Hebbal

    They could have called it "findDirections" (verb) and treated it as an operation. Rather they made "direction" (noun) as a resource and treated finding directions as a query on the directions resource (Though internally there could be no real resource called direction and it could be implemented by business logic to find directions based on params).

    0 讨论(0)
提交回复
热议问题