views:

286

answers:

3

Apparently, Groovy easily consumes web services. Can it consume a web service that needs JAX-RPC instead of JAX-WS? Should I use an older version of Groovy or its libraries to do so?

A: 

What do you mean by "can it consume a web service that needs JAX-RPC instead of JAX-WS"? What differences do you expect on the Groovy side? Did you try to call that web service as documented:

import groovyx.net.ws.WSClient

def proxy = new WSClient("http://localhost:6980/MathService?wsdl", this.class.classLoader)
proxy.initialize() // from 0.5.0
def result = proxy.add(1.0 as double, 2.0 as double)
assert (result == 3.0)

result = proxy.square(3.0 as double)
assert (result == 9.0)

Do you get any particular error?

Pascal Thivent
Paul
Ho, hi Paul! Sorry, I didn't recognize you immediately :) Actually, I'm not sure why you had to add the JAX-RPC library. My initial suggestion was to implement a JAX-WS client (a bit simpler) and AFAIK Netbeans includes everything required for this. Maybe you should create another question for that, it would be easier to discuss your issues.
Pascal Thivent
I may need the JAX-RPC library by stumbling into a small example of why people seek alternatives to SOAP. Apparently there are multiple flavors of WDSL (search "ibm style wsdl" for the obscure details). I saw various temptingly simple examples of ws clients in Groovy, but despite hours of bumbling with Groovy console and/or IntelliJ community beta, none work yet :(. Maybe I'm trying to hard to be groovy.
Paul
I think you are misinterpreting things like binding style (and use) and the "library" you'll need. Personally, I prefer to use document/literal style for better interoperability and the "wrapped" convention for an RPC-like programming experience (see http://atmanes.blogspot.com/2005/03/wrapped-documentliteral-convention.html). However, choosing rcp/literal doesn't mean that you have to use JAX-RPC and, in your case, I'd rather stick with JAX-WS (and Java) and use annotations to stay away from all these details.
Pascal Thivent
Very possibly. The NetBeans wizard saw the WSDL for my service and said I needed JAX-RPC. This monkey with a mouse didn't know enough to argue :-).
Paul
+2  A: 

It's really easy to consume XML-RPC web services. You need the Groovy XML-RPC as well as the Smack library in your classpath.

I wrote some groovy scripts to work with our Atlassian Confluence wiki and here's a short example to retrieve a wiki page using XML-RPC:

import groovy.net.xmlrpc.*

def c = new XMLRPCServerProxy("http://host:port/rpc/xmlrpc")
def token = c.confluence1.login("username","password")

def page = c.confluence1.getPage(token, "SPACE", "pagename")
println page.content

c.confluence1.logout(token);

You use the XMLRPCServerProxy to access the XML-RPC services. If your services require complex parameters as parameters or return one, these are represented as Groovy maps, with the attribute name as key and it's value as the corresponding value. In the script above, the service getPage returns a Page object, which is a map, but as you can directly access a map's key using the dot-notation in Groovy, page.content is the same as page.get("content").

Christoph Metzendorf
Thanks Chris, this looks very cool but I'm probably a few chapters (books?) behind you. I never imagined an XMPP library would relate to XML-RPC until Google showed me Jabber-RPC. My head hurts already!
Paul
Actually, I haven't cared much about the fact that the Groovy XMLRPC module has a dependency with an XMPP library. I just tried the example from http://groovy.codehaus.org/XMLRPC and it worked.
Christoph Metzendorf
A: 

Since Groovy can work with compiled Java classes, sometimes the easiest way to access a SOAP-based web service is to just generate the stubs and write a Groovy client that uses them. Use your "wsimport" tool (JAX-WS) or wsdl2java (JAX-RPC) to generate the stubs, and write your Groovy class as usual.

kousen