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