[英]Web service client given WSDL
I am trying to create a web service client in Java. 我正在尝试用Java创建一个Web服务客户端。 I am not aware of how to do it.
我不知道该怎么做。 This is a URL for WSDL: https://testservices.gatewayedi.com/PayerList/payerlist.asmx?wsdl
这是WSDL的URL: https : //testservices.gatewayedi.com/PayerList/payerlist.asmx?wsdl
This is the WSDL: 这是WSDL:
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 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="https://ws.gatewayedi.com/" 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="https://ws.gatewayedi.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="https://ws.gatewayedi.com/">
<s:element name="Ping">
<s:complexType />
</s:element>
<s:element name="PingResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="PingResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AuthSOAPHeader" type="tns:AuthSOAPHeader" />
<s:complexType name="AuthSOAPHeader">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="User" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string" />
</s:sequence>
<s:anyAttribute />
</s:complexType>
<s:element name="GetXMLPayerList">
<s:complexType />
</s:element>
<s:element name="GetXMLPayerListResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetXMLPayerListResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="getDocLinks">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="pid" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="getDocLinksResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="getDocLinksResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>
<wsdl:message name="PingSoapIn">
<wsdl:part name="parameters" element="tns:Ping" />
</wsdl:message>
<wsdl:message name="PingSoapOut">
<wsdl:part name="parameters" element="tns:PingResponse" />
</wsdl:message>
<wsdl:message name="PingAuthSOAPHeader">
<wsdl:part name="AuthSOAPHeader" element="tns:AuthSOAPHeader" />
</wsdl:message>
<wsdl:message name="GetXMLPayerListSoapIn">
<wsdl:part name="parameters" element="tns:GetXMLPayerList" />
</wsdl:message>
<wsdl:message name="GetXMLPayerListSoapOut">
<wsdl:part name="parameters" element="tns:GetXMLPayerListResponse" />
</wsdl:message>
<wsdl:message name="GetXMLPayerListAuthSOAPHeader">
<wsdl:part name="AuthSOAPHeader" element="tns:AuthSOAPHeader" />
</wsdl:message>
<wsdl:message name="getDocLinksSoapIn">
<wsdl:part name="parameters" element="tns:getDocLinks" />
</wsdl:message>
<wsdl:message name="getDocLinksSoapOut">
<wsdl:part name="parameters" element="tns:getDocLinksResponse" />
</wsdl:message>
<wsdl:message name="getDocLinksAuthSOAPHeader">
<wsdl:part name="AuthSOAPHeader" element="tns:AuthSOAPHeader" />
</wsdl:message>
<wsdl:portType name="PayerListSoap">
<wsdl:operation name="Ping">
<wsdl:input message="tns:PingSoapIn" />
<wsdl:output message="tns:PingSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetXMLPayerList">
<wsdl:input message="tns:GetXMLPayerListSoapIn" />
<wsdl:output message="tns:GetXMLPayerListSoapOut" />
</wsdl:operation>
<wsdl:operation name="getDocLinks">
<wsdl:input message="tns:getDocLinksSoapIn" />
<wsdl:output message="tns:getDocLinksSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="PayerListSoap" type="tns:PayerListSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="Ping">
<soap:operation soapAction="https://ws.gatewayedi.com/Ping" style="document" />
<wsdl:input>
<soap:body use="literal" />
<soap:header message="tns:PingAuthSOAPHeader" part="AuthSOAPHeader" use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetXMLPayerList">
<soap:operation soapAction="https://ws.gatewayedi.com/GetXMLPayerList" style="document" />
<wsdl:input>
<soap:body use="literal" />
<soap:header message="tns:GetXMLPayerListAuthSOAPHeader" part="AuthSOAPHeader" use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getDocLinks">
<soap:operation soapAction="https://ws.gatewayedi.com/getDocLinks" style="document" />
<wsdl:input>
<soap:body use="literal" />
<soap:header message="tns:getDocLinksAuthSOAPHeader" part="AuthSOAPHeader" use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="PayerListSoap12" type="tns:PayerListSoap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="Ping">
<soap12:operation soapAction="https://ws.gatewayedi.com/Ping" style="document" />
<wsdl:input>
<soap12:body use="literal" />
<soap12:header message="tns:PingAuthSOAPHeader" part="AuthSOAPHeader" use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetXMLPayerList">
<soap12:operation soapAction="https://ws.gatewayedi.com/GetXMLPayerList" style="document" />
<wsdl:input>
<soap12:body use="literal" />
<soap12:header message="tns:GetXMLPayerListAuthSOAPHeader" part="AuthSOAPHeader" use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getDocLinks">
<soap12:operation soapAction="https://ws.gatewayedi.com/getDocLinks" style="document" />
<wsdl:input>
<soap12:body use="literal" />
<soap12:header message="tns:getDocLinksAuthSOAPHeader" part="AuthSOAPHeader" use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="PayerList">
<wsdl:port name="PayerListSoap" binding="tns:PayerListSoap">
<soap:address location="https://testservices.gatewayedi.com/PayerList/payerlist.asmx" />
</wsdl:port>
<wsdl:port name="PayerListSoap12" binding="tns:PayerListSoap12">
<soap12:address location="https://testservices.gatewayedi.com/PayerList/payerlist.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
There are three methods in the service. 服务中有三种方法。
I am trying to call this method using SOAP. 我试图使用SOAP调用此方法。
The XML message format is: XML消息格式为:
POST /PayerList/payerlist.asmx HTTP/1.1
Host: testservices.gatewayedi.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: <<insert message length here>>
<?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:Header> <AuthSOAPHeader xmlns="https://ws.gatewayedi.com/"> <User><<insert user id here>>
</User>
<Password><<insert user web password here>> </Password>
</AuthSOAPHeader>
</soap12:Header> <soap12:Body> <Ping xmlns="https://ws.gatewayedi.com/" />
</soap12:Body>
</soap12:Envelope>
Anyone who knows the solution please let me know. 知道解决方案的任何人请告诉我。 Any help is really appreciable.
任何帮助都非常明显。
As hinted in a comment to Jon's answer , my recommendation would be to use a JAX-WS implementation like JAX-WS RI (which is included in Java 6) or Apache CXF. 正如对Jon的回答所暗示的那样,我的建议是使用JAX-WS实现,如JAX-WS RI(包含在Java 6中)或Apache CXF。
I'll use JAX-WS RI to illustrate my answer as it's available out of the box, on the command line (to explain the steps) but I'd recommend using an IDE with good JAX-WS support eg NetBeans (see the resources at the end of the answer). 我将使用JAX-WS RI来说明我的答案,因为它可以在命令行中开箱即用(解释步骤),但我建议使用具有良好JAX-WS支持的IDE,例如NetBeans(请参阅参考资料)在答案的最后)。
First run wsimport
to generate JAX-WS artifacts (to put it simply, the classes you'll need to invoke the web service): 首先运行
wsimport
来生成JAX-WS工件(简单来说,就是调用Web服务所需的类):
wsimport -d generated -extension -keep -p com.gatewayedi.ws -XadditionalHeaders https://testservices.gatewayedi.com/PayerList/payerlist.asmx?wsdl
About the options: 关于选项:
-d
is used to specify the target directory for the generated stuff -d
用于指定生成的东西的目标目录 -extension
is used to allow extensions (the WSDL is using a non-standard SOAP 1.2 binding) -extension
用于允许扩展(WSDL使用非标准的SOAP 1.2绑定) -keep
is to keep generated .java
sources (this is will ease the development) -keep
是保持生成的.java
源码(这将简化开发) -p
is used to specify a package for the generated artifacts -p
用于指定生成的工件的包 -XadditionalHeaders
is used to map additional WSDL headers (that are not part of the input or output contract defined in the portType
operation) to method parameters (this will make invoking the service easier). -XadditionalHeaders
用于将其他WSDL头(不是portType
操作中定义的输入或输出契约的一部分)映射到方法参数 (这将使调用服务更容易)。 Sorry if some of the vocabulary is cryptic but, well, welcome to SOAP web services :) 对不起,如果一些词汇是神秘的,但是,欢迎使用SOAP Web服务:)
Here is a simple client showing how to invoke one of the available operations using the generated classes: 这是一个简单的客户端,展示了如何使用生成的类调用其中一个可用操作:
import com.gatewayedi.ws.AuthSOAPHeader;
import com.gatewayedi.ws.PayerList;
import com.gatewayedi.ws.PayerListSoap;
public class Main {
public static void main(String[] args) {
new Main().callWebService();
}
private void callWebService() {
PayerList service = new PayerList();
PayerListSoap port = service.getPayerListSoap();
AuthSOAPHeader authSOAPHeader = new AuthSOAPHeader();
authSOAPHeader.setUser("test");
authSOAPHeader.setPassword("test");
String payerList = port.ping(authSOAPHeader);
System.out.println(payerList);
}
}
Below, the generated request: 下面,生成的请求:
<?xml version="1.0" standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<AuthSOAPHeader xmlns="https://ws.gatewayedi.com/">
<User>test</User>
<Password>test</Password>
</AuthSOAPHeader>
</S:Header>
<S:Body>
<Ping xmlns="https://ws.gatewayedi.com/"/>
</S:Body>
</S:Envelope>
Don't know what credentials you're supposed to pass though. 不知道你应该通过什么证书。
EDIT: As Pascal appears to have recent experience on this, it's probably worth reading his comment: 编辑:由于Pascal似乎最近有这方面的经验,所以值得一读他的评论:
Nowadays, I wouldn't use Axis (I actually recommend against using it).
如今,我不会使用Axis(我实际上建议不要使用它)。 Apache CXF or JAX-WS RI (which is included in Java 6 and offers wsimport and wsgen command line commands) are IMO much better stacks and easier to use.
Apache CXF或JAX-WS RI(包含在Java 6中并提供wsimport和wsgen命令行命令)是IMO更好的堆栈并且更易于使用。
So, look at the Apache CXF documentation and the introduction to JAX-WS . 因此,请查看Apache CXF文档和JAX-WS简介 。
Original answer 原始答案
Have you tried using Apache Axis ? 您是否尝试过使用Apache Axis ? It's a while since I've done any Java web services, but that was what I used last time... You'll want to look at WSDL2Java to generate code from the WSDL.
我已经有一段时间了,因为我已经完成了任何Java Web服务,但这就是我上次使用的...您将要查看WSDL2Java以从WSDL生成代码。
Apart from what has been suggested above, you can also use an IDE such as Netbeans . 除了上面提到的内容之外,您还可以使用Netbeans等IDE。 It basically allows you to create a webservice client through wizards, without having to go through making all the configurations yourself.
它基本上允许您通过向导创建Web服务客户端,而无需自己完成所有配置。 This video shows you how to first create a webservice and then how to create its corresponding client.
此视频向您展示如何首先创建Web服务,然后如何创建其相应的客户端。 Note that in the video, whoever is doing the tutorial consumes the webservice through another web application.
请注意,在视频中,无论谁在做教程,都会通过其他Web应用程序使用Web服务。 If you want to consume the webservice through a desktop application, just do the same procedure, the only difference is that instead of a webproject, you do it on the project you are working on.
如果您想通过桌面应用程序使用Web服务,只需执行相同的过程,唯一的区别是您在正在处理的项目上执行此操作而不是Web项目。
I would recomment to have a look at Apache Axis2 or Apache WSIF (Web Services Invocation Framework). 我建议看一下Apache Axis2或Apache WSIF(Web服务调用框架)。
Links: 链接:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.