REST: Best practice for partial update of subset of collection

I am trying to understand a little bit more about the REST ways :). Let's say I have a collection of ProductTypes that one can retrive via url GET /productTypes and let's say that we can but don't have to apply any filter. So this fetches 500 records.

Now if I want to do full update of the resource I could use PUT or POST at /productTypes/123. So far so good.

If I am creating a new resource and I know the id ahead of time, I would use PUT at /productTypes/123 and return 201 otherwise for update PUT with 200.

If I do partial update of the resource I would do PUT or POST at /productTypes/123/displayOrder and return 303 indicating that some other resource has been modified.

But what if I do 1 POST sending in basically a list of Key-Value pairs of product Id and display order, and I modify 5 out of 500 records. How do I indicate now that these 5 records have changed?

What happens with GET at /productTypes now after this partial update. I read somewhere that instead of returning multiple records with this get, I should return the list links to the resources, and then fetch them one by one, as that would allow for insane caching. But still how do I indicate that 5 records have changed? Do I need to do 5 separate posts with 303, or is there different mechanism. Hope this makes sense.


I don't see anything in the spec that specifically bars you from using multiple Content-Location headers. I tested it out and Chrome's totally OK with it. It won't automatically redirect for you, but you don't want that anyway with multiple resources involved.

HTTP/1.1 303 See Other
Content-Location: /productTypes/123/displayOrder
Content-Location: /productTypes/456/displayOrder
Content-Location: /productTypes/789/displayOrder
Content-Location: /productTypes/012/displayOrder
Content-Location: /productTypes/345/displayOrder

我会这样做:

PATCH /productTypes HTTP/1.1
Content-Type: application/json

{"item":[
  {"id":"1","displayOrder":"4"},
  {"id":"2","displayOrder":"2"},
  {"id":"3","displayOrder":"1"},
  {"id":"4","displayOrder":"3"},
  {"id":"5","displayOrder":"5"}
]}


HTTP/1.1 200 OK
Content-Type: application/hal+json

{
  "_links": { "self": {"href": "/productTypes" } }
  "_embedded": {
    "item": [{
      "_links": { "self": { "href": "/productTypes/1" } },
      "displayOrder": "4"
    },
    /* 4 more entries */
    ]
  }
}
链接地址: http://www.djcxy.com/p/45368.html

上一篇: 无法触摸UIScrollView上的UITextField

下一篇: REST:部分更新集合子集的最佳实践