使用Java HttpServlet解组Soap信封 [英] Unmarshal Soap envelope with Java HttpServlet
问题描述
我正在尝试使用一个简单的HttpServlet来管理来自另一台服务器的肥皂请求. 该请求只有一个byte []类型的参数(这是一个简单的字符串).
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).
相关代码为:
@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>
我需要获取MYPARAMETER标记内的值(这是一个字节[]). 有一种聪明的方法,也许使用Axis1的一些utils类(我不能使用Axis2)清除传入的请求?
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?
推荐答案
我不确定您可以使用什么,但是手动"方式是使用XPath.我下面的代码只运行了一次,它似乎起作用了.它没有利用命名空间,但这只是一个开始.您需要对其进行优化-这只是一个示例,但是我已经有代码可以完成其中的99%.
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 HttpServlet解组Soap信封的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!