wsdl是通過wsdl文件作為不同應用的通信接口,所以如何生成wsdl語言很重要,但是很多時候我們發現自己編寫的頭文件通過gsoap工具soapcpp2.exe從頭文件中無法正常生成對應的wsdl語言,幾經尋找,終於發現:
通過對應頭文件.h生成客戶端或服務器代理代碼的時候,對應的頭文件中的注釋描述信息和對外接口都需要有規定的格式才能正確生成wsdl語言文件。
1、如過頭文件中導出函數命名沒有前綴,那么能生成對應的客戶端或服務器代理相關代碼,但是無法為每一個接口生成對應的請求和響應wsdl文件,否則,必須添加ns__前綴,注意是兩條下划線才可以生成,且生成的schema對應的域名為默認ns.xsd
頭文件:
#ifndef _C_WEB_CLIENT_INTERFACE_
#define _C_WEB_CLIENT_INTERFACE_
int ns__Add( int num1, int num2, int* sum );
int ns__Sub(int num1, int num2, int* sum);
int ns__Mul(char *namelist, char **arealist);
#endif
生成命令:
soapcpp2 -c test.h -1
生成結果包含各個接口的請求和響應wsdl文件,例如Add方法的請求wsdl: ns.Add.req.xml
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns="http://tempuri.org/ns.xsd">
<SOAP-ENV:Body>
<ns:Add>
<num1>0</num1>
<num2>0</num2>
</ns:Add>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Add方法的響應wsdl文件:ns.Add.res.xml
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns="http://tempuri.org/ns.xsd">
<SOAP-ENV:Body>
<ns:AddResponse>
<sum>0</sum>
</ns:AddResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
2、加入帶注釋的wsdl配置項目
#ifndef _C_WEB_CLIENT_INTERFACE_
#define _C_WEB_CLIENT_INTERFACE_
// wsdl配置項
//gsoap ns service name: name_area
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service namespace: http://127.0.0.1:9000/name_area.wsdl
//gsoap ns service location: http://127.0.0.1:9000/name_area
//gsoap ns schema namespace: urn:name_area
int ns__Add( int num1, int num2, int* sum );
int ns__Sub(int num1, int num2, int* sum);
int ns__Mul(char *namelist, char **arealist);
#endif
生成add方法的請求wsdl文件名:name_area.Add.req.xml
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns="urn:name_area">
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<ns:Add>
<num1>0</num1>
<num2>0</num2>
</ns:Add>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
生成add方法的響應wsdl文件名:name_area.Add.res.xml
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns="urn:name_area">
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<ns:AddResponse>
<sum>0</sum>
</ns:AddResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
總結: 要想生成對應的wsdl文件,接口命名必須以ns__前綴打頭,其次要控制對應wsdl文件文件名和編碼等配置,必須要有對應的注釋配置項目,soapcpp2工具會自動檢查對應配置生成對應的文件;
---------------------
轉自:https://blog.csdn.net/sunxiaopengsun/article/details/77069126
作為一個java開發人員,當我們獲取到了對方提供的wsdl地址,然后在網頁上能夠訪問wsdl文檔以后,如何調用對方的webservic借口呢?
一下有幾種方法,可以參考一下。
第一種是 HttpURLConnection方式
第二種是 JSP頁面上純JS調用
內容說明
1、WSDL文檔基本說明
2、httpURLConnection方式調用
3、JS方式調用
4、獲取的數據如何解析?
1、WSDL文檔基本說明
接口文檔如下:以下是公共對外開放的查詢手機號歸屬地的一個借口文檔:
WSDL:http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
可以自己用瀏覽器打開訪問一下;
一眼望去,可能接口看起來很復雜,較為繁瑣。 但是作為開發人員,使用的時候, 我們可以查看關注點信息,就能實現接口的調用了!!
那么我們需要了解嗎哪些信息呢?
從上面的文檔里面,我們需要從頭部(最上面一行)了解到:
系統的targetNamespace="http://WebXml.com.cn/"
從<wsdl:types>標簽里的<s:element ></s:element>的name=“xxxxxxx”,獲知該文檔提供了兩個方法:
getMobileCodeInfo、getDatabaseInfo(后面帶Response的是對應方法的回復)
從底部的<wsdl:service name="MobileCodeWS"></wsdl:service>標簽里面,能獲知<http:address location="http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx"/>請求地址。
http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx
一般而言,知悉以上信息,你就能調用借口了。需要傳參數調用的,可能在業務上需要與對方了解一下,參數的格式(數據類型,文檔里是可以知曉的)
2、httpURLConnection方式調用
代碼如下:
package com.ssh.webserviceTSY; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.net.HttpURLConnection;import java.net.URL; public class Test { public static void main(String[] args) throws IOException { //第一步:創建服務地址 URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"); //第二步:打開一個通向服務地址的連接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //第三步:設置參數 //3.1發送方式設置:POST必須大寫 connection.setRequestMethod("POST"); //3.2設置數據格式:content-type connection.setRequestProperty("content-type", "text/xml;charset=utf-8"); //3.3設置輸入輸出,因為默認新創建的connection沒有讀寫權限, connection.setDoInput(true); connection.setDoOutput(true); //第四步:組織SOAP數據,發送請求 String soapXML = getXML("17321242779"); //將信息以流的方式發送出去 OutputStream os = connection.getOutputStream(); os.write(soapXML.getBytes()); //第五步:接收服務端響應,打印 int responseCode = connection.getResponseCode(); if(200 == responseCode){//表示服務端響應成功 //獲取當前連接請求返回的數據流 InputStream is = connection.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String temp = null; while(null != (temp = br.readLine())){ sb.append(temp); } /** * 打印結果 */ System.out.println(sb.toString()); is.close(); isr.close(); br.close(); } os.close(); } public static String getXML(String phone){ String soapXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2003/XMLSchema-instance\" " +"xmlns:web=\"http://WebXml.com.cn/\" " +"xmlns:xsd=\"http://www.w3.org/2003/XMLSchema\" " +"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +"<soap:Body>" +"<web:getMobileCodeInfo>" +phone +"</web:getMobileCodeInfo>" +"</soap:Body>" +"</soap:Envelope>"; return soapXML; } }
說明 :
一般的HTTP請求大部分都是相同的,但是由於webservice是基於soap協議的,所以,請求時的文本格式需要設置好。
文中的soapXML信息,需要注意xmlns:web=“tns” 這個xml命名空間, 這個空間是依據wsdl文檔里的頭部NameSpace信息,確定的
程序會依據這個名稱,檢索到該文檔里面的方法,譬如:
<web: getDatabaseInfo> 獲取getDatabaseInfo方法 (web是xmlns的名字,可以自定義,相當於“id”)
3、JS方式調用
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Test WebService</title><script type="text/javascript" src="js/jquery-2.1.1.min.js"></script><script>$(function(){invoke();back();});var xhr;function invoke(){ if(window.ActiveXObject){ xhr = new ActiveXObject("Microsoft.XMLHTTP"); }else{ xhr = new XMLHttpRequest(); } //指定請求地址 var url = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"; //定義請求類型和地址和異步,一般都是post方式。 xhr.open("POST", url, true); //設置Content-Type xhr.setRequestHeader("Content-Type", "text/xml;charset=UTF-8"); //指定回調方法 xhr.onreadystatechange = back; //組裝消息體的數據 var data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ' ' xmlns:web="http://WebXml.com.cn/" ' ' xmlns:xsd="http://www.w3.org/2003/XMLSchema" ' ' xmlns:xsi="http://www.w3.org/2003/XMLSchema-instance">' +'<soapenv:Body>' +'<web:getDatabaseInfo>' +'<data>' +'17321242719' +'</data>' +'</web:getDatabaseInfo>' +'</soapenv:Body>' +'</soapenv:Envelope>'; xhr.send(data); }function back(){ if(xhr.readyState == 4){ if(xhr.status == 200){ var doc = xhr.responseXML; alert(xhr.getAllResponseHeaders()); // xhr.getResponseBodyAsStream alert(xhr.responseText); } }/* else{ alert("請求失敗") } */}</script></head><body></body></html>
--------------------- 作者:森雅香 來源:CSDN 原文:https://blog.csdn.net/myblogzz/article/details/80311038 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
