1. 程式人生 > >java根據WSDL文件,如何呼叫WebService?

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>