Web services 在axis创建的web服务上将命名空间声明从有效负载移动到信封
我刚刚使用axis和eclipse创建了一个web服务客户机,它与我的web服务提供商不兼容。web服务客户端创建的消息如下所示:Web services 在axis创建的web服务上将命名空间声明从有效负载移动到信封,web-services,axis,Web Services,Axis,我刚刚使用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:
<?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"?>
<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>
某个用户
密码
消息
一些
名字
姓氏
我认为这条消息没有什么问题,但我的提供商坚持认为这条消息应该是:
<?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>
某个用户
密码
消息
一些
名字
姓氏
请注意,名称空间声明从
enviramensajerequest
移动到soapenv:Envelope
以及参数上带有imk:
的限定。我在这个过程中尝试了许多组合,但我的web服务、wsdl和xml知识非常有限。服务提供商说他们除了告诉我这件事之外帮不了我。有什么想法吗?也许我可以使用另一个框架来创建正确的客户端。您的提供者是错误的,消息在语义上是等价的;你的不合格,他们的合格。您使用的是Axis还是Axis2?如果您使用的是Axis,我建议您切换到Axis2,以获得更健壮、符合标准的SOAP堆栈(这两种产品都不好,但Axis2不那么差)
我假设您正在使用wsdl2java创建客户机?如果您无法使用此工具以您喜欢的方式生成消息,那么最好是以编程方式生成消息。
对于Axis2,您可以使用AXIOM API实现这一点。有关API使用的一些示例,请参见。请注意,对于大多数方法,例如,您可以选择传递名称空间前缀。因此,如果您的提供商需要它,那么您可以传递一个包含“imk 2”的字符串作为namespacePrefix参数
如果您最终以编程方式完成这项工作,并且只打算编写一个简单的客户端,那么我强烈建议您放弃Axis/Axis2方法,改用堆栈,因为它是Java自1.6以来的一部分。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);
QName端口=新的QName(端点,“subversionsoapservice-v2”);
QName serviceName=新的QName(端点,“ISubversionSoapServiceService”);
Service=Service.create(serviceName);
addPort(端口,SOAPBinding.SOAP11HTTP_绑定,端点);
Dispatch Dispatch=service.createDispatch(端口,SOAPMessage.class,service.Mode.MESSAGE);
MessageFactory=MessageFactory.newInstance(SOAPConstants.SOAP\u 1\u 1\u协议);
SOAPMessage请求=factory.createMessage();
SOAPBody=request.getSOAPBody();
SOAPElement reindexRepository=body.addChildElement(“reindexRepository”,“jira”,“jira”)http://soap.ext.plugin.jira.atlassian.com");
SOAPElement in0=reindexRepository.addChildElement(“in0”);
in0.addTextNode(“测试”);
request.saveChanges();
调用(请求);
客户端发送的XML如下所示:
<?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"?>
<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>
测试
您的提供者不正确,它们在语义上完全相同。Axis知道这一点,并做它认为最好的事情。它没有提供简单的方法来改变这一点,因为没有很好的理由。谢谢。除了手动完成整个通话之外,还有什么其他方法吗?@skaffman,谢谢你的回答,但是有没有办法阻止axis这样做,如果没有,我会让服务器提供商更正他们的服务器。这很好,谢谢。对于其他人,您可以在soap头中设置名称空间声明,如下所示:SOAPMessageRequest=factory.createMessage();SOAPEnvelope信封=request.getSOAPPart().getEnvelope();addNamespaceDeclaration(“uri”,“uri:foo.bar.com”);request.saveChanges()
然后创建名称空间前缀如下的元素:SOAPBody=request.getSOAPBody();SOAPElement ping=body.addChildElement(“foo”、“uri”)代码>