gpt4 book ai didi

soap - Spring-WS 客户端未设置 SOAPAction header

转载 作者:行者123 更新时间:2023-12-03 21:04:18 26 4
gpt4 key购买 nike

我正在发送 SOAP 请求,服务器提示 SOAPAction header 为空。我认为我设置正确,但显然我不是。 Wireshark 显示未设置。

@Test
public void testLogin() throws Exception {
StringBuffer loginXml = new StringBuffer();
loginXml.append("<soapenv:Envelope xmlns:soapenv=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ns=\"http://example.com/xyz/2010/08\">");
loginXml.append(" <soapenv:Header>");
loginXml.append(" <ns:loginOperationDetails>");
loginXml.append(" </ns:loginOperationDetails>");
loginXml.append(" </soapenv:Header>");
loginXml.append(" <soapenv:Body>");
loginXml.append(" <ns:LogIn>");
loginXml.append(" <ns:logInInfo>");
loginXml.append(" <ns:CustomerAccountId>customer1</ns:CustomerAccountId>");
loginXml.append(" <ns:Username>JDoe</ns:Username>");
loginXml.append(" <ns:Password>abc123</ns:Password>");
loginXml.append(" </ns:logInInfo>");
loginXml.append(" </ns:LogIn>");
loginXml.append(" </soapenv:Body>");
loginXml.append("</soapenv:Envelope>");

WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
MessageFactory msgFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
SaajSoapMessageFactory newSoapMessageFactory = new SaajSoapMessageFactory(msgFactory);
webServiceTemplate.setMessageFactory(newSoapMessageFactory);

String uri = "http://xyz.example.com/xyz_1.0/membership.svc/ws";
webServiceTemplate.setDefaultUri(uri);

StreamSource source = new StreamSource(new StringReader(loginXml.toString()));
StreamResult result = new StreamResult(System.out);

boolean resultReturned = false;
try {
resultReturned = webServiceTemplate.sendSourceAndReceiveToResult(source,
new SoapActionCallback("http://example.com/xyz/2010/08/MembershipService/LogIn"),
result);
}
catch (SoapFaultClientException sfe) {
logger.error("SoapFaultClientException resultReturned: " + resultReturned, sfe);
fail();
}
}

我从服务器返回的错误说:
500 Internal Server Error
The SOAP action specified on the message, '', does not match the HTTP SOAP Action, 'http://example.com/xyz/2010/08/MembershipService/LogIn'.

最佳答案

一个完整的答案如下。
当您使用时 WebServiceTemplate 作为与 Webservice 通信的类,我不明白为什么但它没有正确填充 HTTP header 。
一些 WSDL 有一部分说:

<soap:operation
soapAction="SOMELINK"
style="document" />
WebServiceTemplate 忽略这部分。上述错误表示您的 soapAction header 中的参数为空。不应该。与 Wireshark 检查。我做了 - 使用一些 Chrome Soap 客户端和 Spring。第二个有一个无效的标题。

要解决此问题,您需要遵循此处的第 6.2.4 节: http://docs.spring.io/spring-ws/sites/2.0/reference/html/client.html
它说的基本上是你自己添加标题部分,用 WebServiceMessageCallback界面。您可以在引用资料中阅读更多内容。
基本上它最终是这样的:
 webServiceTemplate.marshalSendAndReceive(o, new WebServiceMessageCallback() {

public void doWithMessage(WebServiceMessage message) {
((SoapMessage)message).setSoapAction("http://tempuri.org/Action");
}
});
您可以在哪里正确设置标题值。也为我工作。一整天的阅读。

关于soap - Spring-WS 客户端未设置 SOAPAction header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14571273/

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