简体   繁体   中英

Using SOAPAction in HTTP header to consume SOAP Service in JAVA

I'm trying to implement a soap service consumer in Java, using spring WebServiceGatewaySupport .

When I'm using curl to consume the service as below, it is giving proper response.

 curl -d @request.xml -H 'SOAPAction:abc:mnEvent#DoAction' https://myhost.org/cd/doAction.jsp

I'm trying to implement the same using JAVA, by adding following HttpHeaders in a template class inheriting from WebServiceGatewaySupport

public O callWebService(String url, I request) {
    return (O) getWebServiceTemplate().marshalSendAndReceive(url, request, new WebServiceMessageCallback() {
        @Override
        public void doWithMessage(WebServiceMessage message) {
            TransportContext transportContext = TransportContextHolder.getTransportContext();
            HttpComponentsConnection connection = (HttpComponentsConnection) transportContext.getConnection();
            connection.getHttpPost().addHeader("SOAPAction", "abc:mnEvent#DoAction");
        }
    });
}

With this code, I'm getting an error message like below.

SOP-330006 The method 'DoAction, ""' is not defined in SOAP service 'abc:mnEvent'.

What do I miss here when moving curl command to JAVA?

The error message SOP-330006 The method 'DoAction, ""' is not defined in SOAP service 'abc:mnEvent'. indicates, there are two soap actions in the request.

  1. Explicit SoapAction added in HttpHeader
  2. Implicit SoapAction in SoapMessage

To avoid this issue, we need to remove the soapAction from header and set it in SoapMessage.

SaajSoapMessage soapMessage = (SaajSoapMessage) message;
soapMessage.setSoapAction("abc:mnEvent#DoAction");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM