tomee-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Romain Manni-Bucau <rmannibu...@gmail.com>
Subject Re: JaxRS versioning REST API
Date Mon, 20 Oct 2014 08:41:11 GMT
right, you use your own header since there is no standard for
versioning (and actually versioning means a lot of things depending
the company ;))


Romain Manni-Bucau
@rmannibucau
http://www.tomitribe.com
http://rmannibucau.wordpress.com
https://github.com/rmannibucau


2014-10-20 10:38 GMT+02:00 Alex Soto <asotobu@gmail.com>:
> yes sorry when I said content I mean the Content field of Header.
>
> 2014-10-20 10:36 GMT+02:00 Romain Manni-Bucau <rmannibucau@gmail.com>:
>
>> sure, only the header does it
>>
>>
>> Romain Manni-Bucau
>> @rmannibucau
>> http://www.tomitribe.com
>> http://rmannibucau.wordpress.com
>> https://github.com/rmannibucau
>>
>>
>> 2014-10-20 10:34 GMT+02:00 Alex Soto <asotobu@gmail.com>:
>> > yes but then @Consumes and @Produces not containing the version part:
>> >
>> > @Path("/resource")
>> >
>> > @Consumes({"application/xml", "application/json"})
>> >
>> > @Produces({"application/xml", "application/json"})
>> >
>> > public AppApiSubResource getVersionedSubResource() {
>> >
>> >   String version = getVersionFromHeader();
>> >
>> >   return SubResourceFactory.getResource(version);
>> >
>> >
>> > }
>> >
>> > because if content also contains version then we are still in original
>> > problem.
>> >
>> >
>> >
>> >
>> > 2014-10-20 10:21 GMT+02:00 Romain Manni-Bucau <rmannibucau@gmail.com>:
>> >
>> >> You can read the header in the router, route then delegates the impl
>> >> to the next? Also means you can just use rest endpoint to select the
>> >> right impl using same pattern but with a single JAXRS level surely
>> >> (and routing is done to service level).
>> >>
>> >>
>> >> Romain Manni-Bucau
>> >> @rmannibucau
>> >> http://www.tomitribe.com
>> >> http://rmannibucau.wordpress.com
>> >> https://github.com/rmannibucau
>> >>
>> >>
>> >> 2014-10-20 10:17 GMT+02:00 Alex Soto <asotobu@gmail.com>:
>> >> > Yes I like the header approach as well, but then I see no way to
>> >> implement
>> >> > it directly using subresources.
>> >> >
>> >> > 2014-10-20 10:14 GMT+02:00 Romain Manni-Bucau <
>> rmannibucau@tomitribe.com
>> >> >:
>> >> >
>> >> >> most of real impl uses path (/v1) but i like header solution. allows
>> >> >> to handle default correctly without rewrite magic and to add it
for
>> v2
>> >> >> once forgotten for v1 :)
>> >> >> Romain Manni-Bucau
>> >> >> Twitter: @rmannibucau
>> >> >> Blog: http://rmannibucau.wordpress.com/
>> >> >> LinkedIn: http://fr.linkedin.com/in/rmannibucau
>> >> >> Github: https://github.com/rmannibucau
>> >> >>
>> >> >>
>> >> >>
>> >> >> 2014-10-20 10:10 GMT+02:00 Jean-Louis Monteiro <
>> >> jlmonteiro@tomitribe.com>:
>> >> >> > Right. No magic solution.
>> >> >> >
>> >> >> > I've seen the content type pattern, but it has many drawbacks
so I
>> >> would
>> >> >> > not go with this one.
>> >> >> >
>> >> >> > --
>> >> >> > Jean-Louis Monteiro
>> >> >> > http://twitter.com/jlouismonteiro
>> >> >> > http://www.tomitribe.com
>> >> >> >
>> >> >> > On Sun, Oct 19, 2014 at 1:48 PM, Alex Soto <asotobu@gmail.com>
>> wrote:
>> >> >> >
>> >> >> >> Yes this is what I though about creating a central place,
but I
>> was
>> >> >> >> thinking about using a rewrite instead of a subresource.
I am
>> going
>> >> to
>> >> >> >> google a bit about this pattern. For what I see there
is no magic
>> >> >> solution
>> >> >> >> yet :(
>> >> >> >>
>> >> >> >> Thanks.
>> >> >> >>
>> >> >> >> 2014-10-19 13:44 GMT+02:00 Romain Manni-Bucau <
>> >> >> rmannibucau@tomitribe.com>:
>> >> >> >>
>> >> >> >> > Hi
>> >> >> >> >
>> >> >> >> > What about sub resource locator pattern?
>> >> >> >> >
>> >> >> >> > For versioning I used a sub resource facade delegating
to the
>> real
>> >> >> >> > service then. This is just a router but it allows
to put all the
>> >> logic
>> >> >> >> > in a single place.
>> >> >> >> > Romain Manni-Bucau
>> >> >> >> > Twitter: @rmannibucau
>> >> >> >> > Blog: http://rmannibucau.wordpress.com/
>> >> >> >> > LinkedIn: http://fr.linkedin.com/in/rmannibucau
>> >> >> >> > Github: https://github.com/rmannibucau
>> >> >> >> >
>> >> >> >> >
>> >> >> >> >
>> >> >> >> > 2014-10-19 13:19 GMT+02:00 Alex Soto <asotobu@gmail.com>:
>> >> >> >> > > Hi guys,
>> >> >> >> > >
>> >> >> >> > > this is more a design question than a question
about how to do
>> >> >> >> something
>> >> >> >> > > with JAX-RS.
>> >> >> >> > >
>> >> >> >> > > Currently I am developing an API using JAX-RS
which must be
>> >> >> >> versionable.
>> >> >> >> > > That means that the API will evolve and client
must specify
>> which
>> >> >> >> version
>> >> >> >> > > of the API want to use. There are a lot of strategies
but
>> >> finally I
>> >> >> >> > decided
>> >> >> >> > > to use the one using Header and ContentType.
Let me show an
>> >> example:
>> >> >> >> > >
>> >> >> >> > > @Consumes*({*"application/vnd.blog.v1+xml"*,*
>> >> >> >> > "application/vnd.blog.v1+json"
>> >> >> >> > > *})*
>> >> >> >> > >
>> >> >> >> > > @Produces*({*"application/vnd.blog.v1+xml"*,*
>> >> >> >> > "application/vnd.blog.v1+json"
>> >> >> >> > > *})*
>> >> >> >> > >
>> >> >> >> > > *public* *class* Book*RestfulService* *{*
>> >> >> >> > >
>> >> >> >> > >
>> >> >> >> > >
>> >> >> >> > >     @GET
>> >> >> >> > >
>> >> >> >> > >     @Path*(*"/books"*)*
>> >> >> >> > >
>> >> >> >> > >    ….
>> >> >> >> > >
>> >> >> >> > > }
>> >> >> >> > >
>> >> >> >> > > @Consumes*({*"application/vnd.blog.v1+xml"*,*
>> >> >> >> > "application/vnd.blog.v1+json"
>> >> >> >> > > *})*
>> >> >> >> > >
>> >> >> >> > > @Produces*({*"application/vnd.blog.v1+xml"*,*
>> >> >> >> > "application/vnd.blog.v1+json"
>> >> >> >> > > *})*
>> >> >> >> > >
>> >> >> >> > > *public* *class* Author*RestfulService* *{*
>> >> >> >> > >
>> >> >> >> > >
>> >> >> >> > >
>> >> >> >> > >     @GET
>> >> >> >> > >
>> >> >> >> > >     @Path*(*“/authors”*)*
>> >> >> >> > >
>> >> >> >> > >    ….
>> >> >> >> > >
>> >> >> >> > > }
>> >> >> >> > >
>> >> >> >> > > That's an example of version one, but now let's
say I have a
>> >> >> >> modification
>> >> >> >> > > only in Author endpoint. I can do it and then
the restful
>> will be
>> >> >> v2.
>> >> >> >> So
>> >> >> >> > I
>> >> >> >> > > will have something like:
>> >> >> >> > >
>> >> >> >> > > @Consumes*({*"application/vnd.blog.v2+xml"*,*
>> >> >> >> > "application/vnd.blog.v2+json"
>> >> >> >> > > *})*
>> >> >> >> > >
>> >> >> >> > > @Produces*({*"application/vnd.blog.v2+xml"*,*
>> >> >> >> > "application/vnd.blog.v2+json"
>> >> >> >> > > *})*
>> >> >> >> > >
>> >> >> >> > > *public* *class* Author2*RestfulService* *{*
>> >> >> >> > >
>> >> >> >> > >
>> >> >> >> > >
>> >> >> >> > >     @GET
>> >> >> >> > >
>> >> >> >> > >     @Path*(*“/authors”*)*
>> >> >> >> > >
>> >> >> >> > >    ….
>> >> >> >> > >
>> >> >> >> > > }
>> >> >> >> > > The problem is that because Book has not received
any
>> >> modification,
>> >> >> I
>> >> >> >> > > should add @Consumes and @Produces with v2 as
well, something
>> >> like:
>> >> >> >> > >
>> >> >> >> > > @Consumes*({*"application/vnd.blog.v1+xml"*,*
>> >> >> >> > "application/vnd.blog.v1+json",
>> >> >> >> > > "application/vnd.blog.v2+xml"*,*
>> >> "application/vnd.blog.v2+json"*})*
>> >> >> >> > >
>> >> >> >> > > @Produces*({*"application/vnd.blog.v1+xml"*,*
>> >> >> >> > "application/vnd.blog.v1+json",
>> >> >> >> > > ....*})*
>> >> >> >> > >
>> >> >> >> > > *public* *class* Book*RestfulService* *{*
>> >> >> >> > >
>> >> >> >> > > *}*
>> >> >> >> > >
>> >> >> >> > > So now it is easy but if I have 25 services
then I would need
>> to
>> >> go
>> >> >> one
>> >> >> >> > by
>> >> >> >> > > one and add the media type as well. The problem
is that I can
>> >> miss
>> >> >> one
>> >> >> >> > and
>> >> >> >> > > then the API had a misplaced endpoint.
>> >> >> >> > >
>> >> >> >> > > One thing that I have thought about it is create
a rewriting
>> >> filter
>> >> >> >> > where I
>> >> >> >> > > can intercept the calls and then redirect to
the correct
>> >> endpoint.
>> >> >> In
>> >> >> >> > this
>> >> >> >> > > way all the rules will be placed in a single
place.
>> >> >> >> > >
>> >> >> >> > > Any hints/experience on this?
>> >> >> >> > >
>> >> >> >> > > Thank you so much.
>> >> >> >> > >
>> >> >> >> > >
>> >> >> >> > > --
>> >> >> >> > > +----------------------------------------------------------+
>> >> >> >> > >   Alex Soto Bueno
>> >> >> >> > >   www.lordofthejars.com
>> >> >> >> > > +----------------------------------------------------------+
>> >> >> >> >
>> >> >> >>
>> >> >> >>
>> >> >> >>
>> >> >> >> --
>> >> >> >> +----------------------------------------------------------+
>> >> >> >>   Alex Soto Bueno - Computer Engineer
>> >> >> >>   www.lordofthejars.com
>> >> >> >> +----------------------------------------------------------+
>> >> >> >>
>> >> >>
>> >> >
>> >> >
>> >> >
>> >> > --
>> >> > +----------------------------------------------------------+
>> >> >   Alex Soto Bueno - Computer Engineer
>> >> >   www.lordofthejars.com
>> >> > +----------------------------------------------------------+
>> >>
>> >
>> >
>> >
>> > --
>> > +----------------------------------------------------------+
>> >   Alex Soto Bueno - Computer Engineer
>> >   www.lordofthejars.com
>> > +----------------------------------------------------------+
>>
>
>
>
> --
> +----------------------------------------------------------+
>   Alex Soto Bueno - Computer Engineer
>   www.lordofthejars.com
> +----------------------------------------------------------+

Mime
View raw message