SAAJ:如何为 SoapHeaderElement 创建 child 元素
SAAJ: how to create child elements for SoapHeaderElement
我正在尝试 post 一些数据到远程机器,但是 returns 一个错误
<soapenv:Fault>
<faultcode xmlns:ns1="http://xml.apache.org/axis/">ns1:Client.NoSOAPAction</faultcode>
<faultstring>no SOAPAction header!</faultstring>
我的猜测是我发送 header 元素的方式有问题:
// Java code snip
SOAPHeader header = envelope.getHeader();
header.setPrefix("soapenv");
QName headerElementName = new QName("http://soft.com/webservices/", "AuthHeader");
SOAPHeaderElement authHeader = header.addHeaderElement(headerElementName);
QName headerChild = new QName("Username");
SOAPElement userName = authHeader.addChildElement(headerChild);
userName.addTextNode("smart");
headerChild = new QName("Password");
SOAPElement passwd = authHeader.addChildElement(headerChild);
passwd.addTextNode("smart");
从响应中可以看出,远程机器上的 soap 工具包是 axis,最终发送的请求及其响应如下所示:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ocs="http://ocs.soft.com">
<soapenv:Header>
<AuthHeader xmlns="http://soft.com/webservices/">
<Username>smart</Username>
<Password>smart</Password>
</AuthHeader>
</soapenv:Header>
<soapenv:Body><ocs:doService><ocs:in0 xmlns:ocs="http://ocs.soft.com"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<zsmart>
<Data>
<header>
<ACTION_ID>ModifyBalReturnAllBal</ACTION_ID>
<REQUEST_ID>005200907310022</REQUEST_ID>
</header>
<body>
<MSISDN>254775127966</MSISDN>
<AccountCode></AccountCode>
<BalID></BalID>
<AddBalance>10000</AddBalance>
<AddDays>0</AddDays>
<TransactionSN>00520090731002195</TransactionSN>
</body>
</Data>
</zsmart>
]]></ocs:in0></ocs:doService></soapenv:Body></soapenv:Envelope>
HTTP/1.1 500 Internal Server Error
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Wed, 20 Jan 2016 16:56:52 GMT
Server: Apache-Coyote/1.1
Connection: close
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode xmlns:ns1="http://xml.apache.org/axis/">ns1:Client.NoSOAPAction</faultcode>
<faultstring>no SOAPAction header!</faultstring>
<detail>
<ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">ocstest</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
我已经浏览了 soap 的文档数百万次,并且确定这是有效的 soap 请求。
我想知道我的 header child 元素部分是否定义明确。
如果是,是否是轴上的身份验证问题?
在此上下文中,"header" 不是指 SOAP header,而是指 HTTP header。使用 SAAJ,SOAPAction
header 设置如下:
MimeHeaders headers = message.getMimeHeaders();
headers.addHeader("SOAPAction", "http://www.example.org/someaction");
message
就是SOAPMessage
object。 SOAP 操作在服务的 WSDL 中指定。
我正在尝试 post 一些数据到远程机器,但是 returns 一个错误
<soapenv:Fault>
<faultcode xmlns:ns1="http://xml.apache.org/axis/">ns1:Client.NoSOAPAction</faultcode>
<faultstring>no SOAPAction header!</faultstring>
我的猜测是我发送 header 元素的方式有问题:
// Java code snip
SOAPHeader header = envelope.getHeader();
header.setPrefix("soapenv");
QName headerElementName = new QName("http://soft.com/webservices/", "AuthHeader");
SOAPHeaderElement authHeader = header.addHeaderElement(headerElementName);
QName headerChild = new QName("Username");
SOAPElement userName = authHeader.addChildElement(headerChild);
userName.addTextNode("smart");
headerChild = new QName("Password");
SOAPElement passwd = authHeader.addChildElement(headerChild);
passwd.addTextNode("smart");
从响应中可以看出,远程机器上的 soap 工具包是 axis,最终发送的请求及其响应如下所示:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ocs="http://ocs.soft.com">
<soapenv:Header>
<AuthHeader xmlns="http://soft.com/webservices/">
<Username>smart</Username>
<Password>smart</Password>
</AuthHeader>
</soapenv:Header>
<soapenv:Body><ocs:doService><ocs:in0 xmlns:ocs="http://ocs.soft.com"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<zsmart>
<Data>
<header>
<ACTION_ID>ModifyBalReturnAllBal</ACTION_ID>
<REQUEST_ID>005200907310022</REQUEST_ID>
</header>
<body>
<MSISDN>254775127966</MSISDN>
<AccountCode></AccountCode>
<BalID></BalID>
<AddBalance>10000</AddBalance>
<AddDays>0</AddDays>
<TransactionSN>00520090731002195</TransactionSN>
</body>
</Data>
</zsmart>
]]></ocs:in0></ocs:doService></soapenv:Body></soapenv:Envelope>
HTTP/1.1 500 Internal Server Error
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Wed, 20 Jan 2016 16:56:52 GMT
Server: Apache-Coyote/1.1
Connection: close
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode xmlns:ns1="http://xml.apache.org/axis/">ns1:Client.NoSOAPAction</faultcode>
<faultstring>no SOAPAction header!</faultstring>
<detail>
<ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">ocstest</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
我已经浏览了 soap 的文档数百万次,并且确定这是有效的 soap 请求。
我想知道我的 header child 元素部分是否定义明确。
如果是,是否是轴上的身份验证问题?
在此上下文中,"header" 不是指 SOAP header,而是指 HTTP header。使用 SAAJ,SOAPAction
header 设置如下:
MimeHeaders headers = message.getMimeHeaders();
headers.addHeader("SOAPAction", "http://www.example.org/someaction");
message
就是SOAPMessage
object。 SOAP 操作在服务的 WSDL 中指定。