java发送SOAP请求
一些服务,比如webService,是需要基于SOAP协议进行通信的。
SOAP请求是基于XML的通信协议,通过HTTP传输实现跨平台应用程序交互。
下面是基于java发送请求和解析返回结果为json串的方法
/*** 发送SOAP请求* @param methodName 请求方法名* @param paraMaps 请求的参数 key为参数名称 value为参数值 没有请传入null* @return 请求结果* @throws IOException*/public static String send(String methodName,Map<String, String> paraMaps) throws IOException {StringBuilder sbd = new StringBuilder();if(null == paraMaps) {sbd.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");sbd.append("<soapenv:Envelope " + "xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'"+ " xmlns:ws='http://ws_server.server/'" + ">");sbd.append("<soapenv:Body>");sbd.append("<ws:").append(methodName).append("/>");}else {Set<Map.Entry<String,String>> sets = paraMaps.entrySet();StringBuilder paras = new StringBuilder();for(Map.Entry<String,String> entry : sets) {paras.append("<").append(entry.getKey()).append(">").append(entry.getValue()).append("</").append(entry.getKey()).append(">");}sbd.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");sbd.append("<soapenv:Envelope " + "xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'"+ " xmlns:ws='http://ws_server.server/'" + ">");sbd.append("<soapenv:Body>");sbd.append("<ws:").append(methodName).append(">");sbd.append(paras);sbd.append("</ws:").append(methodName).append(">");}sbd.append("</soapenv:Body>");sbd.append("</soapenv:Envelope>");HttpClient client = new HttpClient();PostMethod postMethod = new PostMethod(wsdl);client.getHttpConnectionManager().getParams().setConnectionTimeout(timeout);client.getHttpConnectionManager().getParams().setSoTimeout(timeout);RequestEntity requestEntity = new StringRequestEntity(sbd.toString(), "text/xml", "UTF-8");postMethod.setRequestEntity(requestEntity);try {@SuppressWarnings("unused")int status = client.executeMethod(postMethod);} catch (Exception e) {e.printStackTrace();return null;}// 获取响应体输入流InputStream is = postMethod.getResponseBodyAsStream();// 获取请求结果字符串return IOUtils.toString(is, StandardCharsets.UTF_8);}/*** 解析xml,解析成json* @param resultDataXML* @return*/public static String realXMLResult(String resultDataXML) {org.dom4j.Document doc;try {doc = DocumentHelper.parseText(resultDataXML); // 将字符串转为XMLorg.dom4j.Element rootElt = doc.getRootElement(); // 获取根节点org.dom4j.Element body = rootElt.element("Body"); // 获取根节点下子节点String elementOnBodyName = "";for(org.dom4j.Element element : body.elements()) {elementOnBodyName = element.getName();}org.dom4j.Element elementOnBody = body.element(elementOnBodyName); // 获取根节点下子节点// 多个returnIterator<Element> p = elementOnBody.elementIterator("return");// 遍历row节点while (p.hasNext()) {org.dom4j.Element curP = p.next();JSONObject jsonResult = JSON.parseObject(curP.getTextTrim());return jsonResult.toJSONString();}} catch (Exception e) {e.printStackTrace();return null;}return null;}
