java調用webservice接口的幾種方法

2021-02-16 java工會

前幾天看到群裡有人問webservice,稍微總結一下!

webservice的 發布一般都是使用WSDL(web service descriptive language)文件的樣式來發布的,在WSDL文件裡面,包含這個webservice暴露在外面可供使用的接口。今天搜索到了非常好的 webservice provider列表

http://www.webservicex.net/WCF/default.aspx

這上面列出了70多個包括很多方面的free webservice provider,utilities->global weather就可以獲取全球的天氣預報。

下面我們來看Java如何通過WSDL文件來調用這些web service:

注意,以下的代碼並沒有經過真正的測試,只是說明這些情況,不同版本的Axis相差很大,大家最好以apache網站上的例子為準,這裡僅僅用於說明其基本用法。

1,直接AXIS調用遠程的web service

我覺得這種方法比較適合那些高手,他們能直接看懂XML格式的WSDL文件,我自己是看不懂的,尤其我不是專門搞這行的,即使一段時間看懂,後來也就忘記了。直接調用模式如下:

import java.util.Date;
import java.text.DateFormat;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import java.lang.Integer;
import javax.xml.rpc.ParameterMode;

public class caClient {
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";
           //直接引用遠程的wsdl文件
           //以下都是套路
           Service service = new Service();
           Call call = (Call) service.createCall();
           call.setTargetEndpointAddress(endpoint);
           call.setOperationName("addUser");//WSDL裡面描述的接口名稱
           call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,
                   javax.xml.rpc.ParameterMode.IN);//接口的參數
           call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//設置返回類型
           String temp = "測試人員";
           String result = (String) call.invoke(new Object[]{temp});//給方法傳遞參數,並且調用方法
           System.out.println("result is " + result);
       } catch (Exception e) {
System.err.println(e.toString());
       }
}
}


2,直接SOAP調用遠程的webservice

這種模式我從來沒有見過,也沒有試過,但是網絡上有人貼出來,我也轉過來

import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;
import java.io.*;
import java.net.*;
import java.util.Vector;

public class caService {
public static String getService(String user) {
URL url = null;
       try {
url = new URL("http://192.168.0.100:8080/ca3/services/caSynrochnized");
       } catch (MalformedURLException mue) {
return mue.getMessage();
       }

// This is the main SOAP object
       Call soapCall = new Call();
       
       // Use SOAP encoding
       soapCall.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
       
       // This is the remote object we're asking for the price
       soapCall.setTargetObjectURI("urn:xmethods-caSynrochnized");
       
       // This is the name of the method on the above object
       soapCall.setMethodName("getUser");
       
       // We need to send the ISBN number as an input parameter to the method
       Vector soapParams = new Vector();
       
       // name, type, value, encoding style
       Parameter isbnParam = new Parameter("userName", String.class, user, null);
       soapParams.addElement(isbnParam);
       soapCall.setParams(soapParams);
       try {
// Invoke the remote method on the object
           Response soapResponse = soapCall.invoke(url, "");
           
           // Check to see if there is an error, return "N/A"
           if (soapResponse.generatedFault()) {
Fault fault = soapResponse.getFault();
               String f = fault.getFaultString();
               return f;
           } else {
// read result
               Parameter soapResult = soapResponse.getReturnValue();
               
               // get a string from the result
               return soapResult.getValue().toString();
           }
} catch (SOAPException se) {
return se.getMessage();
       }
}
}

3,使用wsdl2java把WSDL文件轉成本地類,然後像本地類一樣使用,即可。

這是像我這種懶人最喜歡的方式,仍然以前面的global weather report為例。

首先 java org.apache.axis.wsdl.WSDL2Java 

http://www.webservicex.net/globalweather.asmx.WSDL

原本的網址是http://www.webservicex.net/globalweather.asmx?WSDL,中間個各問號,但是Linux下面它不能解析,所以去掉問號,改為點號。

那麼就會出現4個文件:

GlobalWeather.java 

GlobalWeatherLocator.java 

GlobalWeatherSoap.java 

