[aerogear-dev] Paging Demo

Daniel Bevenius daniel.bevenius at gmail.com
Fri Jan 11 06:01:38 EST 2013


Hey Kris,

been thinking about your reply regarding the inconsistency of the returned
data. I think it looks a little odd to have the 'cars' property returned
when requesting a single car.
What do you all think of this as a suggestion below?

As you can see we now return HTTP Headers and also the object returned is
either an array of cars, or just a single object if you only request a
single car.

Getting a page of Cars

URL="http://controllerdemo-danbev.rhcloud.com/aerogear-controller-demo"
curl -i --header "Accept: application/json" "$URL/cars?page=0&perPage=4"

The request will return:

HTTP/1.1 200 OKLink-Previous: cars?page=0&page=4Link-First:
cars?page=0&page=4MetaData-PerPage: 4MetaData-Page: 0Link-Next:
cars?page=1&page=4Content-Type:
application/json;charset=UTF-8Content-Length: 161[
  {"color":"Black","brand":"BMW","id":1},
  {"color":"Red","brand":"Ferrari","id":2},
  {"color":"Blue","brand":"Skoda","id":3},
  {"color":"Green","brand":"Audi","id":4}]

<https://gist.github.com/4500336#getting-the-next-page-of-cars>Get a single
Car

URL="http://controllerdemo-danbev.rhcloud.com/aerogear-controller-demo"
curl -i --header "Accept: application/json" "$URL/cars/1"

The request will return:

{"color":"Black","brand":"BMW","id":1}



On 10 January 2013 20:00, Daniel Bevenius <daniel.bevenius at gmail.com> wrote:

