我正在尝试在我的Java代码中添加一个自定义标头,该标头称为Soap Web服务。一路走来都是正确的,但是我无法添加该网址。有人可以建议我哪里出问题了吗?
private SOAPMessage createSOAPRequest(String request) throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
InputStream stream = new ByteArrayInputStream(request.getBytes(StandardCharsets.UTF_8));
SOAPMessage soapMessage = messageFactory.createMessage(new MimeHeaders(), stream);
SOAPHeader header = soapMessage.getSOAPHeader();
SOAPHeaderElement sessionHeader1 = soapMessage.getSOAPHeader().addHeaderElement(new QName("www.xyz.com", "Authorization","prov"));
sessionHeader1.setValue("AUTH_VALUE");
SOAPHeaderElement sessionHeader2 = soapMessage.getSOAPHeader().addHeaderElement(new QName("www.xyz.com", "ABC","prov"));
sessionHeader2.setValue("ABC_VALUE");
soapMessage.saveChanges();
}
我得到的是:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prov="www.xyz.com">
<soapenv:Header>
<prov:Authorization>AUTH_VALUE</prov:Authorization>
<prov:ABC>ABC_VALUE</prov:ABC>
</soapenv:Header>
我想要的是:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prov="www.xyz.com">
<soapenv:Header>
<prov:Authorization xmlns:prov="www.xyz.com">AUTH_VALUE</prov:Authorization>
<prov:ABC xmlns:prov="www.xyz.com">ABC_VALUE</prov:ABC>
</soapenv:Header>
我已经尝试创建您代码的a minimal, reproducible example
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.SOAPMessage;
public class TestSoap {
private SOAPMessage createSOAPRequest(String request) throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
soapEnvelope.addNamespaceDeclaration("prov", "www.xyz.com");
SOAPHeader soapHeader = soapMessage.getSOAPHeader();
SOAPHeaderElement sessionHeader1 =
soapHeader.addHeaderElement(new QName("www.xyz.com", "Authorization", "prov"));
sessionHeader1.setValue("AUTH_VALUE");
SOAPHeaderElement sessionHeader2 =
soapHeader.addHeaderElement(new QName("www.xyz.com", "ABC","prov"));
sessionHeader2.setValue("ABC_VALUE");
return soapMessage;
}
public static void main(String[] args) throws Exception {
TestSoap ts = new TestSoap();
SOAPMessage soapMessage = ts.createSOAPRequest("hello");
soapMessage.writeTo(System.out);
}
}
这是我从输出中获得的信息(带有一些断行和标签以提高可读性)
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:prov="www.xyz.com">
<SOAP-ENV:Header>
<prov:Authorization>AUTH_VALUE</prov:Authorization>
<prov:ABC>ABC_VALUE</prov:ABC></SOAP-ENV:Header>
<SOAP-ENV:Body/>
</SOAP-ENV:Envelope>
我注意到,如果我在此行中添加注释,输出更改将非常接近您想要的一个
// soapEnvelope.addNamespaceDeclaration("prov", "www.xyz.com");
新输出
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<prov:Authorization xmlns:prov="www.xyz.com">AUTH_VALUE</prov:Authorization>
<prov:ABC xmlns:prov="www.xyz.com">ABC_VALUE</prov:ABC>
</SOAP-ENV:Header>
<SOAP-ENV:Body/>
</SOAP-ENV:Envelope>
我认为javax正在优化名称空间分配。如果为SOAPEnvelope分配名称空间,则如果未指定相反的名称,它将应用于所有子名称,从而使特定属性变得多余。遗憾的是,我还没有找到有关这种优化的书面证据。
希望这会有所帮助。