gpt4 book ai didi

java - 生成 SOAP 请求

转载 作者:太空宇宙 更新时间:2023-11-04 14:39:20 25 4
gpt4 key购买 nike

我尝试生成以下 SOAP 请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:loc="http://www.csapi.org/schema/parlayx/data/sync/v1_0/local">
<soapenv:Header/>
<soapenv:Body>
<loc:syncOrderRelationResponse>
<loc:result>0</loc:result>
<loc:resultDescription>OK</loc:resultDescription>
</loc:syncOrderRelationResponse>
</soapenv:Body>
</soapenv:Envelope>

我正在使用以下代码:

    MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage outgoingMessage = messageFactory.createMessage();
SOAPPart soappart = outgoingMessage.getSOAPPart();
SOAPEnvelope envelope = soappart.getEnvelope();

envelope.setAttribute("xmlns:loc" , "http://www.csapi.org/s");
SOAPHeader header = envelope.getHeader();
SOAPBody body = envelope.getBody();
QName bodyName = new QName("", "syncOrderRelationResponse", "loc");
SOAPBodyElement purchaseLineItems = body.addBodyElement(bodyName);


QName childName = new QName("","result","loc");
SOAPElement product = purchaseLineItems.addChildElement(childName);
product.addTextNode("0");

childName = new QName("","resultDescription","loc");
SOAPElement product = purchaseLineItems.addChildElement(childName);
product.addTextNode("0");

当我执行代码时,我没有得到任何响应,但是当我输入 namespace URL 时,我得到了响应。

你能帮我一下吗?感谢您的支持

最佳答案

您会收到 XML 错误,因为您对命名空间的使用在整个过程中不一致,并最终导致违反 XML 规范。

首先要做的事情:

envelope.setAttribute("xmlns:loc" , "http://www.csapi.org/s");

表示您向文档添加命名空间前缀声明(loc 前缀),该声明指定由 http://www.csapi.org/s 标识的命名空间。 .

这意味着从现在开始,如果您使用此语法声明 XML 元素 <loc:tag> ,然后tag是属于 http://www.csapi.org/s 的 XML 元素命名空间。

当您随后以这种方式声明 QName 时

QName childName = new QName("","result","loc");

您正在准备一个具有 3 个特征的 XML 元素:

  1. 它属于空命名空间(第一个参数)
  2. 它在空命名空间中的本地名称是“result”(第二个参数)
  3. 您希望其本地名称带有前缀“loc”(第三个参数)

这没问题(至少实现是这么认为的)...直到您将此 QName 添加到您的文档中:此时在您的 XML 文档中,“loc”前缀并不指定空 namespace 。因此,您实际上是在要求 XML 实现重新定义“loc”前缀以表示“空 namespace ”,以便符合您的声明。但空命名空间在 XML 中比较特殊,它不能加前缀(参见 http://www.w3.org/TR/REC-xml-names/#ns-using )

In a namespace declaration for a prefix (i.e., where the NSAttName is a PrefixedAttName), the attribute value MUST NOT be empty.

但是,请注意,根据您的示例,这实际上很幸运,因为“从空命名空间添加 元素”不是您想要做的。您想要做的是从“ http://www.csapi.org/s ”命名空间添加结果元素。

因此,一致的命名空间处理可以为您提供预期的结果:

String namespace = "http://www.csapi.org/s";

SOAPHeader header = envelope.getHeader();
SOAPBody body = envelope.getBody();

QName bodyName = new QName(namespace, "syncOrderRelationResponse");
SOAPBodyElement purchaseLineItems = body.addBodyElement(bodyName);


QName childName = new QName(namespace,"result");
SOAPElement product = purchaseLineItems.addChildElement(childName);
product.addTextNode("0");

childName = new QName(namespace,"resultDescription");
product = purchaseLineItems.addChildElement(childName);
product.addTextNode("0");

outgoingMessage.writeTo(System.out);

输出您正在寻找的内容的有效表示。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<syncOrderRelationResponse xmlns="http://www.csapi.org/s">
<result>0</result>
<resultDescription>0</resultDescription>
</syncOrderRelationResponse>
</SOAP-ENV:Body></SOAP-ENV:Envelope>

尽管如果您确实希望出现命名空间前缀,也可以这样做:

String namespace = "http://www.csapi.org/s";
String nsPrefix = "loc";

envelope.setAttribute("xmlns:" + nsPrefix , namespace);
SOAPHeader header = envelope.getHeader();
SOAPBody body = envelope.getBody();

QName bodyName = new QName(namespace, "syncOrderRelationResponse", nsPrefix);
SOAPBodyElement purchaseLineItems = body.addBodyElement(bodyName);


QName childName = new QName(namespace,"result", nsPrefix);
SOAPElement product = purchaseLineItems.addChildElement(childName);
product.addTextNode("0");

childName = new QName(namespace,"resultDescription", nsPrefix);
product = purchaseLineItems.addChildElement(childName);
product.addTextNode("0");

关于java - 生成 SOAP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25137137/

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