我正在尝试用Java创建一个Web服务客户端.我不知道该怎么做.这是WSDL的URL:https://testservices.gatewayedi.com/PayerList/payerlist.asmx?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 …Run Code Online (Sandbox Code Playgroud) 我很擅长使用Web服务,所以我发现这很令人困惑.
如果我有一个URL我试图发布一些JSON数据,我理解如何使用CURL PHP方法做到这一点.
我想知道的是,如果我这样做,并且URL有某种服务器响应..如何在我的php中获得该响应并使用它在PHP中采取不同的操作?
谢谢!
-Elliot
是否可以使用CXF将请求/响应记录为XML,理想情况下是单独的文件,以便我可以监视应用程序正在做什么?
我必须与一组Web服务进行交互,每个Web服务都有自己的WSDL和XSD.XSD有时合并在一个文件中,有时会分布在多个文件中(20-30).但是,根据经验,我知道大多数消息结构和数据共享一个大的公共子集,在不同的事务中可能只有20%不同.
不幸的是,我无法控制服务器部件或服务声明,所以让他们修复它是不可能的.客户端的第一个版本单独生成每个服务,然后将它们用作单独的外观,以形成连贯的更高级别服务,作为另一个系统的适配器.
我使用CXF和默认的JAXB绑定,并为每个服务强加了不同的生成包.我这样做是因为一些大多数服务都使用通用数据模型,但并非所有服务都使用相同的版本或定制,所以我有冲突,因此选择了暴力,所以我可以完成系统.
但是,这会导致适配器的内存要求在每个服务加载其上下文时通过屋顶.现在,即使在我开始发送请求和处理响应之前,我还有500M的内存仅用于容纳服务客户端的适配器.虽然我可以使用当前情况毫无问题地运行系统,但这会产生危害解决方案部署的约束; 我的客户希望大幅减少这种情况(60%或更多),以便该系统可以与其他系统一起安装而无需硬件升级.
问题如下: 是否有工具或技术允许我将每个交易的公共部分放在一起,以便它们可以生成一次并在需要时引用?
除了将系统重新分解为不同的框架或数据绑定所需的时间之外,我不受CXF或JAXB的约束.
预先感谢您的帮助.
---编辑---
谢谢Blaise.这指向JAXB的一个有用的功能:剧集.不幸的是,我仍然需要提取不同服务的公共基础部分.所以现在我需要的是一种通过结构差异提取这个公共部分的方法,这是一个diff工具,可以了解XSD描述的结构和类型层次结构,以便使用适当的引用来连接公共部分.专业部分.
下面是一个演示SOAP请求消息:
HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
<SOAP-ENV:Header>
<t:SessionOrder
xmlns:t="http://example.com"
xsi:type="xsd:int" mustUnderstand="1">
5
</t:SessionOrder>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<GetStockQuote
xmlns="http://someexample.com">
<Price>MSFT</Price>
</GetStockQuote>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
我们可以看到,这个SOAP消息被编码为好像它是一个网页.为什么我们必须使用HTTP协议?SOAP消息只是一些XML,为什么我们不只是使用XML作为信息交换协议并摆脱HTTP头(因此只留下HTTP).
非常感谢.
HTTP不是传输级协议.它只是一个应用程序级协议.它与运输无关.实际上,我的问题是将HTTP内容添加到SOAP消息的动机是什么?
我正在尝试使用JAX WS为PayPal Express Checkout API实现简单的Web服务客户端.PayPal Express Checkout API提供了WSDL文件,我可以使用CXF的wsdl2java实用程序从中生成Java类.
出于身份验证原因,它需要为每个请求添加SOAP Header.这个标题非常简单,应该如下所示:https: //cms.paypal.com/us/cgi-bin/?cmd = __render-content&content_ID = developer/e_howto_api_ECSOAPAPasics #id09C3I0CF0O6
从WSDL类生成的包括ebay.apis.eblbasecomponents.CustomSecurityHeaderType类,它表示我需要添加到每个请求的标头.
所以问题是:如何考虑以下条件,将手动创建的CustomSecurityHeaderType类实例添加到SOAP请求的标题中:
我尝试通过java代码调用HTTPS SOAP Web服务:
URL url = new URL("https://somehost:8181/services/"SomeService?wsdl");
QName qname = new QName("http://services.somehost.com/", "SomeService");
Service service = Service.create(url, qname);
SomeService port = service.getPort(SomeService .class);
port.doSomething();
Run Code Online (Sandbox Code Playgroud)
但得到例外:
threw an unexpected exception: javax.xml.ws.soap.SOAPFaultException: Security Requirements not met - No Security header in message
Run Code Online (Sandbox Code Playgroud)
当我分析正确的请求样本时,我确定它必须包含标题:
<S:Header>
<To xmlns="http://www.w3.org/2005/08/addressing">http://somehost:8181/services/SomeService</To>
<Action xmlns="http://www.w3.org/2005/08/addressing">https://somehost:8181/services/"SomeService/doSomethingRequest</Action>
<ReplyTo xmlns="http://www.w3.org/2005/08/addressing">
<Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
</ReplyTo>
<MessageID xmlns="http://www.w3.org/2005/08/addressing">uuid:3428539e-d645-72ae-adc0-5423c1e68942</MessageID>
<wsse:Security S:mustUnderstand="true">
<wsu:Timestamp wsu:Id="_1" xmlns:ns14="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512" xmlns:ns13="http://schemas.xmlsoap.org/soap/envelope/">
<wsu:Created>2013-01-15T16:36:30Z</wsu:Created>
<wsu:Expires>2014-01-15T14:06:30Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
Run Code Online (Sandbox Code Playgroud)
那么如何将此标头添加到我的SOAP请求中?
尝试从SOAP响应中检索SOAP正文,但是收到此错误:
NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.
Document doc = soapResMsg.getSOAPBody().extractContentAsDocument(); -- Exception is thrown here
org.dom4j.io.DOMReader d4Reader = new org.dom4j.io.DOMReader();
org.dom4j.Document d4doc = d4Reader.read(doc);
Run Code Online (Sandbox Code Playgroud)
使用Saaj1.4
对此有什么解决方法?
我尝试从使用PasswordText WSS类型的Web服务获取信息.首先,我使用soapUI测试它并成功获取数据.然后我在Java上实现了身份验证,编写了SecurityHandler:
public final class SecurityHandler implements SOAPHandler<SOAPMessageContext> {
...
@Override
public boolean handleMessage(SOAPMessageContext messageContext) {
boolean outInd = (Boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outInd) {
try {
WSSecUsernameToken builder = new WSSecUsernameToken();
builder.setPasswordType(WSConstants.PASSWORD_TEXT);
builder.setUserInfo(_username, _password);
builder.addNonce();
builder.addCreated();
Document doc = messageContext.getMessage().getSOAPPart().getEnvelope().getOwnerDocument();
WSSecHeader secHeader = new WSSecHeader();
secHeader.insertSecurityHeader(doc);
builder.build(doc, secHeader);
} catch (Exception e) {
LOGGER.error("Unable to handle SOAP message", e);
return false;
}
}
return true;
}
...
}
Run Code Online (Sandbox Code Playgroud)
我查看了doc对象,XMLUtils.PrettyDocumentToString(doc)看到它看起来像是由soupUI发送的XML - 所有认证信息(登录,密码,现时和创建时间)都已到位,标签的mustUnderstand属性Security为true.
然后我遇到了错误:
javax.xml.ws.soap.SOAPFaultException:MustUnderstand标题:[{ http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd …
我想对这样的URL发出POST请求:
http://localhost/resource?auth_token=1234
Run Code Online (Sandbox Code Playgroud)
我想在体内发送JSON.我的代码看起来像这样:
var client = new RestClient("http://localhost");
var request = new RestRequest("resource", Method.POST);
request.AddParameter("auth_token", "1234");
request.AddBody(json);
var response = client.Execute(request);
Run Code Online (Sandbox Code Playgroud)
如何将auth_token参数设置为GET参数并将请求设置为POST?