你的提供者错了,消息在语义上是等价的;你的不合格,他们的合格。您使用的是Axis还是Axis2?如果您使用的是Axis,我建议您切换到Axis2以获得更健壮、符合标准的SOAP堆栈(这两种产品都不好,但Axis2不那么差)。
我假设您正在使用wsdl2java创建客户端?如果您不能让这个工具以您喜欢的方式生成消息,那么您最好的办法就是以编程方式生成消息。
对于Axis2,您可以使用AXIOM API来实现这一点。看见
this link
createOMElement
,可以选择传递名称空间前缀。因此,如果您的提供者需要它,那么您可以传递一个包含“imk 1”的字符串作为namespacePrefix参数。
如果您最终以编程方式完成这项工作,并且只需要编写一个简单的客户机,那么我
强烈
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>