1. 程式人生 > >java呼叫webservice 第三方介面

java呼叫webservice 第三方介面

         Web Service技術, 能使得執行在不同機器上的不同應用無須藉助附加的、專門的第三方軟體或硬體, 就可相互交換資料或整合。依據Web Service規範實施的應用之間, 無論它們所使用的語言、 平臺或內部協議是什麼, 都可以相互交換資料。Web Service是自描述、 自包含的可用網路模組, 可以執行具體的業務功能。Web Service也很容易部署, 因為它們基於一些常規的產業標準以及已有的一些技術,諸如標準通用標記語言下的子集XML、HTTP。Web Service減少了應用介面的花費。Web Service為整個企業甚至多個組織之間的業務流程的整合提供了一個通用機制。

WebService平臺技術
  XML+XSD,SOAP和WSDL就是構成WebService平臺的三大技術。

1、XML+XSD

       XML是WebService平臺中表示資料的格式。除了易於建立和易於分析外,XML主要的優點在於它既是平臺無關的,又是廠商無關的。無關性是比技術優越性更重要的。WebService採用HTTP協議傳輸資料,採用XML格式封裝資料(即XML中說明呼叫遠端服務物件的哪個方法,傳遞的引數是什麼,以及服務物件的返回結果是什麼)。XML解決了資料表示的問題,但它沒有定義一套標準的資料型別,更沒有說怎麼去擴充套件這套資料型別。例如,整形數到底代表什麼?16位,32位,64位?這些細節對實現互操作性很重要。XML Schema(XSD)就是專門解決這個問題的一套標準。它定義了一套標準的資料型別,並給出了一種語言來擴充套件這套資料型別。WebService平臺就是用XSD來作為其資料型別系統的。當你用某種語言(如VB.NET或C#)來構造一個Web service時,為了符合WebService標準, 所有你使用的資料型別都必須被轉換為XSD型別。你用的工具可能已經自動幫你完成了這個轉換,但你很可能會根據你的需要修改一下轉換過程。


2、SOAP

         WebService通過HTTP協議傳送請求和接收結果時,傳送的請求內容和結果內容都採用XML格式封裝,並增加了一些特定的HTTP訊息頭,以說明HTTP訊息的內容格式,這些特定的HTTP訊息頭和XML內容格式就是SOAP協議。SOAP提供了標準的RPC方法來呼叫Web Service。
        SOAP協議 = HTTP協議 + XML資料格式
        SOAP協議定義了SOAP訊息的格式,SOAP協議是基於HTTP協議的,SOAP也是基於XML和XSD的,XML是SOAP的資料編碼方式。
打個比喻:HTTP就是普通公路,XML就是中間的綠色隔離帶和兩邊的防護欄,SOAP就是普通公路經過加隔離帶和防護欄改造過的高速公路。
3、WSDL

   好比我們去商店買東西,首先要知道商店裡有什麼東西可買,然後再來購買,商家的做法就是張貼廣告海報。 WebService也一樣,WebService客戶端要呼叫一個WebService服務,首先要有知道這個服務的地址在哪,以及這個服務裡有什麼方 法可以呼叫,所以,WebService務器端首先要通過一個WSDL檔案來說明自己家裡有啥服務可以對外呼叫,服務是什麼(服務中有哪些方法,方法接受 的引數是什麼,返回值是什麼),服務的網路地址用哪個url地址表示,服務通過什麼方式來呼叫。
  WSDL(Web Services Description Language)就是這樣一個基於XML的語言,用於描述Web Service及其函式、引數和返回值。它是WebService客戶端和伺服器端都能理解的標準格式。因為是基於XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。一些最新的開發工具既能根據你的 Web service生成WSDL文件,又能匯入WSDL文件,生成呼叫相應WebService的代理類程式碼。WSDL檔案儲存在Web伺服器上,通過一個url地址就可以訪問到它。客戶端要呼叫一個WebService服務之前,要知道該服務的WSDL檔案的地址。 WebService服務提供商可以通過兩種方式來暴露它的WSDL檔案地址:1.註冊到UDDI伺服器,以便被人查詢;2.直接告訴給客戶端呼叫者。

WebService的相關概念可以參考:https://www.cnblogs.com/xdp-gacl/p/4048937.html

瞭解概念之後,到底怎麼呼叫一個WebService服務介面呢?

 

下面是呼叫中國電視節目預告(電視節目表) WEB 服務的程式碼示例!

 Endpoint: http://ws.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx

 Disco: http://ws.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx?disco 

 WSDL: http://ws.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx?wsdl 

 呼叫的是下面的方法:

程式碼示例

package com.demo;

import java.net.URL;
import java.util.Vector;

import javax.xml.namespace.QName;

import org.apache.axis.AxisEngine;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.constants.Style;
import org.apache.axis.constants.Use;
import org.apache.axis.description.OperationDesc;
import org.apache.axis.description.ParameterDesc;
import org.apache.axis.soap.SOAPConstants;


public class TestWebService {
	
	
    //定義一個數組
	public static OperationDesc[] _operations =new OperationDesc[1];
	
	
  public static String getMessage(int id,String theDate,String userId,String url) throws Exception {
	  
	  OperationDesc oper=new OperationDesc();
	  ParameterDesc param;
	  oper.setName("getTVprogramString");
	  
	  //標識Web Service的具體路徑	  
	  url="http://ws.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx";
	  
	  //建立service 例項
	  Service service=new Service();
	  
	  //通過service 建立Call 例項
	  Call call=(Call) service.createCall();
	  
	  //將Web Service的服務路徑加入到call例項之中	  
	  call.setTargetEndpointAddress(new URL(url));
	  
	  QName qname=new QName("http://WebXml.com.cn/","getTVprogramString");  //(targetNamespace, element name)
	  call.setOperationName(qname);//設定呼叫遠端方法的路徑     同 :call.setOperationName(new QName("http://WebXml.com.cn/","getTVprogramString"))
      
	  //新增引數
	  
	       //new QName("http://www.w3.org/2001/XMLSchema","int")    ---http://www.w3.org/2001/XMLSchema 為int型別對應的url 
	  param = new ParameterDesc(new QName("http://WebXml.com.cn/","theTVchannelID"),ParameterDesc.IN,new QName("http://www.w3.org/2001/XMLSchema","int"),int.class,false,false);
	  param.setOmittable(true);
	  oper.addParameter(param);
	  param = new ParameterDesc(new QName("http://WebXml.com.cn/","theDate"),ParameterDesc.IN,new QName("http://www.w3.org/2001/XMLSchema","String"),String.class,false,false);
	  param.setOmittable(true);
	  oper.addParameter(param);
	  param = new ParameterDesc(new QName("http://WebXml.com.cn/","userID"),ParameterDesc.IN,new QName("http://www.w3.org/2001/XMLSchema","String"),String.class,false,false);
	  param.setOmittable(true);
	  oper.addParameter(param);
	  
	  //設定返回型別
	  oper.setReturnType(new QName("http://xml.apache.org/xml-soap","Vector"));
	  
	  //設定Document wrapped + Literal
	  oper.setStyle(Style.WRAPPED);   
	  oper.setUse(Use.LITERAL);
	  //_operations[0]=oper;  //陣列形式
	  
	  
	  call.setOperation(oper);
	  //call.setOperation(_operations[0]); // 陣列形式
	  call.setSOAPActionURI("http://WebXml.com.cn/getTVprogramString");
	  call.setUseSOAPAction(true);
	  
	  call.setProperty(Call.SEND_TYPE_ATTR, Boolean.FALSE);
	  call.setProperty(AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE);
      call.setSOAPVersion(SOAPConstants.SOAP12_CONSTANTS);
      
      //呼叫方法,返回一維陣列
      
      Vector<String> Msg =(Vector<String>) call.invoke(new Object[] {id,theDate, userId});
      System.out.println(Msg);
      
	  
	  
	  
	  
	  
	  
	return null;
	  
  }
  
  public static void main(String[] args) throws Exception {
	
	  getMessage(2,"2018-10-10","","http://ws.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx");
}

}

 

返回結果:

[06:00(AM)@@@重播:電視劇@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 06:55(AM)@@@重播:百姓文化錄@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 07:00(AM)@@@重播:每日文娛播報@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 08:25(AM)@@@重播:笑動歡樂秀@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 09:00(AM)@@@笑動歡樂秀@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 10:05(AM)@@@笑動歡樂秀@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 11:00(AM)@@@電視劇@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 11:55(AM)@@@百姓文化錄@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 12:00(AM)@@@每日文娛播報@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 13:05(AM)@@@重播:笑動歡樂秀@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 13:55(AM)@@@喜劇合夥人@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 14:45(AM)@@@重播:百姓文化錄@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 14:50(AM)@@@我看行@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 15:20(AM)@@@笑動歡樂秀@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 16:25(AM)@@@笑動歡樂秀@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 17:00(AM)@@@電視劇@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 18:00(PM)@@@我看行@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 18:30(PM)@@@每日文娛播報@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 19:35(PM)@@@影視風雲@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 20:30(PM)@@@電視劇@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 21:20(PM)@@@電視劇@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 22:10(PM)@@@電視劇@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 23:00(PM)@@@重播:每日文娛播報@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 00:03(PM)@@@重播:我看行@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 00:30(PM)@@@重播:百姓文化錄@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 00:33(PM)@@@重播:影視風雲@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 01:23(PM)@@@重播:笑動歡樂秀@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 02:13(PM)@@@重播:笑動歡樂秀@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 03:43(PM)@@@重播:電視劇@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 04:38(PM)@@@重播:笑動歡樂秀@@@北京市 | 北京電視臺 | BTV-2 文藝頻道, 05:08(PM)@@@重播:笑動歡樂秀@@@北京市 | 北京電視臺 | BTV-2 文藝頻道]