java模拟soap请求:
// HttpClient发送SOAP请求
System.out.println("HttpClient 发送SOAP请求");
HttpClient client = new HttpClient();
PostMethod postMethod = new PostMethod(wsdl);
// 设置连接超时
client.getHttpConnectionManager().getParams().setConnectionTimeout(timeout);
// 设置读取时间超时
client.getHttpConnectionManager().getParams().setSoTimeout(timeout);
// 然后把Soap请求数据添加到PostMethod中
RequestEntity requestEntity = new StringRequestEntity(sb.toString(), "text/xml", "UTF-8");
//设置请求头部,否则可能会报 “no SOAPAction header” 的错误
postMethod.setRequestHeader("SOAPAction","");
// 设置请求体
postMethod.setRequestEntity(requestEntity);
int status = client.executeMethod(postMethod);
// 打印请求状态码
System.out.println("status:" + status);
// 获取响应体输入流
InputStream is = postMethod.getResponseBodyAsStream();
// 获取请求结果字符串
String result = IOUtils.toString(is);
System.out.println("result: " + result);
解析soap报文:
/**
* 解析返回报文
* @param node 标记所在节点
* @param attr 标记所在属性
* @param soap 报文
* @return 标记值
* @throws
*/
public static String parseResponseSoap(String node, String attr, String soap){
//然后用SOAPMessage 和 SOAPBody
Document personDoc;
try {
personDoc = new SAXReader().read(new StringReader(soap));
Element rootElt = personDoc.getRootElement(); // 获取根节点
Iterator body = rootElt.elementIterator("Body");
while (body.hasNext()) {
Element recordEless = (Element) body.next();
return nextSubElement(node,attr,recordEless);
}
} catch (DocumentException e) {
throw new BusinessException(e.getMessage());
}
return "";
}
/**
* 递归方法,查找本节点是否有标记信息,如果没有就查找下一层,
* 在下一层里同样查找本层节点,只要找到值,就层层返回。
* @param node 节点标签名
* @param attr 节点属性值
* @param el 当前节点对象
* @return 目标值
*/
public static String nextSubElement(String node, String attr, Element el) {
if (el.getName().equals(node)) {
//说明 找到了目标节点
//属性值为空说明取标签内容
if (attr.equals("")) {
Iterator sub2 = el.elementIterator();
//有子节点说明标签内容不是单一值,需要拿到查询结果
if (sub2.hasNext()) {
while (sub2.hasNext()) {
Element s2 = (Element) sub2.next();
//如果返回的不是单一的标记值,而是查询结果,有些麻烦,
//查询结果应当是list<map>格式,但是map的key值不好确定,是标签名作为key还是属性值作为key
//todo
}
} else {
return el.getText();
}
} else {
Attribute attrbute = el.attribute(attr);
return attrbute.getText();
}
} else {
Iterator sub2 = el.elementIterator();
while (sub2.hasNext()) {
Element sub = (Element) sub2.next();
return nextSubElement(node, attr, sub);
}
}
return "";
}
使用实例:parseResponseSoap(“PolicyV2Result”, “”, result);