简体   繁体   中英

Parse SOAP response and extract specific node using JAVA

I'm trying to interact with a SOAP service. I'm able to get the SOAP response and by using Source sourceContent = soapResponse.getSOAPPart().getContent(); and transformer.transform(sourceContent, result); , I'm able to see what the output/response is and displaying it in the console.

But, I need to extract sessionID from the response and send that sessionID in a different SOAP request.

Please suggest me the extraction method, building a new SOAP request

Parsing is what I need to do!!

Below is the code for sending the request to the SOAP service:

public static void main(String args[]) {
    try {
        // Create SOAP Connection
        SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
        SOAPConnection soapConnection = soapConnectionFactory.createConnection();

        // Send SOAP Message to SOAP Server
        String url = "https://WWW.DUMMYURL.COM";
        SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);


        // Process the SOAP Response
        printSOAPResponse(soapResponse);

        soapConnection.close();
     } 

    catch (Exception e) {
        System.err.println("Error occurred while sending SOAP Request to Server");
        e.printStackTrace();
    }
 }

    private static SOAPMessage createSOAPRequest() throws Exception {
        MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage soapMessage = messageFactory.createMessage();
        SOAPPart soapPart = soapMessage.getSOAPPart();
        String serverURN = "urn:DUMMYURL.COM";
        String serverNS0 = "http://WWW.DUMMYURL.COM";

        // SOAP Envelope
        SOAPEnvelope envelope = soapPart.getEnvelope();
        envelope.addNamespaceDeclaration("urn", serverURN);
        envelope.addNamespaceDeclaration("ns0", serverNS0);

        // SOAP Body
        SOAPBody soapBody = envelope.getBody();     
        SOAPElement soapBodyElem1 = soapBody.addChildElement("login","urn");
        SOAPElement soapBodyElem2 = soapBodyElem1.addChildElement("username","urn");
        @SuppressWarnings("unused")
        SOAPElement soapBodyElem3 = soapBodyElem2.addTextNode("USERNAME");
        SOAPElement soapBodyElem4 = soapBodyElem1.addChildElement("password","urn");
        @SuppressWarnings("unused")
        SOAPElement soapBodyElem5 = soapBodyElem4.addTextNode("PASSWORD");
        MimeHeaders headers = soapMessage.getMimeHeaders();
        headers.addHeader("SOAPAction", "https://WWW.DUMMYURL.COM"  + "login");
        soapMessage.saveChanges();

        //Print the request message
        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();
        String source = sourceContent.toString();
        System.out.print("\nResponse SOAP Message = ");

        // Format it
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

        StreamResult result = new StreamResult(System.out);
        transformer.transform(sourceContent, result);
        System.out.println(transformer.toString());
}

Can someone please suggest me a snippet on how should I save the response I'm getting to a file locally?

Currently in the above code the response is getting displayed in the console.

You can use the writeTo method of the SOAPMessage interface to do the same, for example:

FileOutputStream out = new FileOutputStream("somefile");
soapResponse.writeTo(out);

Vinod.

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