gpt4 book ai didi

web-services - 将 namespace 声明从有效载荷移动到 Axis 创建的 Web 服务上的信封

转载 作者:行者123 更新时间:2023-12-04 23:33:01 24 4
gpt4 key购买 nike

我刚刚使用 axis 和 eclipse 创建了一个 Web 服务客户端,它不适用于我的 Web 服务提供商。 Web 服务客户端创建的消息如下所示:

<?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>
<enviarMensajeRequest
xmlns="http://www.springframework.org/spring-ws/Imk-Zenkiu-Services">
<usuario>someuser</usuario>
<clave>somepassword</clave>
<mensaje>somemessage</mensaje>
<contacto>
<buzonSMS>somenumber</buzonSMS>
<primerNombre>somefirstname</primerNombre>
<primerApellido>somelastname</primerApellido>
</contacto>
</enviarMensajeRequest>
</soapenv:Body>
</soapenv:Envelope>

我认为该消息没有任何问题,但我的提供商坚持认为该消息应该是:
<?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"
xmlns:imk="http://www.springframework.org/spring-ws/Imk-Zenkiu-Services">
<soapenv:Body>
<imk:enviarMensajeRequest>
<imk:usuario>someuser</imk:usuario>
<imk:clave>somepassword</imk:clave>
<imk:mensaje>somemessage</imk:mensaje>
<imk:contacto>
<imk:buzonSMS>somenumber</imk:buzonSMS>
<imk:primerNombre>somefirstname</imk:primerNombre>
<imk:primerApellido>somelastname</imk:primerApellido>
</imk:contacto>
</imk:enviarMensajeRequest>
</soapenv:Body>
</soapenv:Envelope>

注意命名空间声明从 enviarMensajeRequest 移动到 soapenv:Envelope以及 imk:的资质在参数上。我在这个过程中尝试了很多组合,但我的 Web 服务、wsdl 和 xml 知识非常有限。提供者说他们只能告诉我这个。有任何想法吗?也许我可以使用不同的框架来创建正确的客户端。

最佳答案

你的提供者错了,消息在语义上是等价的;你的不合格,他们的合格。您使用的是 Axis 还是 Axis2?如果您正在使用 Axis,我建议您切换到 Axis2 以获得更健壮、符合标准的 SOAP 堆栈(两种产品都很糟糕,但 Axis2 没那么糟糕)。

我假设您正在使用 wsdl2java 创建您的客户端?如果您无法使用此工具以您喜欢的方式生成消息,那么最好的办法是以编程方式生成消息。
使用 Axis2,您可以使用 AXIOM API 执行此操作。见 this link对于一些示例 API 使用。请注意,对于大多数方法,例如createOMElement ,您可以选择传递命名空间前缀。因此,如果您的提供者需要它,那么您可以传递一个包含“imk”的字符串作为 namespacePrefix 参数。

如果您最终以编程方式执行此操作并且您只会编写一个简单的客户端,那么我 建议您放弃 Axis/Axis2 方法并使用 JAX-WS堆栈代替,因为它自 1.6 以来就是 Java 的一部分。 API 更简洁,文档更好。例如,以下是我编写的一个非常简单的客户端,用于向我们的 JIRA 服务器发送 SOAP 请求。示例代码创建了限定元素和非限定元素。

QName port = new QName(endpoint, "subversionsoapservice-v2");
QName serviceName = new QName(endpoint, "ISubversionSoapServiceService");

Service service = Service.create(serviceName);
service.addPort(port, SOAPBinding.SOAP11HTTP_BINDING, endpoint);

Dispatch<SOAPMessage> dispatch = service.createDispatch(port, SOAPMessage.class, Service.Mode.MESSAGE);
MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
SOAPMessage request = factory.createMessage();
SOAPBody body = request.getSOAPBody();

SOAPElement reindexRepository = body.addChildElement("reindexRepository", "jira", "http://soap.ext.plugin.jira.atlassian.com");
SOAPElement in0 = reindexRepository.addChildElement("in0");
in0.addTextNode("test");

request.saveChanges();
dispatch.invoke(request);

客户端发送的 XML 如下所示:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<jira:reindexRepository xmlns:jira="http://soap.ext.plugin.jira.atlassian.com">
<in0>test</in0>
</jira:reindexRepository>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

关于web-services - 将 namespace 声明从有效载荷移动到 Axis 创建的 Web 服务上的信封,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2495895/

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