If you remember, I was asking the other day if there is a "standard" way to do this. Basically there are two
"big options":
- Put paging info in the Http-Header
- Put paging info in the body of the message
While I think paging information are meta data that should not "pollute" the body, I understand the arguments from the JavaScript side that says that they don't easily have access to the http headers
within AJAX requests. So what I have now done is to implement both:
- Paging in the http header: this is the standard way that you get if you just request the "normal" media types of application/xml or application/json (output from running RestAssured):
 [update]
 My colleague Libor pointed out that the links do not match with format from RFC 5988 Web Linking, which is now fixed.
 [/update]
 Request method: GET
 Request path: http://localhost:7080/rest/resource
 Query params: page=1
 ps=2
 category=service
 Headers: Content-Type=*/*
 Accept=application/json
 HTTP/1.1 200 OK
 Server=Apache-Coyote/1.1
 Pragma=No-cache
 Cache-Control=no-cache
 Expires=Thu, 01 Jan 1970 01:00:00 CET
 Link=<http://localhost:7080/rest/resource?ps=2&category=service&page=2>; rel="next"
 Link=<http://localhost:7080/rest/resource?ps=2&category=service&page=0>; rel="prev"
 Link=<http://localhost:7080/rest/resource?ps=2&category=service&page=152>; rel="last"
 Link=<http://localhost:7080/rest/resource?page=1&ps=2&category=service>; rel="current"
 Content-Encoding=gzip
 X-collection-size=305
 Content-Type=application/json
 Transfer-Encoding=chunked
 Date=Thu, 23 May 2013 07:57:38 GMT
 [
 {
 "resourceName": "/",
 "resourceId": 10041,
 "typeName": "File System",
 "typeId": 10013,
 …..
- Paging as part of the body - there the "real collection" is wrapped inside an object that also contains paging meta data as well as the paging links. To request this representation, a media type of application/vnd.rhq.wrapped+json needs to be used (and this is only available with JSON at the moment):
 Request method: GET
 Request path: http://localhost:7080/rest/resource
 Query params: page=1
 ps=2
 category=service
 Headers: Content-Type=*/*
 Accept=application/vnd.rhq.wrapped+json
 Cookies:
 Body:
 HTTP/1.1 200 OK
 Server=Apache-Coyote/1.1
 Pragma=No-cache
 Cache-Control=no-cache
 Expires=Thu, 01 Jan 1970 01:00:00 CET
 Content-Encoding=gzip
 Content-Type=application/vnd.rhq.wrapped+json
 Transfer-Encoding=chunked
 Date=Thu, 23 May 2013 07:57:40 GMT
 {
 "data": [
 {
 "resourceName": "/",
 "resourceId": 10041,
 "typeName": "File System",
 "typeId": 10013,
 …
 ],
 "pageSize": 2,
 "currentPage": 1,
 "lastPage": 152,
 "totalSize": 305,
 "links": [
 {
 "next": {
 "href": "http://localhost:7080/rest/resource?ps=2&category=service&page=2"
 }
 },
 …
 }
Please try this if you can. We want to get that into a "finished" state (as for the whole REST-Api) for RHQ 4.8
Nice! The best of both worlds. Server side developers can use the more standard header method and client side ajax requests can consume the inline method.
ReplyDeleteVery good resolution indeed!
ReplyDelete