SOAPExceptionImpl 错误响应:404如果我不做 soapMessage.writeTo(System.out),则找不到;



我正在用java创建一个Soap客户端,我得到一个奇怪的错误。

文摘客户

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;
    }
}

Soap客户机实现

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);
    }
}

奇怪的地方在这部分代码中:

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

如果我注释这段代码,在发送请求之前只打印请求,我会得到以下异常:

  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)

但是如果我不注释这一行,我可以得到正确的响应。
这没有意义:为什么它发送一个404Not Found如果我不写请求在控制台发送它之前?

如果您检查writeTo实现,您将看到它们添加了一个SOAPAction头。

尝试以下操作:

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

缺省情况下,SOAPMessage接口由SoapMessageImpl实现。此实现的副作用是,如果不存在SOAPAction头,则会添加SOAPAction头。

在调用了writeTo之后,你可以通过调用:

来移除它
soapMessage.getMimeHeaders().removeHeader("SOAPAction");

已经说过,而不是添加额外的代码只记录调用和响应,我建议使用代理代替。

如果您正在使用Eclipse,请查看TCP/Monitor View

确定正确的"SOAPAction",然后发布请求。这将解决404 FileNotFoud错误。如:

String SOAPAction = "/Service/Service.serviceagent/ServicesEndpoint1/ACTIONNAMEFROMSERVERSIDE";
            httpConn.setRequestProperty("Content-Length", String.valueOf(b.length));
            httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
            httpConn.setRequestProperty("SOAPAction", SOAPAction);

相关内容

  • 没有找到相关文章

最新更新