Unmarshal Soap envelope with Java HttpServlet

2019-09-12 05:12发布

问题:

I'm trying to use a simple HttpServlet to manage a soap request from another server. The request has only one parameter of byte[] type (it's a simple string).

Relevant code is:

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    try {
            InputStream is = req.getInputStream();
            byte[] body = IOUtils.toByteArray(is);
            String stringRequest = new String(body);
            log.info("Request -> "+stringRequest );
         }catch(Exception){log.error(e);}

I receive the request and if I print it it appears in this way:

    <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <fixedResearch soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
            <MYPARAMETER xsi:type="xsd:hexBinary">
                *****bytearray******
            </MYPARAMETER>
        </fixedResearch>
    </soapenv:Body>
</soapenv:Envelope>

I need to get the value inside MYPARAMETER tag (it's a byte[]). There is a smart way, maybe using some utils class of Axis1 (I can't use Axis2) to epurate the incoming request?

回答1:

I'm not sure what you are allowed to use but the "manual" way is to use XPath. The code below I ran once and it seemed to work. It is not taking advantage of namespaces but it's a start. You'll need to optimize it - this is just an example but I had code to do 99% of this already.

package tld.domainname.stuff;


import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;


public class XPathTest {
    public static void main(String[] argv) {
        String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
                "    <soapenv:Body>\n" +
                "        <fixedResearch soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n" +
                "            <MYPARAMETER xsi:type=\"xsd:hexBinary\">\n" +
                "                *****bytearray******\n" +
                "            </MYPARAMETER>\n" +
                "        </fixedResearch>\n" +
                "    </soapenv:Body>\n" +
                "</soapenv:Envelope>";

        String value = null;

        XPath xpath = XPathFactory.newInstance().newXPath();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = null;
        Document doc = null;
        try {
            builder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        InputSource is = new InputSource(new StringReader(xmlString));
        try {
            doc = builder.parse(is);
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (doc == null) {
            System.out.println("can't parse doc");
            return;
        }

        Node parentNode = doc.getDocumentElement();

        String path = "Body/fixedResearch/MYPARAMETER";

        NodeList nodeList;
        try {
            nodeList = (NodeList) xpath.evaluate(path, parentNode, XPathConstants.NODESET);
        } catch (XPathExpressionException xpe) {
            throw new IllegalArgumentException("Cannot evaluate xpath with path \"" + path + "\"", xpe);
        }

        if ((nodeList == null) || (nodeList.getLength() == 0)) {
            System.out.println("found nothing");
            return;
        }

        if (nodeList.getLength() > 1)
            System.out.println("found " + nodeList.getLength() + " nodes in the path \"" + path + "\" - using only the first");

        Node nextNode = nodeList.item(0);

        if (nextNode == null) {
            System.out.println("found nothing");
            return;
        }

        if (nextNode.hasChildNodes()) {
            Node child = nextNode.getFirstChild();
            value = child.getNodeValue();
        }

        System.out.println("found value of \"" + value + "\"");
    }
}


标签: java soap axis