我有一个相当简单的php/soap标题问题.
这就是我需要的.
<ns1:Identity token="123456789"></ns1:Identity>
Run Code Online (Sandbox Code Playgroud)
这就是我得到的......
<ns1:Identity><item><key>token</key><value>123456789</value></item></ns1:Identity>
Run Code Online (Sandbox Code Playgroud)
使用此代码...
$headers[] = new SoapHeader('http://qpricer.com/Services/Pricing','Identity',array('token'=> '123456789'));
$client->__setSoapHeaders($headers);
Run Code Online (Sandbox Code Playgroud)
使用soapui,我已将问题缩小到此处.
我如何从第二个到第一个?
非常感谢您的帮助,感谢您的时间.
我必须将 Soap 标头添加到 Web 服务响应中。
我尝试通过几种方式来做,首先是:
public SendFileToAlfaOutParms sendFileToAlfa(SendFileToAlfaInParms inParms)
throws MsgWSException {
logger.trace(LogMarkers.IN, "sendFileToAlfa(\ninParms={})", inParms);
List<Header> headers = (List<Header>) wsContext.getMessageContext().get(Header.HEADER_LIST);
headers.add(new Header(new QName("http://WSBigFilesWEBService.WEB.ws.bf.sbrf.ru", "SendFileToAlfaAntiVirusStatus"), "TEST"));
wsContext.getMessageContext().put(Header.HEADER_LIST, headers);
try {
InputStream fileContent = fileService.download(inParms.getTransferJobGUID(), inParms.getChunkIdx());
SendFileToAlfaOutParms outParms = new SendFileToAlfaOutParms();
outParms.setFileContent(new DataHandler(new InputStreamDataSource(fileContent)));
logger.trace(LogMarkers.OUT, "sendFileToAlfa\n{}", outParms);
return outParms;
} catch (Exception e) {
logger.error("Exception in sendFileToAlfa", e);
throw new MsgWSException(e.getMessage(), ExceptionHandlingHelper.convertToExceptionInfo(e));
}
}
Run Code Online (Sandbox Code Playgroud)
第二个是通过 cxf OutInteceptor:
public void handleMessage(SoapMessage message) throws Fault {
List<Header> list = message.getHeaders();
QName q = …Run Code Online (Sandbox Code Playgroud) 我使用Spring-WS用于消费web服务这孔潘若SOAP信封有空头元素.我发现默认的SOAPMessage实现添加了一个.
我该如何删除它?
提前致谢
我正在尝试通过 Zeep 进行 SOAP 调用。WSDL 不包含头定义,但 SOAP 服务器需要以下头:
<soapenv:Header>
<ns2:UsernameToken xmlns:ns2="http://siebel.com/webservices">ORNODINTFC_WW@ORACLE.COM</ns2:UsernameToken>
</soapenv:Header>
Run Code Online (Sandbox Code Playgroud)
这是我按照 zeep 文档执行此操作的方式:
header = xsd.Element(
'{http://siebel.com/webservices}UsernameToken',
xsd.AnySimpleType()
)
header_val = header('ORNODINTFC_WW@ORACLE.COM')
client.create_message(client.service, 'process', _soapheaders=[header_val],payload=msg, Mode='ODRFCQUERY', UserName='ORNODINTFC_WW@ORACLE.COM', Password='0r10nTkn')
Run Code Online (Sandbox Code Playgroud)
但是,我收到 create_message 的以下错误
Traceback (most recent call last):
File "<pyshell#119>", line 1, in <module>
xml_msg = client.create_message(client.service, 'process', _soapheaders=[header_val],payload=msg, Mode='ODRFCQUERY', UserName='ORNODINTFC_WW@ORACLE.COM', Password='0r10nTkn')
File "C:\Users\shubgang\AppData\Roaming\Python\Python36\site-packages\zeep\client.py", line 131, in create_message
operation_name, args, kwargs, client=self)
File "C:\Users\shubgang\AppData\Roaming\Python\Python36\site-packages\zeep\wsdl\bindings\soap.py", line 68, in _create
serialized = operation_obj.create(*args, **kwargs)
File "C:\Users\shubgang\AppData\Roaming\Python\Python36\site-packages\zeep\wsdl\definitions.py", line 200, in create
return self.input.serialize(*args, …Run Code Online (Sandbox Code Playgroud) 我已将 Web 服务设置为接收"TestHeader"带有 param名称的 soap 标头"Name"
如何在我的客户端中创建一个 soap 标头并将其发送到服务?
到目前为止,我已经在我的客户端中创建了它。
public class TestHeader : SoapHeader
{
public String Name;
}
Run Code Online (Sandbox Code Playgroud)
初始化我的服务,
Test.TestServicesClient SOAP = new Test.TestServicesClient();
Run Code Online (Sandbox Code Playgroud)
初始化我的标题。
TestHeader header = new TestHeader();
Run Code Online (Sandbox Code Playgroud)
在标题中设置变量
header.Name = "BoB";
Run Code Online (Sandbox Code Playgroud)
怎么办?我试过遵循 MSDN 和其他教程,但一无所获。
测试服务.cs
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;
namespace Test
{
// Define a SOAP …Run Code Online (Sandbox Code Playgroud) 请帮助:我试图从SOAPUI调用WebService,我注意到该服务需要用户名和密码,我通过请求参数提供.我注意到原始XML包含添加到SOAPHeader的用户/密码片段.摘录如下:
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsse:UsernameToken wsu:Id="UsernameToken-3" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><wsse:Username>testuser</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">testpassword&</wsse:Password><wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">RYadQak91mr7dB+5hyt8yw==</wsse:Nonce><wsu:Created>2011-10-24T20:13:43.039Z</wsu:Created></wsse:UsernameToken>
</wsse:Security>
Run Code Online (Sandbox Code Playgroud)
现在我想通过添加用户/密码详细信息来实现同样的目的,如下面的代码所示:代码片段是:
org.tempuri.myService.MyServiceStub stub = new org.tempuri.myService.MyServiceStub();
ServiceClient sc = stub._getServiceClient();
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();
auth.setUsername("testuser");
auth.setPassword("password$");
sc.getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE,auth);
org.tempuri.myService.MyServiceDocument myService4 = (org.tempuri.myService.MyServiceDocument)getTestObject(org.tempuri.myService.MyServiceDocument.class);
MyService lval = MyService4.addNewMyService();
MyServiceParameters lvParams = lval.addNewParameters();
lvParams.setA("24");
lvParams.setB("10");
lval.setParameters(lvParams);
myService4.setMyService(lval);
Run Code Online (Sandbox Code Playgroud)
但我得到了Axis故障异常,需要帮助我正在用上面的代码做的错误.轴故障异常详细信息:
org.apache.axis2.AxisFault: Exception occurred while executing service 'MyService'.
at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:531)
at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:375)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
at org.tempuri.myService.MyServiceStub.myService(MyServiceStub.java:182)
at org.tempuri.myService.MyServiceTest.main(MyServiceTest.java:55)
MyServiceResponseDocument lvdoc = stub.myService(myService4);
Run Code Online (Sandbox Code Playgroud) 我正在研究春季网络服务.我需要在请求和响应消息中添加一些自定义元素.它应该如下所示:
<soapenv:Envelope>
<soapenv:Header>
<tid:SplsTID>
<tid:Trantype>123</tid:Trantype>
<tid:Tranver>234</tid:Tranver>
</tid:SplsTID>
</soapenv:Header>
<soapenv:Body>
<get:GetOrderNumberRequest LoggingLevel="REGULAR" MonitorFlag="Y">
<get:Header>
<get:TransactionId>111</get:TransactionId>
<get:SourceSystemId>SOMS</get:SourceSystemId>
<get:DateTime>2011-11-11T11:11:11</get:DateTime>
</get:Header>
<get:Body>
<get:StaplesOrderNumber RangeFlag="N" ReleaseFlag="N">
<get:OrderNumber Count="1" End="11" Start="9"/>
</get:StaplesOrderNumber>
</get:Body>
</get:GetOrderNumberRequest>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
我能够追加<tid:SplsTID>下<soapenv:Header>通过修改WSDL文件的请求.看起来像这样:
<wsdl:message name="GetOrderNumberRequest">
<wsdl:part element="tns:GetOrderNumberRequest" name="GetOrderNumberRequest">
</wsdl:part>
<wsdl:part element="sch1:SplsTID" name="SplsTID">
</wsdl:part>
</wsdl:message>
<wsdl:message name="GetOrderNumberResponse">
<wsdl:part element="tns:GetOrderNumberResponse" name="GetOrderNumberResponse">
</wsdl:part>
<wsdl:part element="sch1:SplsTID" name="SplsTID">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ONAS">
<wsdl:operation name="GetOrderNumber">
<wsdl:input message="tns:GetOrderNumberRequest" name="GetOrderNumberRequest">
</wsdl:input>
<wsdl:output message="tns:GetOrderNumberResponse" name="GetOrderNumberResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
Run Code Online (Sandbox Code Playgroud)
问题是,我想<tid:SplsTID>从请求中读取部分并希望将其附加到响应的soap标题部分,这是没有发生的.我正在使用基于注释的终点.什么是读取soap标头的代码,并在响应中附加相同的代码.
目前我的终点课是:
@Endpoint
public class OrderNumberServiceEndPoint { …Run Code Online (Sandbox Code Playgroud) 我想从SOAP标头中提取一个名为ServiceGroupID的元素,它指定事务的会话.我需要这个,以便我可以使用SOAP会话将请求定向到同一服务器.我的XML如下:
<?xml version="1.0" encoding="http://schemas.xmlsoap.org/soap/envelope/" standalone="no"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:ReplyTo>
<wsa:Address>http://www.w3.org/2005/08/addressing/none</wsa:Address>
<wsa:ReferenceParameters>
<axis2:ServiceGroupId xmlns:axis2="http://ws.apache.org/namespaces/axis2">urn:uuid:99A029EBBC70DBEB221347349722532</axis2:ServiceGroupId>
</wsa:ReferenceParameters>
</wsa:ReplyTo>
<wsa:MessageID>urn:uuid:99A029EBBC70DBEB221347349722564</wsa:MessageID>
<wsa:Action>Perform some action</wsa:Action>
<wsa:RelatesTo>urn:uuid:63AD67826AA44DAE8C1347349721356</wsa:RelatesTo>
</soapenv:Header>
Run Code Online (Sandbox Code Playgroud)
我想知道如何使用Xpath从上面的XML中提取Session GroupId.
任何帮助将非常感谢.
我们需要使用其他团队开发的Web服务.使用JAX-WS生成web服务.我们使用wsimport生成客户端存根.
问题是我需要将以下信息作为标题与SOAP正文一起传递:
<soapenv:Header>
<ns1:HeaderData xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:ns1="http://www.example.com/esb/data_type/HeaderData/v1">
<ChannelIdentifier>ABC</ChannelIdentifier>
</ns1:HeaderData>
</soapenv:Header>
Run Code Online (Sandbox Code Playgroud)
我们正在使用:
BindingProvider.getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
serviceConfig.getServiceEndPoint()
);
Run Code Online (Sandbox Code Playgroud)
设置端点.
任何人都可以建议如何通过请求传递标题?
谢谢,VK
我正在从wsdl创建Java Web服务客户端.我使用Eclipses的Dynamic Web Project和新的Web Services Client来生成带有Apache Axis 1.4的wsdl2java的代码.我需要为此代码添加SOAP身份验证,以便它与服务一起使用.我在生成的代码中找不到这样做的地方.经过大量的研究,我发现了这个,到目前为止,我已经将其用作我的代码的主干.
在我收到"处理邮件安全性时发生错误"之前或其他方面.现在我来了
"例外:不明白"MustUnderstand"标题:{ http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd }安全信息:空值"
我已经尝试了很多东西来克服这个异常.这是我现在到达的代码.
javax.xml.namespace.QName headerName = new javax.xml.namespace.QName(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security");
org.apache.axis.message.SOAPHeaderElement header = new org.apache.axis.message.SOAPHeaderElement(headerName);
header.setActor(null);
header.setMustUnderstand(true);
// Add the UsernameToken element to the WS-Security header
javax.xml.soap.SOAPElement utElem = header.addChildElement("UsernameToken");
utElem.setAttribute("Id", "uuid-3453f017-d595-4a5b-bc16-da53e5831cd1-1");
javax.xml.soap.SOAPElement userNameElem = utElem.addChildElement("Username");
userNameElem.setValue("username");
javax.xml.soap.SOAPElement passwordElem = utElem.addChildElement("Password");
passwordElem.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
passwordElem.setValue("password");
header.setProcessed(true);
// Finally, attach the header to the binding.
setHeader(header)
Run Code Online (Sandbox Code Playgroud)
此代码位于我的Binding_ServiceStub类中(在其"createCall方法"中).
我们使用这个wsdl在C#和VB中创建了客户端,并且只需更改ClientCredentials变量就可以轻松实现,该变量是生成的代理类的扩展.我希望这里有类似的东西.
这是wsdl代码中的安全策略.
<wsp:Policy><sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"><wsp:Policy><sp:WssUsernameToken10/></wsp:Policy></sp:UsernameToken></wsp:Policy>
Run Code Online (Sandbox Code Playgroud)
有谁知道我还能在这做什么?为什么会发生这种异常?我已经尝试了很多不同的前缀和setProcesses以及setMustUnderstand值的组合都是徒劳的(并且基于我对此异常的研究).
如果有人知道在wsdl2java代码中添加Soap头认证的方法,我也会采取这种方式.只是需要这个工作,你会认为这样的事情会更直接或至少有更多的例子.
更新 - 确认使用SOAPUI传递的相同头文件正常工作.必须是框架的东西?我创建了一个自定义处理程序来处理SOAP消息,但这没有帮助.Axis 1.4和JAX-RPC是问题吗?(我知道他们已经过时但仍然......)