SOAPExceptionImpl Invalid answer: 404Not Found if I do not do soapMessage.writeTo (System.out);

I am creating a Soap client in java and I have a strange error.

Abstract customer

public abstract class AbstractSoapClient { private ServerContext context; private String path; private static final String WSSE = ""; private static final String CURL = ""; private static final String CURL_PASSWORD = ""; private static final String SECURITY_NODE = ""; private static final String USERNAME_TOKEN = ""; private static final String USERNAME_NODE = ""; private static final String PASSWORD_NODE = ""; public AbstractSoapClient(ServerContext context) { this.context = context; } protected SOAPMessage createRequest(String path) throws SOAPException { this.path = assembleEndpoint(path); SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); SOAPConnection soapConnection = soapConnectionFactory.createConnection(); SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), this.path); soapConnection.close(); return soapResponse; } protected void setCredentials(SOAPEnvelope envelope) throws SOAPException { SOAPHeader tHeader = envelope.getHeader(); Name tWsseHeaderName = envelope.createName(SECURITY_NODE, WSSE, CURL); SOAPHeaderElement tSecurityElement = tHeader.addHeaderElement(tWsseHeaderName); tSecurityElement.setMustUnderstand(false); Name tUserTokenElementName = envelope.createName(USERNAME_TOKEN, WSSE, CURL); SOAPElement tUserTokenElement = tSecurityElement.addChildElement(tUserTokenElementName); tUserTokenElement.removeNamespaceDeclaration(WSSE); tUserTokenElement.addNamespaceDeclaration("wsu", CURL); // user name child Name tUsernameElementName = envelope.createName(USERNAME_NODE, WSSE, CURL); SOAPElement tUsernameElement = tUserTokenElement.addChildElement(tUsernameElementName); tUsernameElement.removeNamespaceDeclaration(WSSE); tUsernameElement.addTextNode(context.getUsername()); // password child Name tPasswordElementName = envelope.createName(PASSWORD_NODE, WSSE, CURL); SOAPElement tPasswordElement = tUserTokenElement.addChildElement(tPasswordElementName); tPasswordElement.removeNamespaceDeclaration(WSSE); tPasswordElement.setAttribute("Type", CURL_PASSWORD); tPasswordElement.addTextNode(context.getPassword()); } private String assembleEndpoint(String path) { return context.getUrl().concat(path); } protected abstract SOAPMessage createSOAPRequest() throws SOAPException; public ServerContext getContext() { return context; } public String getPath() { return path; } } 

Implement Soap Client

 public class SoapClient extends AbstractSoapClient { public SoapClient(ServerContext context) { super(context); } @Override public SOAPMessage createSOAPRequest() throws SOAPException { MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage soapMessage = messageFactory.createMessage(); SOAPPart soapPart = soapMessage.getSOAPPart(); SOAPEnvelope envelope = soapPart.getEnvelope(); setCredentials(envelope); buildBody(envelope); soapMessage.saveChanges(); try { soapMessage.writeTo(System.out); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return soapMessage; } private void buildBody(SOAPEnvelope envelope) throws SOAPException { envelope.addNamespaceDeclaration("sch", "------"); SOAPBody soapBody = envelope.getBody(); SOAPElement soapBodyElem = soapBody.addChildElement("sampleData", "sampleData"); SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("sampleData"); soapBodyElem1.addTextNode("sampleData"); SOAPElement soapBodyElem2 = soapBodyElem.addChildElement("sampleData"); soapBodyElem2.addTextNode("sampleData"); SOAPElement soapBodyElem3 = soapBodyElem.addChildElement("sampleData"); soapBodyElem3.addTextNode("Y"); SOAPElement soapBodyElem4 = soapBodyElem.addChildElement("sampleData"); soapBodyElem4.addTextNode("sampleData"); SOAPElement soapBodyElem5 = soapBodyElem.addChildElement("sampleData"); soapBodyElem5.addTextNode("sampleData"); SOAPElement soapBodyElem6 = soapBodyElem.addChildElement("sampleData"); soapBodyElem6.addTextNode("sampleData"); } public static void main(String[] args) throws SOAPException, IOException { SoapClient client = new SoapClient( new ServerContext("url", "user", "password")); SOAPMessage response = client.createRequest("endpoint"); response.writeTo(System.out); } } 

The strange point in this part of the code is:

 try { soapMessage.writeTo(System.out); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

If I comment on this code, which only prints the request before sending it, I get the following exception:

  ago 12, 2016 12:58:17 PM com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection post GRAVE: SAAJ0008: respuesta errรณnea; Not Found Exception in thread "main" com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (404Not Found at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:149) at AbstractSoapClient.createRequest(AbstractSoapClient.java:44) at SoapClient.main(SoapClient.java:67) Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (404Not Found at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:264) at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:145) ... 2 more CAUSE: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (404Not Found at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:264) at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:145) at AbstractSoapClient.createRequest(AbstractSoapClient.java:44) at SoapClient.main(SoapClient.java:67) 

But if I do not comment on this line, I can get the answer correctly, for me it does not make sense, because why it sends 404Not Found if I do not write the request in the console before sending it.

+6
source share
2 answers

If you check the writeTo implementation , you will see that they add the SOAPAction header.

Try the following:

 MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage soapMessage = messageFactory.createMessage(); soapMessage.getMimeHeaders().addHeader("SOAPAction", "\"\""); 

Hope this helps.

+1
source

By default, the SOAPMessage interface is implemented by SoapMessageImpl . This implementation has the side effect of adding a SOAPAction header if it is not present.

After calling the writeTo function, you can remove it by calling:

 soapMessage.getMimeHeaders().removeHeader("SOAPAction"); 

Having said that, instead of adding additional code just to register the call and answer, I suggest using a proxy instead.

If you are using Eclipse, see Viewing TCP / Monitor

0
source

All Articles