gpt4 book ai didi

java - 如何处理 SOAP 调用中的方法及其参数

转载 作者:行者123 更新时间:2023-11-30 07:59:38 25 4
gpt4 key购买 nike

API 说我必须使用方法“getStock”和以下参数:accessToken,公司,商品编号,佣金编号。我写了这段代码,但它不起作用。

    SOAPEnvelope envelope = soapPart.getEnvelope();
//envelope.addNamespaceDeclaration("sam", "http://samples.axis2.techdive.in");

// SOAP Body
SOAPBody soapBody = envelope.getBody();
SOAPElement method = soapBody.addChildElement("getStock");
SOAPElement firstParam = method.addChildElement("accessToken");
firstParam.addTextNode("xxx");

SOAPElement secondParam = method.addChildElement("company");
secondParam.addTextNode("AS");

SOAPElement thirdParam = method.addChildElement("itemNumber");
thirdParam.addTextNode("020001");

SOAPElement fourthParam = method.addChildElement("commissionNumber");
fourthParam.addTextNode("0");

soapMessage.saveChanges();

那么 NamespaceDeclaration 又如何呢?

我收到此错误:

响应 SOAP 消息 =ns2:客户端找不到 {}getStock 的调度方法进程已完成,退出代码为 0

问候安德鲁

最佳答案

为了指定前缀和 namespace ,您可以使用 Qname 对象(import javax.xml.namespace.QName;),如下所示:

QName stockQname = new QName("http://your_namespace_uri.com",
"getStock", "prefix");

前缀更改为您的实际前缀。

将命名空间更改为您实际的命名空间

我重写了您的代码以使用 Qnames:

private static void test() throws SOAPException {

MessageFactory factory = MessageFactory
.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
SOAPMessage message = factory.createMessage();
SOAPPart soapPart = message.getSOAPPart();

SOAPEnvelope envelope = soapPart.getEnvelope();

SOAPBody soapBody = envelope.getBody();

QName stockQname = new QName("http://your_namespace_uri.com",
"getStock", "prefix");
SOAPBodyElement stockElement = soapBody.addBodyElement(stockQname);

QName accessQname = new QName("accessToken");
SOAPElement accessElement = stockElement.addChildElement(accessQname);
accessElement.addTextNode("xxx");

QName companyQname = new QName("company");
SOAPElement companyElement = stockElement.addChildElement(companyQname);
companyElement.addTextNode("AS");

QName itemQname = new QName("itemNumber");
SOAPElement itemElement = stockElement.addChildElement(itemQname);
itemElement.addTextNode("020001");

QName commisionQname = new QName("commissionNumber");
SOAPElement commissionElement = stockElement
.addChildElement(commisionQname);
commissionElement.addTextNode("0");

message.saveChanges();
}

这是生成的 SOAP 消息:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<prefix:getStock xmlns:prefix="http://your_namespace_uri.com">
<accessToken>xxx</accessToken>
<company>AS</company>
<itemNumber>020001</itemNumber>
<commissionNumber>0</commissionNumber>
</prefix:getStock>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我正在使用这个 SAAJ 库

<dependency>
<groupId>com.sun.xml.messaging.saaj</groupId>
<artifactId>saaj-impl</artifactId>
<version>1.3.25</version>
</dependency>

如果您想使用 SOAP 1.2 消息协议(protocol),只需更改此行:

MessageFactory factory = MessageFactory
.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);

到这一行:

MessageFactory factory = MessageFactory
.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);

希望这有帮助

关于java - 如何处理 SOAP 调用中的方法及其参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32140169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com