如何在我的Java代码中连同URL添加自定义soap标头?

问题描述 投票:0回答:1

我正在尝试在我的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>
soap java-8
1个回答
0
投票

我已经尝试创建您代码的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分配名称空间,则如果未指定相反的名称,它将应用于所有子名称,从而使特定属性变得多余。遗憾的是,我还没有找到有关这种优化的书面证据。

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.