Le client Spring-WS ne définit pas l'en-tête SOAPAction
Je suis l'envoi d'une requête SOAP et le serveur est de se plaindre que le SOAPAction en-tête est vide. Je pense que je suis la droite, mais évidemment, je ne suis pas. Wireshark montre qu'il n'est pas défini.
@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();
}
}
L'erreur que je reçois depuis le serveur dit:
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'.
source d'informationauteur Steve L | 2013-01-28
Vous devez vous connecter pour publier un commentaire.
Une réponse complète va suivre.
Pendant que vous utilisez
WebServiceTemplate
comme une classe à communiquer avec le Service web, je ne comprends pas pourquoi, mais il n'a pas de remplir correctement l'en-Tête HTTP.Certains WSDL ont une partie en disant:
Et la
WebServiceTemplate
ignore cette partie. L'erreur ci-dessus signifie que votresoapAction
paramètre dans l'en-tête est vide. Et il ne devrait pas être. Vérifiez avec Wireshark. Je n'ai - à l'aide de certains de Chrome client de Savon et de Printemps. La seconde a un en-tête non valide.Pour corriger cela, vous devez suivre la Section 6.2.4 ici: http://docs.spring.io/spring-ws/sites/2.0/reference/html/client.html
Ce qu'il dit est fondamentalement ajouter la partie en-tête sur votre propre, avec
WebServiceMessageCallback
interface. Vous pouvez en lire plus dans la référence.Fondamentalement, il se termine comme ça:
Où vous pouvez configurer correctement la valeur d'en-tête. A fonctionné pour moi aussi. Toute la journée de la lecture.
J'ai travaillé sur cela, mais jamais posté la réponse. Voici ce que j'ai trouvé qui fonctionne bien: