web-dev-qa-db-fra.com

Comment consommer un service Web SOAP dans Java

Quelqu'un peut-il m'aider avec des liens et d'autres sur la façon de consommer un service Web WSDL en Java?

14
OyugiK

J'utiliserai CXF vous pouvez aussi penser à AXIS 2.

La meilleure façon de le faire peut être d'utiliser JAX RS Reportez-vous à cette exemple

Example:

wsimport -p stockquote http://stockquote.xyz/quote?wsdl

This will generate the Java artifacts and compile them by importing the http://stockquote.xyz/quote?wsdl.

Je

8
constantlearner

Il existe de nombreuses options pour utiliser un service Web SOAP avec Stub ou Java classes créées sur la base de WSDL. Mais si quelqu'un veut le faire sans aucun Java class created, this article est très utile. Extrait de code de l'article:

public String someMethod() throws MalformedURLException, IOException {

//Code to make a webservice HTTP request
String responseString = "";
String outputString = "";
String wsURL = "<Endpoint of the webservice to be consumed>";
URL url = new URL(wsURL);
URLConnection connection = url.openConnection();
HttpURLConnection httpConn = (HttpURLConnection)connection;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
String xmlInput = "entire SOAP Request";

byte[] buffer = new byte[xmlInput.length()];
buffer = xmlInput.getBytes();
bout.write(buffer);
byte[] b = bout.toByteArray();
String SOAPAction = "<SOAP action of the webservice to be consumed>";
// Set the appropriate HTTP parameters.
httpConn.setRequestProperty("Content-Length",
String.valueOf(b.length));
httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
httpConn.setRequestProperty("SOAPAction", SOAPAction);
httpConn.setRequestMethod("POST");
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
OutputStream out = httpConn.getOutputStream();
//Write the content of the request to the outputstream of the HTTP Connection.
out.write(b);
out.close();
//Ready with sending the request.

//Read the response.
InputStreamReader isr = null;
if (httpConn.getResponseCode() == 200) {
  isr = new InputStreamReader(httpConn.getInputStream());
} else {
  isr = new InputStreamReader(httpConn.getErrorStream());
}

BufferedReader in = new BufferedReader(isr);

//Write the SOAP message response to a String.
while ((responseString = in.readLine()) != null) {
outputString = outputString + responseString;
}
//Parse the String output to a org.w3c.dom.Document and be able to reach every node with the org.w3c.dom API.
Document document = parseXmlFile(outputString); // Write a separate method to parse the xml input.
NodeList nodeLst = document.getElementsByTagName("<TagName of the element to be retrieved>");
String elementValue = nodeLst.item(0).getTextContent();
System.out.println(elementValue);

//Write the SOAP message formatted to the console.
String formattedSOAPResponse = formatXML(outputString); // Write a separate method to format the XML input.
System.out.println(formattedSOAPResponse);
return elementValue;
}

Pour ceux qui recherchent un type de solution similaire avec le téléchargement de fichiers tout en consommant une API SOAP, veuillez vous référer à cet article: Comment joindre un fichier (pdf, jpg, etc) dans une SOAP POST request?

5
RAS

Comme certains suggèrent, vous pouvez utiliser Apache ou jax-ws. Vous pouvez également utiliser des outils qui génèrent du code à partir de WSDL tels que ws-import, mais à mon avis, la meilleure façon de consommer le service Web est de créer un client dynamique et d'appeler uniquement les opérations que vous ne voulez pas tout de wsdl. Vous pouvez le faire en créant un client dynamique: Exemple de code:

String endpointUrl = ...;

QName serviceName = new QName("http://com/ibm/was/wssample/echo/",
 "EchoService");
QName portName = new QName("http://com/ibm/was/wssample/echo/",
 "EchoServicePort");

/** Create a service and add at least one port to it. **/ 
Service service = Service.create(serviceName);
service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointUrl);

/** Create a Dispatch instance from a service.**/ 
Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, 
SOAPMessage.class, Service.Mode.MESSAGE);

/** Create SOAPMessage request. **/
// compose a request message
MessageFactory mf = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);

// Create a message.  This example works with the SOAPPART.
SOAPMessage request = mf.createMessage();
SOAPPart part = request.getSOAPPart();

// Obtain the SOAPEnvelope and header and body elements.
SOAPEnvelope env = part.getEnvelope();
SOAPHeader header = env.getHeader();
SOAPBody body = env.getBody();

// Construct the message payload.
SOAPElement operation = body.addChildElement("invoke", "ns1",
 "http://com/ibm/was/wssample/echo/");
SOAPElement value = operation.addChildElement("arg0");
value.addTextNode("ping");
request.saveChanges();

/** Invoke the service endpoint. **/
SOAPMessage response = dispatch.invoke(request);

/** Process the response. **/
5
Maciej Cygan

Ici vous pouvez trouver un joli tutoriel sur la façon de créer et de consommer un service SOAP via WSDL. Bref, vous devez appeler Outil wsimport depuis la ligne de commande (vous pouvez le trouver dans votre jdk) avec des paramètres comme -s (source pour les fichiers .Java) -d (destination pour les fichiers .class) et le lien wsdl .

$ wsimport -s "C:\workspace\soap\src\main\Java\com\test\soap\ws" -d "C:\workspace\soap\target\classes\com\test\soap\ws" http://localhost:8855/soap/test?wsdl

Une fois les stubs créés, vous pouvez appeler très facilement les webservices comme:

TestHarnessService harnessService = new TestHarnessService();
ITestApi testApi = harnessService.getBasicHttpBindingITestApi();
testApi.resetLogMemoryTarget();
4
Popa Andrei