tomee-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alex Soto <asot...@gmail.com>
Subject Re: JaxRS versioning REST API
Date Mon, 20 Oct 2014 08:43:19 GMT
Cool, thanks.

2014-10-20 10:41 GMT+02:00 Romain Manni-Bucau <rmannibucau@gmail.com>:

> 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
> > +----------------------------------------------------------+
>



-- 
+----------------------------------------------------------+
  Alex Soto Bueno - Computer Engineer
  www.lordofthejars.com
+----------------------------------------------------------+

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message