博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SOAP协议 访问Webservice
阅读量:6440 次
发布时间:2019-06-23

本文共 10972 字,大约阅读时间需要 36 分钟。

hot3.png

已整理成完整项目,并进行了优化。看参考地址:

SOAP的作用:      

      客户端:取得服务端的服务描述文件WSDL,解析该文件的内容,了解服务端的服务信息,以及调用方式。根据需要,生成恰当的SOAP请求消息(指定调用的方法,已经调用的参数),发往服务端。等待服务端返回的SOAP回应消息,解析得到返回值。

       服务端:生成服务描述文件,以供客户端获取。接收客户端发来的SOAP请求消息,解析其中的方法调用和参数格式。根据WSDL和WSML的描述,调用相应的COM对象来完成指定功能,并把返回值放入SOAP回应消息返回给用户。

下面以“天气预报”为例 (http://www.webxml.com.cn/WebServices/WeatherWebService.asmx ),自己封装几个类,做一个接口访问。

封装SOAP访问参数的实体类:SoapParam.java

 

package andy.demo.tests; /** *  * @文件名 :SoapParam.java
* @类描述 :调用 webservice的配置类
* @作者 :Andy.wang
* @创建时间 :2013-11-7下午2:45:36
* @更改人 :
* @更改时间 :
*/public class SoapParam { /** * 多个参数名或多个参数值,之间的分隔符 */ public static final String SPLITFLAG = "!"; /** * 空构造,属性初始化 */ public SoapParam() { // TODO Auto-generated constructor stub super(); this.url = ""; this.methodName = ""; this.interfaceName = ""; this.paraNames = ""; this.paraValues = ""; } /** * 构造,属性赋值 * * @param url * @param methodName * @param interfaceName * @param paraNames * @param paraValues */ public SoapParam(String url, String methodName, String interfaceName, String paraNames, String paraValues) { this.url = url; this.methodName = methodName; this.interfaceName = interfaceName; this.paraNames = paraNames; this.paraValues = paraValues; } /** * webservice 发布的URL地址 */ private String url; /** * 要调用的方法名 */ private String methodName; /** * 要调用方法的接口名 */ private String interfaceName; /** * 要调用方法的参数名,(有多个参数用”#“号隔开;没有参数可不写)。 */ private String paraNames; /** * 要调用方法的参数值,(同多个参数值用”#“号隔开;没有的话就不写)必须与参数名的个数一致。 */ private String paraValues; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public String getInterfaceName() { return interfaceName; } public void setInterfaceName(String interfaceName) { this.interfaceName = interfaceName; } public String getParaNames() { return paraNames; } public void setParaNames(String paraNames) { this.paraNames = paraNames; } public String getParaValues() { return paraValues; } public void setParaValues(String paraValues) { this.paraValues = paraValues; } }

获取WebService 返回结果的类:GetResult.java (提供两种结果,一种为字符串,一种为InputStream流)

 

package andy.demo.tests; import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection; /** *  * @文件名 :GetResult.java
* @类描述 :获取服务器端返回的结果
* @作者 :Andy.wang
* @创建时间 :2013-11-7下午3:00:46
* @更改人 :
* @更改时间 :
*/public class GetResult { // SoapRequeatContent 的 错误返回码 private final String faultCode = "-1"; private SoapParam soapParam; /** * 构造,给属性soapParam赋值 * * @param soapParam */ public GetResult(SoapParam soapParam) { // TODO Auto-generated constructor stub this.soapParam = soapParam; } /** * * 方法名 :getSoapRequestContent
* 方法描述 :获取请求的Soap内容
* 创建者 :Andy.wang
* 创建时间 :2013-11-7下午3:03:41
* * @return 返回类型 :String */ private String getSoapRequestContent() { StringBuffer sb = new StringBuffer(16); // 头部分 sb.append("
" + "
" + "
"); // 中间部分 String methodName = soapParam.getMethodName(); String interfaceName = soapParam.getInterfaceName(); String paraNames = soapParam.getParaNames(); String paraValues = soapParam.getParaValues(); if (null == methodName || "".equals(methodName) || null == interfaceName || "".equals(interfaceName)) { return faultCode; } sb.append("<" + methodName.trim() + " xmlns=\"" + interfaceName.trim() + "\">"); if (null != paraNames && null != paraValues) { String names[] = paraNames.split(SoapParam.SPLITFLAG); String values[] = paraValues.split(SoapParam.SPLITFLAG); // 参数名的个数 必须和 实参的个数一致 if (names.length == values.length) { for (int i = 0; i < names.length; i++) { if (!names
.trim().equals("")) { // 参数为:1级数组 sb.append("<" + names.trim() + ">" + values.trim() + "
.trim() + ">"); } } } } sb.append("
"); // 尾部分 sb.append("
"); return sb.toString(); } public InputStream getResponseForInputStream() { String soap = getSoapRequestContent(); return getResponseForInputStream(soap); } public String getResponseForString() { String soap = getSoapRequestContent(); return getResponseForString(soap); } /** * * 方法名 :getResponseForInputStream
* 方法描述 :获取服务器响应返回的流
* 创建者 :Andy.wang
* 创建时间 :2013-11-7下午3:31:39
* * @return 返回类型 :InputStream */ private InputStream getResponseForInputStream(String soap) { System.out.println(soap); // 获取请求的soap内容错误 if (soap.equals(faultCode)) { return null; } URL url = null; InputStream is = null; try { url = new URL(soapParam.getUrl()); URLConnection conn = url.openConnection(); conn.setUseCaches(false);// POST请求 禁用缓存 conn.setReadTimeout(6000);// 设置请求时间 conn.setDoInput(true);// 设置从conn读入 conn.setDoOutput(true);// 设置从conn输出 conn.setRequestProperty("Content-Length", Integer.toString(soap.length())); conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); conn.setRequestProperty( "SOAPAction", String.valueOf(soapParam.getInterfaceName() + soapParam.getMethodName())); OutputStream os = conn.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8"); osw.write(soap); osw.flush(); osw.close(); is = conn.getInputStream(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return is; } /** * * 方法名 :getResponseForString
* 方法描述 :获取服务器响应返回的字符串
* 创建者 :Andy.wang
* 创建时间 :2013-11-7下午3:57:19
* * @param is * :服务器响应返回的流 * @return * @throws IOException * 返回类型 :String */ private String getResponseForString(String soap) { try { InputStream is = getResponseForInputStream(soap); if (null == is) { return null; } ByteArrayOutputStream os = new ByteArrayOutputStream(); byte[] buffer = new byte[1024 * 100]; int len = 0; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); } buffer = os.toByteArray(); os.flush(); os.close(); is.close(); return os.toString("UTF-8"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return null; } }

测试类:Test.java

输出结果:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><getSupportProvince xmlns="http://WebXml.com.cn/"></getSupportProvince></soap:Body></soap:Envelope>

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><getSupportProvinceResponse xmlns="http://WebXml.com.cn/"><getSupportProvinceResult>< string>直辖市</string><string>特别行政区< /string><string>黑龙江</string><string>吉林< /string><string>辽宁</string><string>内蒙古< /string><string>河北</string><string>河南< /string><string>山东</string><string>山西< /string><string>江苏</string><string>安徽< /string><string>陕西</string><string>宁夏< /string><string>甘肃</string><string>青海< /string><string>湖北</string><string>湖南< /string><string>浙江</string><string>江西< /string><string>福建</string><string>贵州< /string><string>四川</string><string>广东< /string><string>广西</string><string>云南< /string><string>海南</string><string>新疆< /string><string>西藏</string><string>台湾< /string><string>亚洲</string><string>欧洲< /string><string>非洲</string><string>北美洲< /string><string>南美洲</string><string>大洋洲< /string></getSupportProvinceResult></getSupportProvinceResponse></soap:Body></soap:Envelope>

已整理成完整项目,并进行了优化。看参考地址:

转载于:https://my.oschina.net/andy1989/blog/215447

你可能感兴趣的文章
[Leetcode] Path Sum
查看>>
Ext江湖
查看>>
一起谈.NET技术,实战ASP.NET大规模网站架构:Web加速器
查看>>
RHEL 6.6下Python 2.6.6升级到Python 3.6.6
查看>>
linux 内核启动过程以及挂载android 根文件系统的过程 ( 转)
查看>>
shell每日更新(7)
查看>>
单词的个数
查看>>
从程序员到项目经理(27):怎样给领导汇报工作
查看>>
eclipse工程 'cocostudio/CocoStudio.h' file not found
查看>>
045医疗项目-模块四:采购单模块—采购单提交(Dao,Service,Action三层)
查看>>
dockerfile创建php容器(安装memcached、redis、gd、xdebug扩展)
查看>>
转:面对JXTA,我迷茫了
查看>>
IT人必须学会的职场四原则
查看>>
Android之剪贴薄实现
查看>>
WPF数据模板和控件模板
查看>>
Sonix SN9P701 OCR点读笔二维码识别源码
查看>>
oracle 单引号 双引号 连接符
查看>>
[golang] implicit assignment of unexported field
查看>>
数据结构 练习 20-查找 算法
查看>>
hadoop集群虚拟机配置
查看>>