简体   繁体   English

Java从SOAP服务URL调用获取响应

[英]Java get Response from SOAP service URL call

I want to get Response from request of SOAP URL. 我想从SOAP URL的请求中获取响应。 For this I am using below code 为此,我使用下面的代码

import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;

public class Test {
    final static String UserLogin = "tuser01@xyz.com";

    public static void main(String[] args) {
        try {
            SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
            SOAPConnection soapConnection = soapConnectionFactory.createConnection();
            String url = "http://devlocal04:8080/arsys/WSDL/public/devlocal03/DAL:OrderShim_WS";
            SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);
            printSOAPResponse(soapResponse);
            soapConnection.close();
        } catch (Exception e) {
            System.out.println("Exception : " + e);
        }
    }

    private static SOAPMessage createSOAPRequest() throws Exception {
        MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage soapMessage = messageFactory.createMessage();
        SOAPPart soapPart = soapMessage.getSOAPPart();
        String serverURI = "urn:DAL:OrderShim_WS";
        SOAPEnvelope envelope = soapPart.getEnvelope();
        envelope.addNamespaceDeclaration("urn", serverURI);

        SOAPHeader soapHeader = envelope.getHeader();
        SOAPElement soapHeaderElem = soapHeader.addChildElement("AuthenticationInfo", "urn");
        SOAPElement soapHeaderElem1 = soapHeaderElem.addChildElement("userName", "urn");
        soapHeaderElem1.addTextNode("Test");
        SOAPElement soapHeaderElem2 = soapHeaderElem.addChildElement("password", "urn");
        soapHeaderElem2.addTextNode("12345");
        SOAPBody soapBody = envelope.getBody();
        SOAPElement soapBodyElem = soapBody.addChildElement("Get_Order", "urn");
        SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("Login_Name", "urn");
        soapBodyElem1.addTextNode(UserLogin);
        MimeHeaders headers = soapMessage.getMimeHeaders();
        headers.addHeader("SOAPAction", serverURI + "Login_Name");

        soapMessage.saveChanges();
        System.out.print("Request SOAP Message = ");
        soapMessage.writeTo(System.out);
        System.out.println();
        return soapMessage;
    }

    private static void printSOAPResponse(SOAPMessage soapResponse) throws Exception {
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        Source sourceContent = soapResponse.getSOAPPart().getContent();
        System.out.print("\nResponse SOAP Message = ");
        StreamResult result = new StreamResult(System.out);
        transformer.transform(sourceContent, result);
    }
}

I have to do Request like below 我必须做如下的请求

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:DAL:OrderShim_WS">
   <soapenv:Header>
      <urn:AuthenticationInfo>
         <urn:userName>Test</urn:userName>
         <urn:password>12345</urn:password>
      </urn:AuthenticationInfo>
   </soapenv:Header>
   <soapenv:Body>
      <urn:Get_Order>
         <urn:Login_Name>tuser01@xyz.com</urn:Login_Name>
      </urn:Get_Order>
   </soapenv:Body>
</soapenv:Envelope>

But when I run my code they call this SOAP by using below Request 但是,当我运行我的代码时,他们通过使用下面的Request来调用此SOAP。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:DAL:OrderShim_WS">
    <SOAP-ENV:Header>
        <urn:AuthenticationInfo>
            <urn:userName>Test</urn:userName>
            <urn:password>12345</urn:password>
        </urn:AuthenticationInfo>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <urn:Get_Order>
            <urn:Login_Name>tuser01@xyz.com</urn:Login_Name>
        </urn:Get_Order>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

In my request I can see "SOAP-ENV" in plcae of "soapenv" and I am not getting the valid response. 在我的请求中,可以在“ soapenv”中看到“ SOAP-ENV”,但没有得到有效的响应。

I am using Java 1.8. 我正在使用Java 1.8。

I think you are getting this error because of SOAP-ENV.Replace SOAP-ENV with soapenv or make your request same as the required.You will get an idea from my code 我认为您是由于SOAP-ENV而收到此错误。用soapenv替换SOAP-ENV或使您的请求与要求相同。您将从我的代码中了解

MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage soapMessage = messageFactory.createMessage();
        SOAPPart soapPart = soapMessage.getSOAPPart();

        String serverURI = "";

        // SOAP Envelope
        SOAPEnvelope envelope = soapPart.getEnvelope();
        soapMessage
                .getSOAPPart()
                .getEnvelope()
                .removeAttributeNS("http://schemas.xmlsoap.org/soap/envelope/",
                        "SOAP-ENV");
        soapMessage.getSOAPPart().getEnvelope()
                .removeAttribute("xmlns:SOAP-ENV");
        soapMessage.getSOAPHeader().detachNode();
        soapMessage.getSOAPPart().getEnvelope().setPrefix("soap");
        soapMessage.getSOAPBody().setPrefix("soap");

// envelope.addNamespaceDeclaration("ns1", serverURI);
// we need to send the soap request in the format mentioned below
/*
 * xmlInput =
 * "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\r\n"
 * + "    <soap:Body>\r\n" +
 * "        <ns1:LoginProcesRequest xmlns:ns1=\"http://xmlns.oracle.com/GetSFDCDetailsProcess\">\r\n"
 * + "           <ns1:Login>1000</ns1:Login>\r\n" +
 * "           <ns1:Company>1000</ns1:Company>\r\n" +
 * "        </ns1:LoginProcesRequest>\r\n" + "    </soap:Body>\r\n" +
 * "</soap:Envelope>";
 */

// SOAP Body
SOAPBody soapBody = envelope.getBody();
SOAPElement soapBodyElem = soapBody.addChildElement(
        "LoginProcesRequest", "ns1", serverURI);
SOAPElement soapBodyElem1 = soapBodyElem
        .addChildElement("Login", "ns1");
soapBodyElem1.addTextNode(inputlogin);
SOAPElement soapBodyElem2 = soapBodyElem.addChildElement("Company",
        "ns1");
soapBodyElem2.addTextNode(inputcompany);
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", serverURI + "LoginProcesRequest");
soapMessage.saveChanges();
/* Print the request message */
System.out.print("Request SOAP Message = ");
soapMessage.writeTo(System.out);
System.out.println();

You can explore this easily 您可以轻松探索

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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