Hi,

 

Some initial work has been done for CXF JAXRS have its own Client API.
The code is at [1].

Some of the design goals were to come up with at least something
different compared to what other JAXRS implementations have

(Jersey and RestEasy), reuse the existing JAXRS classes and approaches
(use of providers), ensure JAXWS users can start playing fast.  

 

I've already done some overview at [2].

 

In short we've tried to do 3 forms of client api for a start.
Proxy-based, http-centric and xml-centric. 

 

Proxy based api is about people being able to reuse what they've already
done on the server side. Root and sub-resource classes can be reused

on a client side as proxies, irrespectively of whether they derive the
metadata from interfaces or classes. Currently it's not possible to have
@Context

parameters in resource method signatures, but I'm realizing while typing
this text that they actually have to simply ignored on the client side. 

This style will also encourage users returning annotated interfaces or
concrete classes in sub-resource locators.

Proxies can be controlled as http-centric clients, except that they
can't explicitly do post()/get() or control the way URI gets built. I
thought it would make things a bit 'chaotic'

if we allowed to do it, if one works with the interface/class then the
methods is what drives the way URI gets built and how invocations are
made.

 

Every proxy is a Client [3] so one can customize the request headers or
check the actual HTTP (JAXRS) Response. One can easily switch to
WebClient while preserving the existing proxy settings and back from
WebClients to proxies. This might be of interest when working with a set
of services, when interfaces are available for only some of them, when
investigating at runtime the possibly unexpected proxy response, etc,
etc.

 

HTTP-centric api is really about doing HTTP programming [3]. Every
WebClient is a Client. Users can deal with Response or typed object
responses. There're some utility methods there for a client to navigate
back and forward. You'll likely find quite a bit of similarity here with
how say Jersey does the client API - but I can assure you it's really a
basic common thing to do, things like WebClient.get(T class) for
example, or WebClient.form(new Form()). For example, I've started with
WebClient.form(MultivaluedMap) but having a little wrapper on top of
MultivaluedMap is an obvious thing to do. 

 

Finally, we have xml-centric API (nearly non-existent at the moment).
It's a subset of http-centric one. One can obviously do 

 

StreamSource source = new
WebClient("http://bar";).get(StreamSource.class)

   

and proceed from there. But we'll enhance the XMLSource utility class to
highlight the fact that this form of dealing with XML responses is
probably the most flexible and robust one.

 

I'd welcome a lot any constructive feedback. There's actually quite a
bit work which still needs to be done (chains, spring injection, etc).
But what we already have will make it into CXF 2.2 so we'd like to do it
as right as possible. Any ideas on what is missing, what may need to be
added or changed will be welcome - please send your feedback to cxf
lists or contact me directly. If someone could give it a try with the
latest CXF trunk and see how natural the client api fits into a specific
task then it would be cool...

 

Cheers, Sergey

 

 

[1]
https://svn.apache.org/repos/asf/cxf/trunk/rt/frontend/jaxrs/src/main/ja
va/org/apache/cxf/jaxrs/client

[2]
http://sberyozkin.blogspot.com/2009/02/cxf-jaxrs-client-api-preview.html

[3]
https://svn.apache.org/repos/asf/cxf/trunk/rt/frontend/jaxrs/src/main/ja
va/org/apache/cxf/jaxrs/client/Client.java

[4]
https://svn.apache.org/repos/asf/cxf/trunk/rt/frontend/jaxrs/src/main/ja
va/org/apache/cxf/jaxrs/client/WebClient.java

[5]
https://svn.apache.org/repos/asf/cxf/trunk/rt/frontend/jaxrs/src/main/ja
va/org/apache/cxf/jaxrs/client/XMLSource.java

 

 

 

 

Reply via email to