webService 发送soap请求,并解析返回的soap报文
本例应用场景:要做一个webService测试功能,不局限于任何一种固定格式的webService,所以像axis,cxf等框架就不好用了。只有深入到webService的原理,通过发收soap报文,来调用服务返回结果。
发送请求:
/**
* 通过httpClient发送soap报文
* @param requestSoap 请求报文
* @param serviceAddress 请求地址
* @param charSet 字符集
* @param contentType 返回的contentType
* @return 响应报文
* @throws WebServiceModuleRuntimeException
*/
public String sendRequestSoap(String requestSoap, String serviceAddress, String charSet, String contentType)
throws WebServiceModuleRuntimeException {
String resultSoap = "";
PostMethod postMethod = new PostMethod(serviceAddress);
byte[] b = new byte[0];
try {
b = requestSoap.getBytes(charSet);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
InputStream is = new ByteArrayInputStream(b, 0, b.length);
RequestEntity re = new InputStreamRequestEntity(is, b.length, contentType);
postMethod.setRequestEntity(re); HttpClient httpClient = new HttpClient();
int statusCode = 0;
try {
statusCode = httpClient.executeMethod(postMethod);
System.out.println("statusCode = " + statusCode);
} catch (IOException e) {
throw new WebServiceModuleRuntimeException("执行http请求失败", e);
}
if (statusCode == 200) {
try {
resultSoap = postMethod.getResponseBodyAsString();
} catch (IOException e) {
throw new WebServiceModuleRuntimeException("获取请求返回报文失败", e);
}
} else {
throw new WebServiceModuleRuntimeException("请求失败:" + statusCode);
} return resultSoap;
}
//调用请求方法,发送报文
String responseSoap = "";
try{
responseSoap = webServiceService.sendRequestSoap(requestSoap,struct.getWebAddress(),"utf-8","text/xml; charset=utf-8");
}catch (WebServiceModuleRuntimeException ex){
throw new ModuleException("发动请求失败",ex);
}
解析返回报文:
因没有固定格式,所以无法通过jaxb工具来xml转bean,更没有客户端代码可以用。所以只有解析返回报文中,可以标识返回结果的值,比如成功、success、ok等。
此处考虑两种情况:第一种状态码放在标签的属性值中,第二种状态作为标签的内容:
<result ResultCode="0" ResultCodeDesc="成功">
<result_code>0</result_code>
System.out.println(parseResponseSoap("result_code", "", responseSoap));
/**
* 解析返回报文
* @param node 标记所在节点
* @param attr 标记所在属性
* @param soap 报文
* @return 标记值
* @throws WebServiceModuleRuntimeException
*/
public static String parseResponseSoap(String node, String attr, String soap) throws WebServiceModuleRuntimeException {
//然后用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 WebServiceModuleRuntimeException("解析返回报文失败", e);
}
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 "";
}
后记:本篇代码满足我自己的需求,但是看官的需求各异,本篇仅提供部分参考。
webService 发送soap请求,并解析返回的soap报文的更多相关文章
- 使用HttpClient来异步发送POST请求并解析GZIP回应
.NET 4.5(C#): 使用HttpClient来异步发送POST请求并解析GZIP回应 在新的C# 5.0和.NET 4.5环境下,微软为C#加入了async/await,同时还加入新的Syst ...
- 通过java代码HttpRequestUtil(服务器端)发送HTTP请求并解析
关键代码:String jsonStr = HttpRequestUtil.sendGet(config.getAddress() + config.getPorts() + config.getFi ...
- java内部发送http请求并取得返回结果,修改response的cookie
public Object userLogin(HttpServletRequest request, HttpServletResponse response, String email, Stri ...
- JMeter发送get请求并分析返回结果
在实际工作的过程中,我们通常需要模拟接口,来进行接口测试,我们可以通过JMeter.postman等多种工具来进行接口测试,但是工具的如何使用对于我们来说并不是最重要的部分,最重要的是设计接口测试用例 ...
- 从客户发送http请求到服务器返回http之间发生了什么
由于我知识有限,可能会有模糊或者错误的地方,欢迎讨论与指正. 1.浏览器发出http请求 当用户访问一个url时,浏览器便会开始生成一个http请求. 首先获取http请求中所需要的参数,如url,c ...
- autojs,autojs 发送http请求,autojs 解析json数据
如题,我这个就直接上代码吧 (function () { let request = http.request; // 覆盖http关键函数request,其他http返回最终会调用这个函数 http ...
- WebService如何封装XML请求 以及解析接口返回的XML
原 WebService如何封装XML请求 以及解析接口返回的XML 置顶 2019年08月16日 15:00:47 童子泛舟 阅读数 28 标签: XML解析WebService第三方API 更多 ...
- [转]C#通过Http发送Soap请求
/// <summary> /// 发送SOAP请求,并返回响应xml /// </summary> /// <param na ...
- Android使用webService(发送xml数据的方式,不使用jar包)
Android使用webService可以用ksoap2.jar包来使用.但是我觉得代码不好理解,而且记不住. 所以我查询了好多资料,以及自己的理解.可以用代码发送http请求(发送xml数据)来访问 ...
随机推荐
- weblogic应用平台常见问题小结
http://blog.sina.com.cn/s/blog_4aa08b7c010004yc.html 1.当以另一用户登录系统后,系统却显示的是前一用户的身份. 这是由于页面信息没有刷新造成 ...
- ThinkPHP3.2.2 Widget扩展以及widget demo实例
Widget扩展一般用于页面组件的扩展. 先说明Widget被调用的方法,你只需要在你的模板文件中使用这样的语法:{:W("Demo/demo_widget_method",arr ...
- light oj 1047 - Neighbor House 动态规划
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730#problem/C 题目: Description The peopl ...
- Crossing River
Crossing River 题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=26251 题意: N个人希望去过 ...
- 集合 ArrayList 类
集合的基本信息: System.Collections 系统类中的收藏类,定义各种对象(如列表,队列,位数组,哈希表和字典)的集合 常用的集合为ArrayList类:特殊集合一般会用到Queue队 ...
- Android-----工程文件目录介绍
- HTML5 表单属性
form 属性 form 属性规定输入域所属的一个或多个表单. 注释:form 属性适用于所有 <input> 标签的类型. form 属性必须引用所属表单的 id: 实例 <for ...
- jq实现点击表格无刷新修改数据,优化版
<!-------------------修改密码-------------------------- > $("#pwd").live("click&quo ...
- ACM Steps 2.1.4
Largest prime factor Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- ob_clean()
我在本地写的系统,部署到虚拟机上的时候,验证码出现问题不显示.加上这个函数之后,验证码出现了.具体的该学习去了.