java根據WSDL文件,如何呼叫WebService?
作為一個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>