Je n'ai jamais utilisé de bibliothèques SOAP en Java, donc je m'excuse pour la nouveauté de cette question.
J'essaie de tirer parti de l'API SOAP SOAP $ === de Tivoli Endpoint Manager. J'ai généré les classes nécessaires à partir du fichier WSDL fourni, à l'aide de wsimport.exe (fourni dans le jdk).
Maintenant, je reçois une tonne de classes qui, je suppose, regroupent les informations au format xml, mais je ne sais pas quoi en faire. J'ai lu la documentation fournie, mais elle est au mieux floue.
Les classes générées par wsimport sont les suivantes:
Selon la documentation, le code Perl suivant fonctionne pour interroger l'API de Tivoli
use SOAP::Lite;
#arguments: [hostname] [username] [password] [relevance expression]
#hostname only, e.g. ’example.com’ rather than ’http://example.com/webreports’
my $Host = $ARGV[0];
my $username = SOAP::Data->name(’username’ => $ARGV[1] );
my $password = SOAP::Data->name(’password’ => $ARGV[2] );
my $expr = SOAP::Data->name(’relevanceExpr’ => $ARGV[3] );
my $service = SOAP::Lite -> uri( ’http://’ . $Host . ’/webreports?wsdl’ )
-> proxy( $Host );
my $result = $service -> GetRelevanceResult( $expr, $username, $password );
if( $result->fault ) {
print "faultcode: " . $result->faultcode . "\n";
print "faultstring: " . $result->faultstring . "\n";
}
else {
foreach my $answer ( $result->valueof( "//GetRelevanceResultResponse/a" ) ) {
print $answer . "\n";
}
}
Question: Quels sont les équivalents SOAP bibliothèques clientes en java? (Celles que j'ai googlé sont si lourdes 15 Mo +)
Comment pourrais-je écrire l'équivalent Java stub code pour Perl ci-dessus?
EDIT 1
Voici le code Stub Je pense que a trouvé la classe WebReportsService.Java
package connect.tivoli;
import Java.net.MalformedURLException;
import Java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceFeature;
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.2.4-b01
* Generated source version: 2.2
*
*/
@WebServiceClient(name = "WebReportsService", targetNamespace = "http://schemas.bigfix.com/Relevance", wsdlLocation = "http://temwebreports/webreports?wsdl")
public class WebReportsService
extends Service
{
private final static URL WEBREPORTSSERVICE_WSDL_LOCATION;
private final static WebServiceException WEBREPORTSSERVICE_EXCEPTION;
private final static QName WEBREPORTSSERVICE_QNAME = new QName("http://schemas.bigfix.com/Relevance", "WebReportsService");
static {
URL url = null;
WebServiceException e = null;
try {
url = new URL("http://temwebreports/webreports?wsdl");
} catch (MalformedURLException ex) {
e = new WebServiceException(ex);
}
WEBREPORTSSERVICE_WSDL_LOCATION = url;
WEBREPORTSSERVICE_EXCEPTION = e;
}
public WebReportsService() {
super(__getWsdlLocation(), WEBREPORTSSERVICE_QNAME);
}
public WebReportsService(WebServiceFeature... features) {
super(__getWsdlLocation(), WEBREPORTSSERVICE_QNAME, features);
}
public WebReportsService(URL wsdlLocation) {
super(wsdlLocation, WEBREPORTSSERVICE_QNAME);
}
public WebReportsService(URL wsdlLocation, WebServiceFeature... features) {
super(wsdlLocation, WEBREPORTSSERVICE_QNAME, features);
}
public WebReportsService(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
public WebReportsService(URL wsdlLocation, QName serviceName, WebServiceFeature... features) {
super(wsdlLocation, serviceName, features);
}
/**
*
* @return
* returns RelevancePortType
*/
@WebEndpoint(name = "RelevancePort")
public RelevancePortType getRelevancePort() {
return super.getPort(new QName("http://schemas.bigfix.com/Relevance", "RelevancePort"), RelevancePortType.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns RelevancePortType
*/
@WebEndpoint(name = "RelevancePort")
public RelevancePortType getRelevancePort(WebServiceFeature... features) {
return super.getPort(new QName("http://schemas.bigfix.com/Relevance", "RelevancePort"), RelevancePortType.class, features);
}
/**
*
* @return
* returns UserManagementPortType
*/
@WebEndpoint(name = "UserManagementPort")
public UserManagementPortType getUserManagementPort() {
return super.getPort(new QName("http://schemas.bigfix.com/Relevance", "UserManagementPort"), UserManagementPortType.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns UserManagementPortType
*/
@WebEndpoint(name = "UserManagementPort")
public UserManagementPortType getUserManagementPort(WebServiceFeature... features) {
return super.getPort(new QName("http://schemas.bigfix.com/Relevance", "UserManagementPort"), UserManagementPortType.class, features);
}
/**
*
* @return
* returns DashboardVariablePortType
*/
@WebEndpoint(name = "DashboardVariablePort")
public DashboardVariablePortType getDashboardVariablePort() {
return super.getPort(new QName("http://schemas.bigfix.com/Relevance", "DashboardVariablePort"), DashboardVariablePortType.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns DashboardVariablePortType
*/
@WebEndpoint(name = "DashboardVariablePort")
public DashboardVariablePortType getDashboardVariablePort(WebServiceFeature... features) {
return super.getPort(new QName("http://schemas.bigfix.com/Relevance", "DashboardVariablePort"), DashboardVariablePortType.class, features);
}
private static URL __getWsdlLocation() {
if (WEBREPORTSSERVICE_EXCEPTION!= null) {
throw WEBREPORTSSERVICE_EXCEPTION;
}
return WEBREPORTSSERVICE_WSDL_LOCATION;
}
}
Solution:
C'était beaucoup plus simple que je pensais que la génération WSDL faisait tout le travail. Voici comment vous utilisez ces classes générées.
package connect.tivoli;
public class testMain {
public static void main(String[] args) {
String relevanceQuery ="names of bes computers ";
WebReportsService wr = new WebReportsService();
RelevancePortType client;
client = wr.getPort(RelevancePortType.class);
System.out.println(client.getRelevanceResult(relevanceQuery, "ad\\username", "password"));
}
Il existe un plugin maven, le cxf-codegen-plugin , qui générera automatiquement Java classes à partir d'un WSDL. Il créera également un client stub pour vous si vous veulent voir comment utiliser le code généré.
Pour cet exemple, j'ai téléchargé le fichier wsdl situé ici et je l'ai enregistré sous stockquote.wsdl.
$ arbre
.
|-- cxf-wsdl2Java-example.iml
|-- pom.xml
`-- src
|-- main
| |-- Java
| | `-- com
| | `-- stackoverflow
| | `-- App.Java
| `-- resources
| `-- stockquote.wsdl
`-- test
`-- Java
`-- com
`-- stackoverflow
`-- AppTest.Java
10 directories, 5 files
$ cat pom.xml
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stackoverflow</groupId>
<artifactId>cxf-wsdl2Java-example</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>cxf-wsdl2Java-example</name>
<url>http://maven.Apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.7.7</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${basedir}/src/main/resources/stockquote.wsdl</wsdl>
<extraargs>
<extraarg>-impl</extraarg>
<extraarg>-verbose</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2Java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
$ mvn generate-sources
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building cxf-wsdl2Java-example 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- cxf-codegen-plugin:2.7.7:wsdl2Java (generate-sources) @ cxf-wsdl2Java-example ---
Loading FrontEnd jaxws ...
Loading DataBinding jaxb ...
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.462s
[INFO] Finished at: Mon Oct 21 14:44:54 MDT 2013
[INFO] Final Memory: 11M/211M
[INFO] ------------------------------------------------------------------------
$ arbre.
.
|-- cxf-wsdl2Java-example.iml
|-- pom.xml
|-- src
| |-- main
| | |-- Java
| | | `-- com
| | | `-- stackoverflow
| | | `-- App.Java
| | `-- resources
| | `-- stockquote.wsdl
| `-- test
| `-- Java
| `-- com
| `-- stackoverflow
| `-- AppTest.Java
`-- target
|-- classes
|-- cxf-codegen-plugin-markers
`-- generated
`-- cxf
`-- net
`-- webservicex
|-- GetQuote.Java
|-- GetQuoteResponse.Java
|-- ObjectFactory.Java
|-- package-info.Java
|-- StockQuoteHttpGetImpl.Java
|-- StockQuoteHttpGet.Java
|-- StockQuoteHttpPostImpl.Java
|-- StockQuoteHttpPost.Java
|-- StockQuote.Java
|-- StockQuoteSoapImpl1.Java
|-- StockQuoteSoapImpl.Java
`-- StockQuoteSoap.Java
17 directories, 17 files
$ cat target/généré/cxf/net/webservicex/StockQuote.Java
package net.webservicex;
import Java.net.MalformedURLException;
import Java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.Service;
/**
* This class was generated by Apache CXF 2.7.7
* 2013-10-21T14:44:54.749-06:00
* Generated source version: 2.7.7
*
*/
@WebServiceClient(name = "StockQuote",
wsdlLocation = "file:/home/axiopisty/projects/cxf-wsdl2Java-example/src/main/resources/stockquote.wsdl",
targetNamespace = "http://www.webserviceX.NET/")
public class StockQuote extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://www.webserviceX.NET/", "StockQuote");
public final static QName StockQuoteHttpPost = new QName("http://www.webserviceX.NET/", "StockQuoteHttpPost");
public final static QName StockQuoteSoap = new QName("http://www.webserviceX.NET/", "StockQuoteSoap");
public final static QName StockQuoteSoap12 = new QName("http://www.webserviceX.NET/", "StockQuoteSoap12");
public final static QName StockQuoteHttpGet = new QName("http://www.webserviceX.NET/", "StockQuoteHttpGet");
static {
URL url = null;
try {
url = new URL("file:/home/axiopisty/projects/cxf-wsdl2Java-example/src/main/resources/stockquote.wsdl");
} catch (MalformedURLException e) {
Java.util.logging.Logger.getLogger(StockQuote.class.getName())
.log(Java.util.logging.Level.INFO,
"Can not initialize the default wsdl from {0}", "file:/home/axiopisty/projects/cxf-wsdl2Java-example/src/main/resources/stockquote.wsdl");
}
WSDL_LOCATION = url;
}
public StockQuote(URL wsdlLocation) {
super(wsdlLocation, SERVICE);
}
public StockQuote(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
public StockQuote() {
super(WSDL_LOCATION, SERVICE);
}
//This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2
//API jar or re-run wsdl2Java with "-frontend jaxws21" to generate JAX-WS 2.1
//compliant code instead.
public StockQuote(WebServiceFeature ... features) {
super(WSDL_LOCATION, SERVICE, features);
}
//This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2
//API jar or re-run wsdl2Java with "-frontend jaxws21" to generate JAX-WS 2.1
//compliant code instead.
public StockQuote(URL wsdlLocation, WebServiceFeature ... features) {
super(wsdlLocation, SERVICE, features);
}
//This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2
//API jar or re-run wsdl2Java with "-frontend jaxws21" to generate JAX-WS 2.1
//compliant code instead.
public StockQuote(URL wsdlLocation, QName serviceName, WebServiceFeature ... features) {
super(wsdlLocation, serviceName, features);
}
/**
*
* @return
* returns StockQuoteHttpPost
*/
@WebEndpoint(name = "StockQuoteHttpPost")
public StockQuoteHttpPost getStockQuoteHttpPost() {
return super.getPort(StockQuoteHttpPost, StockQuoteHttpPost.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns StockQuoteHttpPost
*/
@WebEndpoint(name = "StockQuoteHttpPost")
public StockQuoteHttpPost getStockQuoteHttpPost(WebServiceFeature... features) {
return super.getPort(StockQuoteHttpPost, StockQuoteHttpPost.class, features);
}
/**
*
* @return
* returns StockQuoteSoap
*/
@WebEndpoint(name = "StockQuoteSoap")
public StockQuoteSoap getStockQuoteSoap() {
return super.getPort(StockQuoteSoap, StockQuoteSoap.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns StockQuoteSoap
*/
@WebEndpoint(name = "StockQuoteSoap")
public StockQuoteSoap getStockQuoteSoap(WebServiceFeature... features) {
return super.getPort(StockQuoteSoap, StockQuoteSoap.class, features);
}
/**
*
* @return
* returns StockQuoteSoap
*/
@WebEndpoint(name = "StockQuoteSoap12")
public StockQuoteSoap getStockQuoteSoap12() {
return super.getPort(StockQuoteSoap12, StockQuoteSoap.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns StockQuoteSoap
*/
@WebEndpoint(name = "StockQuoteSoap12")
public StockQuoteSoap getStockQuoteSoap12(WebServiceFeature... features) {
return super.getPort(StockQuoteSoap12, StockQuoteSoap.class, features);
}
/**
*
* @return
* returns StockQuoteHttpGet
*/
@WebEndpoint(name = "StockQuoteHttpGet")
public StockQuoteHttpGet getStockQuoteHttpGet() {
return super.getPort(StockQuoteHttpGet, StockQuoteHttpGet.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns StockQuoteHttpGet
*/
@WebEndpoint(name = "StockQuoteHttpGet")
public StockQuoteHttpGet getStockQuoteHttpGet(WebServiceFeature... features) {
return super.getPort(StockQuoteHttpGet, StockQuoteHttpGet.class, features);
}
}
EDIT 9/11/2017
Voici le contenu du fichier wsdl au cas où le site Web le servant disparaîtrait.
stockquote.wsdl:
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:tm="http://Microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://www.webserviceX.NET/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://www.webserviceX.NET/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://www.webserviceX.NET/">
<s:element name="GetQuote">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="symbol" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetQuoteResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetQuoteResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="string" nillable="true" type="s:string" />
</s:schema>
</wsdl:types>
<wsdl:message name="GetQuoteSoapIn">
<wsdl:part name="parameters" element="tns:GetQuote" />
</wsdl:message>
<wsdl:message name="GetQuoteSoapOut">
<wsdl:part name="parameters" element="tns:GetQuoteResponse" />
</wsdl:message>
<wsdl:message name="GetQuoteHttpGetIn">
<wsdl:part name="symbol" type="s:string" />
</wsdl:message>
<wsdl:message name="GetQuoteHttpGetOut">
<wsdl:part name="Body" element="tns:string" />
</wsdl:message>
<wsdl:message name="GetQuoteHttpPostIn">
<wsdl:part name="symbol" type="s:string" />
</wsdl:message>
<wsdl:message name="GetQuoteHttpPostOut">
<wsdl:part name="Body" element="tns:string" />
</wsdl:message>
<wsdl:portType name="StockQuoteSoap">
<wsdl:operation name="GetQuote">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get Stock quote for a company Symbol</wsdl:documentation>
<wsdl:input message="tns:GetQuoteSoapIn" />
<wsdl:output message="tns:GetQuoteSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:portType name="StockQuoteHttpGet">
<wsdl:operation name="GetQuote">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get Stock quote for a company Symbol</wsdl:documentation>
<wsdl:input message="tns:GetQuoteHttpGetIn" />
<wsdl:output message="tns:GetQuoteHttpGetOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:portType name="StockQuoteHttpPost">
<wsdl:operation name="GetQuote">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get Stock quote for a company Symbol</wsdl:documentation>
<wsdl:input message="tns:GetQuoteHttpPostIn" />
<wsdl:output message="tns:GetQuoteHttpPostOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="StockQuoteSoap" type="tns:StockQuoteSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetQuote">
<soap:operation soapAction="http://www.webserviceX.NET/GetQuote" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="StockQuoteSoap12" type="tns:StockQuoteSoap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetQuote">
<soap12:operation soapAction="http://www.webserviceX.NET/GetQuote" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="StockQuoteHttpGet" type="tns:StockQuoteHttpGet">
<http:binding verb="GET" />
<wsdl:operation name="GetQuote">
<http:operation location="/GetQuote" />
<wsdl:input>
<http:urlEncoded />
</wsdl:input>
<wsdl:output>
<mime:mimeXml part="Body" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="StockQuoteHttpPost" type="tns:StockQuoteHttpPost">
<http:binding verb="POST" />
<wsdl:operation name="GetQuote">
<http:operation location="/GetQuote" />
<wsdl:input>
<mime:content type="application/x-www-form-urlencoded" />
</wsdl:input>
<wsdl:output>
<mime:mimeXml part="Body" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="StockQuote">
<wsdl:port name="StockQuoteSoap" binding="tns:StockQuoteSoap">
<soap:address location="http://www.webservicex.net/stockquote.asmx" />
</wsdl:port>
<wsdl:port name="StockQuoteSoap12" binding="tns:StockQuoteSoap12">
<soap12:address location="http://www.webservicex.net/stockquote.asmx" />
</wsdl:port>
<wsdl:port name="StockQuoteHttpGet" binding="tns:StockQuoteHttpGet">
<http:address location="http://www.webservicex.net/stockquote.asmx" />
</wsdl:port>
<wsdl:port name="StockQuoteHttpPost" binding="tns:StockQuoteHttpPost">
<http:address location="http://www.webservicex.net/stockquote.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>