GlobalWeatherSoapStub.java

其中GlobalWeatherSoap.java是我們最為關心的接口文件,如果你對RMI等SOAP實現的具體細節不感興趣,那麼你只需要看接口文件即可,在使用的時候,引入這個接口即可,就好像使用本地類一樣。

順便說一下,現在的項目基本都不用webservice了,RPC調用我們公司用的比較多的就是dubbo框架了。

文末福利,關注「java工會」後臺回覆:

回復【視頻】:100G+免費學習視頻
回復【書籍真多】:1000+冊免費編程電子書
回復【加群】:java技術學習交流群,阿里大神和你聊技術

相關焦點

  • WebService接口的生成和調用(WebService接口)
    這就是說,別人能夠用編程的方法通過Web來調用這個應用程式。它通過標準通信協議,在網際網路上以服務的方式發布有用的程序模塊,目前大部分是用SOAP作為通信協議。 它提供一份詳細的接口說明書,來幫助用戶構建應用程式,這個接口說明書叫WSDL(Web服務描述語言,Web Service Description Language)。
  • 01.WebService_基礎知識
    傳統的實現互相通信的方法是在分布式對象,如DCOM、CORBA之間進行相互的遠程過程調用(TCP/IP),但在這種場合下HTTP協議的特性沒有得到應用,因此在Internet環境下的遠程過程調用不是一件容易的事情,同時在Internet上使用遠程過程調用還存在安全問題,防火牆和代理伺服器還有可能阻擋這種類型的數據傳輸。HTTP是在Internet上發送消息的標準協議。
  • WebService發布與調用詳細介紹
    1、了解WebService(文末:webservice的發布調用的源碼)
  • WebService就是這麼簡單
    webservice的服務,其實這兩種方式也有弊端如果我們可以把整個對象傳遞進去,返回的結果更加友好的話,就好像我們平常調用Java類一樣使用webservice就好咯!Java也提供了類似的方法,把webservice服務搞成是Java類讓我們自己調用,既然是Java類的話,那麼我們使用起來就非常方便了!
  • webservice學習筆記
    webservice基本概念Web Service是一種跨語言和跨作業系統的遠程調用技術跨程式語言:指的是服務程序可以用java編寫,而客戶端程序則可以採用其他程式語言編寫
  • webservice的接口做自動化,其實很簡單!
    大家做接口自動化的時候,測的大多數接口都是基於 http 類型協議的,在 python 中使用 requests 去請求接口還是非常簡單的。最近有部分小夥伴反映在工作中碰到了 webservice 的接口,表示不知道怎麼用 python 去做自動化。其實不管什麼類型的接口實現自動化的思路都是一樣的,在接口請求上會有一些有區別。
  • Spring boot cxf調用webservice服務 - 第279篇
    二、WebService調用方式       對於WebService的調用,有如下幾種方式:(1)使用CXF.JaxWsDynamicClientFactory的client動態調用。(2)利用axis2的RPC方式調用webservice。
  • webservice篇2 ABAP調用外部webservice實例
    調用外部webservice 使用Tcode;SICFSPROXSET      設置創建proxy 的權限SE80SOAMANAGER   一、目的:調用外部SRM系統的 webservice:http://10.4.64.19:8090/srm/service/IMatnrResourceService?
  • 盤點SoapUI調用Webservice接口踩過的坑
    文章說明:文章為山丘安全攻防實驗室成員:O8原創文章僅用於攻防技術學習,請勿用於非法用途SOAPUI的作用當然是用於調用Webservice接口的啦,滲透過程中,如果能獲取到Webservice開放接口,說不定可以直接getshell哦!
  • 問:JDK 動態代理調用接口方法時是怎麼做到先調用 invoke 方法的?
    這一篇我們繼續解答關於 JDK 動態代理的另一個深度問題:JDK 動態代理調用自己接口方法時是怎麼做到先調用 invoke 方法的?>[] { Foo.class }, handler);//調用接口方法f.add();你有沒有想過,通過上面代碼,明明最後我調用的是接口 Foo 的 add 方法f.add();,為什麼就自動觸發了 InvocationHandler 接口的invoke方法呢?
  • jmeter壓測學習47-發soap請求測試webservice接口
    的接口。接口通過瀏覽器訪問也可以看到對應的方法和請求參數http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx調用後返回<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org
  • WebService 入門簡介
    Web service服務通常被定義為一組模塊化的API,它們可以通過網絡進行調用,來執行遠程系統的請求服務。本質上就是服務提供方(服務端)發布一些服務到網絡上,服務使用方(客戶端)如果使用到該服務的功能,直接在網絡上調用服務接口就可以了,無需自己重新開發。
  • WebService接口調用實戰之Apache CXF
    配置環境變量:CXF_HOME: 解壓地址\apache-cxf-3.4.0Path: %CXF_HOME%\bin配置完成後,cmd校驗,成功如下:二、根據wsdl文件生成客戶端代碼生成命令:wsdl2java -encoding
  • java——Scnner()類下面有幾種方法呢?
    next() 和 hasNext() 方法及其基本類型 companion 方法(如 nextInt() 和 hasNextInt())首先跳過與分隔符模式匹配的輸入,然後嘗試返回下一個標記。在等待更多輸入時 hasNext 和 next 方法都可能阻塞。hasNext 方法是否阻塞與其相關的 next 方法是否阻塞無關。
  • 安卓10源碼開發定製(26)java核心庫libcore中添加安卓屬性獲取、設置接口全局任意調用
    ,安卓10系統調用了android::base::setProperty和android:base::getProperty方法來實現native層的調用。安卓屬性系統中提供了多個__system_property_xx的接口供外部調用。本文暫不追蹤分析屬性系統這塊相關的細節。以下列舉了幾個get、set相關的接口。
  • Java 本地接口 JNI 使用詳解
    也可直接搜索公眾號緯庫軟體或waycool001進行關注,查看歷史消息即可。如果你覺得文章不錯,也可點擊右上角的「...」分享到朋友圈,大家需要正能量。對於java程式設計師來說,java語言的好處和優點,我想不用我說了,大家自然會說出很多一套套的。但雖然我們作為java程式設計師,但我們不得不承認java語言也有一些它本身的缺點。比如在性能、和底層打交道方面都有它的缺點。所以j
  • 【專業技術】WebService為何物?
    所謂遠程調用,就是一臺計算機a上的一個程序可以調用到另外一臺計算機b上的一個對象的方法,譬如,銀聯提供給商場的pos刷卡系統,商場的POS機轉帳調用的轉帳方法的代碼其實是跑在銀行伺服器上。再比如,amazon,天氣預報系統,淘寶網,校內網,百度等把自己的系統服務以webservice服務的形式暴露出來,讓第三方網站和程序可以調用這些服務功能,這樣擴展了自己系統的市場佔有率,往大的概念上吹,就是所謂的SOA應用。
  • JNI-Thread中start方法的調用與run方法的回調分析
    然而各個系統的底層實現肯定是有區別的,為了使java可以跨平臺,於是Jvm提供了叫java native interface(JNI)的機制。當java需要使用到一些系統方法時,由Jvm幫我們去調用系統底層,而java本身只需要告知jvm需要做的事情,即調用某個native方法即可。
  • Java與Lua相互調用
    ScriptEngine調用方式調用方式:外部10000次調用,lua內部10000次循環a++總時間:8.9s左右平均一次lua方法調用(1w次a++):0.89mslua內部一次循環調用(1次a++):0.000089ms修改lua內部循環1次時間:10ms平均一次lua方法調用:0.001ms
  • 談談Java接口Result設計
    因為這個問題本身沒有講清楚「對什麼東西的處理」要用Result還是異常的方式,即這裡沒有講清楚我們要解決的問題是什麼。事實上我們常說的「失敗」,往往混淆了2種含義:系統異常:比如網絡超時、DB異常、緩存超時等,調用方一般不太可能基於這些錯誤類型做不同的業務邏輯,常用用於日誌和監控,方便定位排查。