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数据)来访问 ...
随机推荐
- php 从myslql里导出到excel
//导出excel 只wps可以打开public function takexcelAction(){ $name = $this->input->get_post('name'); $i ...
- (转)MySQL提示“too many connections”的解决办法
link:http://www.cfp8.com/mysql-prompt-too-many-connections-solution.html 今天生产服务器上的MySQL出现了一个不算太陌生的错误 ...
- 阴影:box-shaw
box-shaw:0px 0px 2px 3px while; 水平方向 垂直方向 模糊半径 模糊系数(大小)颜色
- Android -- 自定义带进度条的按钮
1. 实现了一个带进度条的按钮,完成后显示提示信息,并设置按钮为不可再次被点击
- IOS中NSUserDefaults的用法(轻量级本地数据存储)
NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults是首选.下次再登陆的时候就可以直接从NSUserDefa ...
- php 实现推技术comet(转)
实现实时通信一般有两种方式:socket或comet.socket是比较好的解决方案,问题在于不是所有的浏览器都兼容,服务器端实现起来也稍微有点麻烦.相比之下,comet(基于HTTP长连接的&quo ...
- Windows Phone Data Protection
To encrypt the PIN // Convert the PIN to a byte[]. byte[] PinByte = Encoding.UTF8.GetBytes(TBPin.Tex ...
- [Android] adb.exe换了位置
好久没有做android开发了,今天重新下载了新的sdk,发现adb.exe从sdk/tools里面消失了,添加了系统环境变量的路径就还是没法调动adb.exe命令,网上搜了一下原理是存在了新版的sd ...
- 【android studio】解决android studio drawable新建项目时只有一个drawable目录的问题
概述 android studio默认新建Module时,只新建一个drawable目录,并不会新建适配不同分辨率的drawable目录.但其实,这是可以设置的.有以下两种方法: 方法1 详细步骤 进 ...
- JQuery基本方法介绍和使用
1.属性 $("p").addClass(css中定义的样式类型); 给某个元素添加样式 常用于表格鼠标移动效果 $(document).ready(function(){ //& ...