standalone java webservice client - java

I am new to webservices in general. I am trying to write a Java stand-alone client which can get a response back from a webservice.
I tried searching SO and Google but now I got more confused. The below are the links I went through extensively.
Simple (standalone) Java SOAP web service client from WSDL using Maven
Java webservice (soap) client - use certificates
java webservice client
https://cwiki.apache.org/CXF20DOC/how-do-i-develop-a-client.html
Java Webservice Client (Best way)
Steps in creating a web service using Axis2 - The client code
I have a url like: http://api.something.com/remote/wsdl/SomeEncryptedText
I also have a SOAP request something like:
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<AuthUsername>someName#someWhere.com</AuthUsername>
<AuthPassword>mypassword</AuthPassword>
<Sid>12121</Sid>
<DynamicProductFeedsRequest xmlns="http://api.something.com/remote/SomeEncryptedText">
</DynamicProductFeedsRequest>
</soap12:Body>
</soap12:Envelope>
With this how do I write a stand-alone Java client which I would want to integrate with some web application at a later stage?
From the resources mentioned earlier looks there is a wide choice of softwares: SoapUI, WSDL2Java, Apache Axis, Maven Plugin, JAX-WS, Apache CXF.
I used http://www.soapclient.com/soaptest.html in one of the SO answers mentioned above and I am able to get a perfect html/xml file on the browser.
Now I am confused on which is the software I should use? The information in the links are little in bits and pieces which I am unable to correlate with one another since I do not know anything in SOA.
Could anyone please tell me the high level steps in writing a stand-alone Java client which takes in the WSDL URL and SOAP request and gives me the output of it?
Please let me know if I missed any information.

This question all depends on the following:
The JDK version of your Java compiler.
Your WSDL version (there's 1.0, 1.2 and 2.0).
Basically, if you are using Java annotations to generate web services, then you'll need Java 5 related Web Services libraries (which supports annotations).
Some articles on Using Java Web Services with annotations (JAX-WS):
Introducing JAX-WS 2.0 With the Java SE 6 Platform
JAX-WS 2.0
I'll start from generating Web Service client with Java that doesn't support annotations. The well known client that generates WSDL to Java is Apache Axis (the last version is 1.4 released in 22 April 2006). This basically takes a WSDL definition and generates it back to client. It supports the old version of WSDL (1.0) and crashes if you use the newer versions of WSDL (1.2 and 2.0).
What this basically does, it takes your WSDL and generates a java Proxy that communicates to your Web Service. It can allow RPC based as well as XML based communication.
For Java that supports annotations there are, effectively, 2 ways of doing this:
Using Java's own wsimport command (the executable is found under the JDK_HOME/bin/ folder).
Using 3rd Party libaries such as Apache Axis 2 (which effectively replaces Apache Axis and supports WSDL version 2.0) or Apache CXF (which supports WSDL up to 1.2).
To use wsimport, you basically need to go to a shell command (or write a script) and effectively do something of this effect:
wsimport -d [outputdir] wsdl_file
and your java proxy will be found in the [outputdir] folder.
wsimport is found in JDK 1.6 (I don't know if it exists in earlier versions). More source here, and here.
For Apache Axis, Apache Axis 2 or Apache CXF, there's a WSDL2Java class file that does source code generation.
Here's a guide on how to use WSDL2Java in Apache CXF and in Apache Axis 2.
I hope this helps you in some way as much as I spent like 30 minutes off work doing this. :-)

Related

Creating web services client from WSDL in Java

I am given a WSDL file. I need to call a SOAP web service in the WSDL. I would like to know the different ways of creating a web service clients from a WSDL in java. It would be helpful if the options are given with examples, links, pros and cons. I am now confused with different options like wsimport, wsdl2java, java2wsdl, saaj, apache axis, cxf, spring etc. Your help is much appreciated.
SoapUI doesn't support WSDL 2.0
You may try an experimental wsdl-generic library from Apache Taverna
The library works with both WSDL 1.1 / 2.0 versions.
The experimental branch creates XML tree based on Apache XML Schema 2.0 library, so you can easily create your XML message.
Then it dynamically calls the service via JAX-WS.
It also has a command-line WS executor!!!
Cheers,
D.
I was working on a project using Salesforce SOAP API, and here is a link of the guide for using WSDL to generate java lib:
https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_quickstart_import_WSDLs.htm
Hope it will help you.
SoapUI is a quick solution with user interface to make initial tests for provided web service methods. Later you can use wsdl2java with specific options to generate Java classes from WSDL and make jar which you will include in your project.

Consume SOAP webservice in java, only WSDL in hand

I need to consume a web service in java/jsp code. Only the WSDL is available for me to start.
I understand I need to convert the WSDL into java client JAR file using AXIS2 / CXF but I cannot build the whole application on this.
Can someone provide a simple example or basic steps for me to start on this?
I am not able to join the dots here. WSDL, java client JAR, AXIS2.... All online tutorials point on 'creating' a web service.
There are a number of tools capable of doing this included in various frameworks and app servers (CXF, JBoss/Wildfly, etc.), but the JDK itself includes a tool called wsimport which can consume a WSDL file and produce the JAX-WS stubs you need to remotely-invoke the service endpoints via a Java client.
Here's one quick description: http://www.mkyong.com/webservices/jax-ws/jax-ws-wsimport-tool-example/; here is the Oracle documentation for the tool in JDK 7: http://docs.oracle.com/javase/7/docs/technotes/tools/share/wsimport.html.
WSDL is just the conract for the web service. You need to generate client code using it, later you can implement your code to call the web service. Like #maerics pointed out, you should use wsdl2java to generate your client code for AXIS2 and use your client to consume the web service.
You can check this link for an example of client stub generation for AXIS2.

CXF and standalone web services

I'm currently writing a few applications that contain web service clients and servers, as complete standalone applications, eg without any web application server / servlet engine. I'm using plain Java 6, and for the "server" part I'm using the sun HttpServer. Working like a charm.
(actually I am using CXF, but only for their wsdl2java tool, which is more flexible than the one that ships with Java 6).
I've been wondering now if there is any benefit for me to look at frameworks like CXF. Strangely enough, I can't find any information on the CXF web site on such a scenario, they just seem to blindly assume that everybody uses an applications server (and worse, maven).
One of the reasons why I'm looking at CXF is that in the near future I expect that I need to support AIX as well, and there I can't use:
reqcontext.put(BindingProviderProperties.CONNECT_TIMEOUT, connect_timeout);
reqcontext.put(BindingProviderProperties.REQUEST_TIMEOUT, request_timeout);
CXF has this thing called an HTTPClientPolicy which would nicely fit the bill.
Does anybody have any links to articles discussing using CXF without any application server / servlet engine? Are there any other benefits that CXF could give me over the current Java 6 JAX-WS implementation?
Maarten
Almost all the samples that come in the CXF distribution are setup specifically as a "main method" type service that starts up the service and clients and such as standalone applications without any use of an app server (or even Tomcat). The CXF samples would be a good place to start.
That said, they do all use Maven now. :-)

