SOAP协议 访问Webservice
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
已整理成完整項目,并進行了優(yōu)化。看參考地址:
https://gitee.com/andy_longjie/soap-call-service
SOAP的作用:? ????
????? 客戶端:取得服務端的服務描述文件WSDL,解析該文件的內容,了解服務端的服務信息,以及調用方式。根據需要,生成恰當的SOAP請求消息(指定調用的方法,已經調用的參數),發(fā)往服務端。等待服務端返回的SOAP回應消息,解析得到返回值。
? ?? ? 服務端:生成服務描述文件,以供客戶端獲取。接收客戶端發(fā)來的SOAP請求消息,解析其中的方法調用和參數格式。根據WSDL和WSML的描述,調用相應的COM對象來完成指定功能,并把返回值放入SOAP回應消息返回給用戶。
下面以“天氣預報”為例 (http://www.webxml.com.cn/WebServices/WeatherWebService.asmx ),自己封裝幾個類,做一個接口訪問。
封裝SOAP訪問參數的實體類:SoapParam.java
?
package andy.demo.tests;/*** * @文件名 :SoapParam.java<br>* @類描述 :調用 webservice的配置類<br>* @作者 :Andy.wang<br>* @創(chuàng)建時間 :2013-11-7下午2:45:36<br>* @更改人 :<br>* @更改時間 :<br>*/ public class SoapParam {/*** 多個參數名或多個參數值,之間的分隔符*/public static final String SPLITFLAG = "!";/*** 空構造,屬性初始化*/public SoapParam() {// TODO Auto-generated constructor stubsuper();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 發(fā)布的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<br>* @類描述 :獲取服務器端返回的結果<br>* @作者 :Andy.wang<br>* @創(chuàng)建時間 :2013-11-7下午3:00:46<br>* @更改人 :<br>* @更改時間 :<br>*/ public class GetResult {// SoapRequeatContent 的 錯誤返回碼private final String faultCode = "-1";private SoapParam soapParam;/*** 構造,給屬性soapParam賦值* * @param soapParam*/public GetResult(SoapParam soapParam) {// TODO Auto-generated constructor stubthis.soapParam = soapParam;}/*** * 方法名 :getSoapRequestContent<br>* 方法描述 :獲取請求的Soap內容<br>* 創(chuàng)建者 :Andy.wang<br>* 創(chuàng)建時間 :2013-11-7下午3:03:41 <br>* * <a href="\"http://www.eoeandroid.com/home.php?mod=space&uid=7300\"" target="\"_blank\"">@return</a> 返回類型 :String*/private String getSoapRequestContent() {StringBuffer sb = new StringBuffer(16);// 頭部分sb.append("<?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>");// 中間部分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<i>.trim().equals("")) {// 參數為:1級數組sb.append("<" + names<i>.trim() + ">"+ values<i>.trim() + "</" + names<i>.trim()+ ">");}}}}sb.append("</" + methodName.trim() + ">");// 尾部分sb.append("</soap:Body></soap:Envelope>");return sb.toString();}public InputStream getResponseForInputStream() {String soap = getSoapRequestContent();return getResponseForInputStream(soap);}public String getResponseForString() {String soap = getSoapRequestContent();return getResponseForString(soap);}/*** * 方法名 :getResponseForInputStream<br>* 方法描述 :獲取服務器響應返回的流<br>* 創(chuàng)建者 :Andy.wang<br>* 創(chuàng)建時間 :2013-11-7下午3:31:39 <br>* * @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<br>* 方法描述 :獲取服務器響應返回的字符串<br>* 創(chuàng)建者 :Andy.wang<br>* 創(chuàng)建時間 :2013-11-7下午3:57:19 <br>* * @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 exceptione.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>特別行政區(qū)< /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>
已整理成完整項目,并進行了優(yōu)化。看參考地址:
https://gitee.com/andy_longjie/soap-call-service
轉載于:https://my.oschina.net/andy1989/blog/215447
總結
以上是生活随笔為你收集整理的SOAP协议 访问Webservice的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库设计模式备忘
- 下一篇: 【Asp.Net】Asp.Net Com