> Summers brought up a good point today on IRC which I've forgot to mention.
> We've said that it will be possible to pass the page parameters as HTTP
> Headers and this is still the plan. But the demo is using the lastest from
> upstream and support for passing headers to the client is not there yet. I
> hope to have this working shortly though and I'll post back with
> information as soon as possible, tomorrow or Monday at the latest.
>
>
>
>
> On 10 January 2013 15:32, Daniel Bevenius <daniel.bevenius at gmail.com>wrote:
>
>> >I know it's just a demo but I think making that JSON format consistent
>> so that the car data is always in an array under the "cars" key would be
>> better.
>>  Good point. I'll change this so that there is always a "cars' key.
>>
>>
>> On 10 January 2013 15:13, Kris Borchers <kris at redhat.com> wrote:
>>
>>>
>>> On Jan 10, 2013, at 3:02 AM, Daniel Bevenius <daniel.bevenius at gmail.com>
>>> wrote:
>>>
>>> We talked about paging yesterday on IRC, and it was decided to add a
>>> paging example to aerogear-controller-demo. What follows is an example to
>>> kick of further discussion about what the example should look like.
>>>
>>>  AeroGear Controller Demo Paging Route
>>>
>>> This page discusses AEROGEAR-795<https://issues.jboss.org/browse/AEROGEAR-795> which
>>> is about adding an example to aerogear-controller-demo to demonstrate
>>> paging support so that the client libraries (Android, JavaScript, and iOS)
>>> can be tested against it.
>>>
>>> This is only a suggestion and the implementation and the names of the
>>> query parameters can all be changed.
>>> Use case
>>>
>>> The example is using cars as the resource to interact with. To be able
>>> to query we need something to query, so lets start by adding some cars by
>>> posting.
>>> Adding Cars
>>>
>>> URL="http://controllerdemo-danbev.rhcloud.com/aerogear-controller-demo"
>>>
>>> curl -i --header "Accept: application/json" -H "Content-type: application/x-www-form-urlencoded" --data "car.color=Black&car.brand=BMW" -X POST "$URL/cars"
>>> curl -i --header "Accept: application/json" -H "Content-type: application/x-www-form-urlencoded" --data "car.color=Red&car.brand=Ferrari" -X POST "$URL/cars"
>>> curl -i --header "Accept: application/json" -H "Content-type: application/x-www-form-urlencoded" --data "car.color=Blue&car.brand=Skoda" -X POST "$URL/cars"
>>> curl -i --header "Accept: application/json" -H "Content-type: application/x-www-form-urlencoded" --data "car.color=Green&car.brand=Audi" -X POST "$URL/cars"
>>> curl -i --header "Accept: application/json" -H "Content-type: application/x-www-form-urlencoded" --data "car.color=Yello&car.brand=Opel" -X POST "$URL/cars"
>>> curl -i --header "Accept: application/json" -H "Content-type: application/x-www-form-urlencoded" --data "car.color=Pink&car.brand=Mini" -X POST "$URL/cars"
>>> curl -i --header "Accept: application/json" -H "Content-type: application/x-www-form-urlencoded" --data "car.color=Gray&car.brand=Nissan" -X POST "$URL/cars"
>>> curl -i --header "Accept: application/json" -H "Content-type: application/x-www-form-urlencoded" --data "car.color=Red&car.brand=Volvo" -X POST "$URL/cars"
>>> curl -i --header "Accept: application/json" -H "Content-type: application/x-www-form-urlencoded" --data "car.color=Blue&car.brand=Saab" -X POST "$URL/cars"
>>> curl -i --header "Accept: application/json" -H "Content-type: application/x-www-form-urlencoded" --data "car.color=Black&car.brand=Mazda" -X POST "$URL/cars"
>>> curl -i --header "Accept: application/json" -H "Content-type: application/x-www-form-urlencoded" --data "car.color=Yello&car.brand=Golf" -X POST "$URL/cars"
>>>
>>> The example uses an in-memory database so the data will be cleared upon
>>> redployment/restart of the server. So you only need to populate/post when
>>> you've restared or redployed.
>>>
>>> With the cars in place, we can now issue GET requests with paging query
>>> parameters. The following route has been added to the demo:
>>>
>>> route()
>>>       .from("/cars")
>>>       .on(RequestMethod.GET)
>>>       .produces(MediaType.JSON.toString())
>>>       .to(Cars.class).get(param("page", "0"), param("perPage", "-1"));
>>>
>>> From this we can see that there are two optional parameters, page and
>>> perPage. If these are not specified all cars will be returned.
>>> Getting a page of Cars
>>>
>>> URL="http://controllerdemo-danbev.rhcloud.com/aerogear-controller-demo"
>>> curl -i --header "Accept: application/json" "$URL/cars?page=0&perPage=4"
>>>
>>> The request will return:
>>>
>>> {
>>>   "metadata":{"page":0,"perPage":4},
>>>   "cars":[
>>>             {"color":"Black","brand":"BMW","id":1},
>>>             {"color":"Red","brand":"Ferrari","id":2},
>>>             {"color":"Blue","brand":"Skoda","id":3},
>>>             {"color":"Green","brand":"Audi","id":4}
>>>           ],
>>>   "links":{
>>>           "first":"cars?page=0&page=4",
>>>           "previous":"cars?page=0&page=4",
>>>           "next":"cars?page=1&page=4"
>>>           }}
>>>
>>> Getting the next page of Cars
>>>
>>> To get the next page you can follow the next link:
>>>
>>> URL="http://controllerdemo-danbev.rhcloud.com/aerogear-controller-demo"
>>> curl -i --header "Accept: application/json" "$URL/cars?page=1&perPage=4"
>>>
>>> {
>>>     "metadata":{"page":1,"perPage":4},
>>>     "cars":[
>>>             {"color":"Yello","brand":"Opel","id":5},
>>>             {"color":"Pink","brand":"Mini","id":6},
>>>             {"color":"Gray","brand":"Nissan","id":7},
>>>             {"color":"Red","brand":"Volvo","id":8}
>>>            ],
>>>     "links":{
>>>             "first":"cars?page=0&page=4",
>>>             "previous":"cars?page=0&page=4",
>>>             "next":"cars?page=2&page=4"
>>>             }}
>>>
>>> Get all Cars
>>>
>>> URL="http://controllerdemo-danbev.rhcloud.com/aerogear-controller-demo"
>>> curl -i --header "Accept: application/json" "$URL/cars"
>>>
>>> Get a single Car
>>>
>>> URL="http://controllerdemo-danbev.rhcloud.com/aerogear-controller-demo"
>>> curl -i --header "Accept: application/json" "$URL/cars/1"
>>>
>>> The request will return:
>>>
>>> {"color":"Black","brand":"BMW","id":1}
>>>
>>>
>>> Hmmm, the data returned should be consistent, right? Whether paging
>>> parameters are supplied or not, the structure of the JSON to access the car
>>> info should be the same. It's fine to leave out the metadata and links when
>>> they're not needed I guess but to access the car info, currently you have:
>>>
>>> Not Paged: {"color":"Black","brand":"BMW","id":1}
>>> Paged: {"cars":[{"color":"Black","brand":"BMW","id":1},…]}
>>>
>>> I know it's just a demo but I think making that JSON format consistent
>>> so that the car data is always in an array under the "cars" key would be
>>> better.
>>>
>>> Again, anything here can be changed, the name of the query parameters,
>>> the implementation, and what is returned.
>>>
>>> Reference:
>>>
>>>    - Paging Support in AeroGear Controller<https://gist.github.com/4147473>
>>>
>>> _______________________________________________
>>> aerogear-dev mailing list
>>> aerogear-dev at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/aerogear-dev
>>>
>>>
>>>
>>> _______________________________________________
>>> aerogear-dev mailing list
>>> aerogear-dev at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/aerogear-dev
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/aerogear-dev/attachments/20130111/6d7a16c1/attachment-0001.html 


More information about the aerogear-dev mailing list