Java 1.3 Websphere 5 application -> need call SOAP 1.1 or SOAP 1.2 web service

I have old application that works in Websphere 5 with Java 1.3.
I cannot change Java version or app server version.
I need to add to this application code that will call web service.
AFAIK target web service supports both SOAP 1.1 and SOAP 1.2.
Unfortunately I have only little experience with WS clients. Some time ago I wrote WS client using Java 5. It was very simple, I used wsimport tool that generated all necessary classes from WSDL.
But, as I understand, Java 1.3 and Websphere 5 doesn't have such possibility. Words like JAX-WS and JAXB are related to the latest java versions.
Could someone please provide me with some guide (or just advise :)) what should I do?
Thanks in advance!
Some suggestions though I haven't tried them out:
Look into Apache Axis and try
out the tutorials
Read a similar
question for more suggestions in
case the first one doesn't work out
WebSphere 5 does not support Axis. If you have related WebSphere Studio you can easily create SOAP client using wizard. Maybe WebSphere 5 have command line tool like wsimport

Simply consuming a web service in Java

I have a very simple SOAP web service that I need to consume from a Java client. What is the easiest way to accomplish this without using any third party libraries? A requirement is that the host and port is read from the web.xml before every call to the ws.
I can recommend you CXF library. Using it you will have several options for calling web services:
Use dynamic proxy for calling (don't need to make Java stubs using wsdl2java).
DynamicClientFactory dcf = DynamicClientFactory.newInstance();
Client client = dcf.createClient("http://admin:password#localhost:8080"+
"/services/MyService?wsdl");
Object[] a = client.invoke("test", "");
System.out.println(a);
Using Java stub generated from WSDL, using wsdl2java.
If your server was created using CXF you can reuse your interface code directly (instead of using wsdl2java on the WSDL which was created from your interface!)
For both #2 and #3, the following code exemplifies the CXF usage:
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setAddress("http://admin:password#localhost:8080/services/MyService");
factory.setServiceClass(ITest.class);
ITest client = (ITest) factory.create();
client.test();
Depending on which version of JAVA you're using, some of the JAX-WS is built into it. JDK 6 has Java's JAX-WS standard implementation and you could just use it.
See the following:
JAX-WS 2.1 and JAXB 2.1 is available in JDK 6 Update 4 release
Getting Started with JAX-WS Web Services (tutorial to use the JDK built-in JAX-WS for deploying and consuming a web service)
If you can relax your "no 3rd party libraries" requirement, and you have a WSDL for the web service then Axis makes it really easy. Just compile the WSDL using wsdl2java, and you can use the generated Java classes to consume the web service.
Without using any third party libraries? Get to know the SOAP standard really well and learn to love SAX.
If you can't love SAX, then lax your no-third-party-libs requirement and use StAX (with woodstox) instead.
This approach might be the "easiest" (considering the no-third-party-libs requirement) but I don't think it will be easy.

Categories

Resources