使用java對(duì)接WebService接口實(shí)現(xiàn)過程
1、什么是WebService?
WebService是一個(gè)平臺(tái) 獨(dú)立的,低耦合的,自包含的、基于可編程的web的應(yīng)用程序,可使用開放的XML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)子集)標(biāo)準(zhǔn)來描述、發(fā)布、發(fā)現(xiàn)、協(xié)調(diào)和配置這些應(yīng)用程序,用于開發(fā)分布式的交互操作的應(yīng)用程序。
Web Service技術(shù), 能使得運(yùn)行在不同機(jī)器上的不同應(yīng)用無須借助附加的、專門的第三方軟件或硬件, 就可相互交換數(shù)據(jù)或集成。依據(jù)Web Service規(guī)范實(shí)施的應(yīng)用之間, 無論它們所使用的語言、 平臺(tái)或內(nèi)部協(xié)議是什么, 都可以相互交換數(shù)據(jù)。
Web Service是自描述、 自包含的可用網(wǎng)絡(luò)模塊, 可以執(zhí)行具體的業(yè)務(wù)功能。
Web Service也很容易部署, 因?yàn)樗鼈兓谝恍┏R?guī)的產(chǎn)業(yè)標(biāo)準(zhǔn)以及已有的一些技術(shù),諸如標(biāo)準(zhǔn)通用標(biāo)記語言下的子集XML、HTTP。
Web Service減少了應(yīng)用接口的花費(fèi)。
Web Service為整個(gè)企業(yè)甚至多個(gè)組織之間的業(yè)務(wù)流程的集成提供了一個(gè)通用機(jī)制。
2、WebService應(yīng)用場景?
(1)異構(gòu)系統(tǒng)(不同的開發(fā)語言)的整合:例如,在一個(gè)企業(yè)內(nèi)部,可能有多個(gè)部門使用不同的系統(tǒng)和編程語言。通過使用Webservice,這些系統(tǒng)可以互相通信并共享數(shù)據(jù)。
(2)不同客戶端的整合:例如,一個(gè)網(wǎng)站可能需要同時(shí)支持瀏覽器、手機(jī)端(Android/iOS)、微信等不同平臺(tái)的訪問。通過使用Webservice,可以在后端實(shí)現(xiàn)統(tǒng)一的數(shù)據(jù)處理和業(yè)務(wù)邏輯,并為不同客戶端提供接口調(diào)用。
(3)軟件集成和復(fù)用:例如,氣 象 局可以通過Webservice向天氣查詢網(wǎng)站提供實(shí)時(shí)天氣數(shù)據(jù)。這種情況下,氣 象 局作為服務(wù)端,提供數(shù)據(jù)服務(wù);天氣查詢網(wǎng)站作為客戶端,通過調(diào)用Webservice來獲取數(shù)據(jù)。
3、java怎么對(duì)接WebService呢?
在Java中,我們可以使用不同的方式來對(duì)接外部系統(tǒng)提供的Web服務(wù)接口。以下是幾種常見的方法:
(1)使用JAX-WS(Java API for XML Web Services):JAX-WS是Java EE的一部分,它提供了一種簡單但強(qiáng)大的方式來開發(fā)基于SOAP的Web服務(wù)。您可以使用wsimport工具來生成客戶端代理代碼,該代碼可用于調(diào)用外部Web服務(wù)的方法。下面是一個(gè)簡單的示例:
wsimport -s src -d build -p com.example http://www.example.com/YourService?wsdl
上述命令將根據(jù)WSDL文件生成客戶端代碼,并包含在指定的包中。一旦代碼生成完成,您可以像在本地調(diào)用本地方法一樣調(diào)用外部Web服務(wù)的方法。
(2)使用第三方庫(例如CXF、Axis等):除了JAX-WS之外,還有許多第三方的Java Web服務(wù)庫可以幫助您對(duì)接外部系統(tǒng)提供的Web服務(wù)接口。比如Apache CXF和Apache Axis都提供了強(qiáng)大的Web服務(wù)客戶端和服務(wù)端庫。您可以根據(jù)自己的喜好和需求選擇合適的庫進(jìn)行開發(fā)。
在實(shí)際應(yīng)用中,您需要考慮以下幾點(diǎn):
- 安全性:外部Web服務(wù)接口可能需要認(rèn)證,您需要了解如何在Java中處理認(rèn)證信息,如用戶名/密碼、密鑰等。
- 異常處理:調(diào)用外部Web服務(wù)時(shí)可能會(huì)出現(xiàn)各種異常情況,例如網(wǎng)絡(luò)中斷、超時(shí)等。您需要了解如何在客戶端代碼中處理這些異常。
- 數(shù)據(jù)傳輸格式:Web服務(wù)接口通常支持多種數(shù)據(jù)傳輸格式,如XML、JSON等。您需要了解如何在Java中處理這些數(shù)據(jù)格式。
(3)使用Spring框架提供的WebServiceTemplate類。WebServiceTemplate類提供了一種簡單而靈活的方式來調(diào)用Web服務(wù),并且集成了許多常見的Web服務(wù)調(diào)用需求,如消息處理、異常處理等。
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
public class WebServiceClient {
public static void main(String[] args) {
WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
// 設(shè)置Web服務(wù)地址
webServiceTemplate.setDefaultUri("http://www.example.com/YourService");
// 設(shè)置編組器和解組器
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com.example.yourpackage"); // 設(shè)置上下文路徑,用于識(shí)別要編組/解組的類
webServiceTemplate.setMarshaller(marshaller);
webServiceTemplate.setUnmarshaller(marshaller);
// 構(gòu)造請求數(shù)據(jù)
YourRequestObject request = new YourRequestObject();
// 調(diào)用外部Web服務(wù)接口
YourResponseObject response = (YourResponseObject) webServiceTemplate.marshalSendAndReceive(request);
// 處理響應(yīng)數(shù)據(jù)
// ...
}
}在上述示例中,我們使用了Jaxb2Marshaller作為編組器和解組器,并設(shè)置了要編組/解組的目標(biāo)類的上下文路徑。您需要將"com.example.yourpackage"替換為實(shí)際的包路徑,以便編組/解組器能夠識(shí)別請求和響應(yīng)對(duì)象。這個(gè)上下文路徑通常是您生成的Web服務(wù)客戶端代碼的包路徑。
但經(jīng)過查找資料,并進(jìn)行測試與嘗試。我最終選擇的是使用hutool工具包所提供的方法,我也推薦此方法。
3.1 自己編寫一個(gè)WebService服務(wù)端
我這里方便測試,所以編寫了一個(gè)服務(wù)端
3.1.1 代碼

package com.webservice.server;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author ZhaoShuHao
* @Date 2023/11/15 16:16
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User
{
//姓名
private String name;
//性別
private String sex;
//年齡
private int age;
}
package com.webservice.server;
/**
* @Author ZhaoShuHao
* @Date 2023/11/15 16:16
*/
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService(targetNamespace = "http://service.cn.com/")
public interface UserService
{
/**
* 1.在類上添加@WebService注解,代表發(fā)布一個(gè)WebService服務(wù)。
* 2.給類添加上@WebService注解后,類中所有的非靜態(tài)方法都將會(huì)對(duì)外公布。
* 3.如果希望某個(gè)方法不對(duì)外公開,可以在方法上添加@WebMethod(exclude=true),阻止對(duì)外公開。
* 4.如果一個(gè)類上,被添加了@WebService注解,則必須此類至少有一個(gè)可以公開的方法,否則將會(huì)啟動(dòng)失敗。
* protected、private、final、static方法不能對(duì)外公開。
* 5.@targetNamespace 設(shè)置命名空間,默認(rèn)包名,取反
*/
@WebMethod
public User getUserInfo(@WebParam(name = "name", targetNamespace = "http://service.cn.com/") String name,
@WebParam(name = "sex", targetNamespace = "http://service.cn.com/") String sex,
@WebParam(name = "age", targetNamespace = "http://service.cn.com/") int age);
}
package com.webservice.server;
/**
* @Author ZhaoShuHao
* @Date 2023/11/15 16:17
*/
public class UserServiceImpl implements UserService
{
@Override
public User getUserInfo(String name,String sex,int age)
{
User user = new User(name,sex,age);
return user;
}
}
package com.webservice.server;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
/**
* @Author ZhaoShuHao
* @Date 2023/11/15 16:18
*/
public class ServerTest
{
public static void main(String[] args)
{
//發(fā)布服務(wù)的工廠
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
//設(shè)置服務(wù)的地址
factory.setAddress("http://127.0.0.1:9999/test");
//設(shè)置服務(wù)類
factory.setServiceBean(new UserServiceImpl());
//發(fā)布服務(wù)
factory.create();
System.out.println(("發(fā)布服務(wù)成功,wsdl地址是:http://127.0.0.1:9999/test?wsdl"));
}
}
3.1.2 運(yùn)行結(jié)果


wsdl文件格式如下:
<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://server.webservice.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://service.cn.com/" name="UserServiceImplService" targetNamespace="http://server.webservice.com/"> <wsdl:import location="http://127.0.0.1:9999/test?wsdl=UserService.wsdl" namespace="http://service.cn.com/"> </wsdl:import> <wsdl:binding name="UserServiceImplServiceSoapBinding" type="ns1:UserService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getUserInfo"> <soap:operation soapAction="" style="document"/> <wsdl:input name="getUserInfo"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="getUserInfoResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="UserServiceImplService"> <wsdl:port binding="tns:UserServiceImplServiceSoapBinding" name="UserServiceImplPort"> <soap:address location="http://127.0.0.1:9999/test"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
3.2 編寫客戶端
3.2.1代碼
package com.webservice.client;
import cn.hutool.core.util.XmlUtil;
import cn.hutool.http.webservice.SoapClient;
import org.w3c.dom.Document;
import javax.xml.xpath.XPathConstants;
/**
* @Author ZhaoShuHao
* @Date 2023/11/15 16:20
*/
public class ClientTest
{
public static void main(String[] args)
{
//設(shè)置webservice服務(wù)地址
SoapClient client = SoapClient.create("http://127.0.0.1:9999/test?wsdl")
// 設(shè)置要請求的方法,傳入對(duì)應(yīng)的命名空間
.setMethod("getUserInfo", "http://service.cn.com/")
// 設(shè)置參數(shù)
.setParam("name", "張三")
.setParam("sex", "男")
.setParam("age", 23);
// 發(fā)送請求,參數(shù)true表示返回一個(gè)格式化后的XML內(nèi)容
String result = client.send(true);
System.out.println(result);
System.out.println("----------------------------");
// 返回內(nèi)容為XML字符串,可以配合XmlUtil解析這個(gè)響應(yīng)
Document docResult = XmlUtil.readXML(result);
Object name = XmlUtil.getByXPath("http://return//name", docResult, XPathConstants.STRING);
Object sex = XmlUtil.getByXPath("http://return//sex", docResult, XPathConstants.STRING);
Object age = XmlUtil.getByXPath("http://return//age", docResult, XPathConstants.STRING);
System.out.println("name = " + name);
System.out.println("sex = " + sex);
System.out.println("age = " + age);
}
}
3.2.2 運(yùn)行結(jié)果

3.3 使用圖形化工具SoapUI進(jìn)行測試
下載地址:The World’s Most Popular API Testing Tool | SoapUI
3.3.1 使用該工具的原因是什么?
我在開發(fā)過程中,遇到了用戶提供的WebService接口是內(nèi)網(wǎng)這種情況,而且只能是內(nèi)網(wǎng)。所以用戶只能提供堡壘機(jī)得形式,讓我調(diào)用。那怎么驗(yàn)證我寫的接口沒問題呢?怎么快速確定用戶的返回?cái)?shù)據(jù)是什么呢?所以我先在本地模擬了一下WebService的客戶端與服務(wù)端。并且在堡壘機(jī)上安裝了SoapUI進(jìn)行測試。確保用戶和我的接口均沒問題。
3.3.2 安裝與使用
1、安裝:沒什么好說的,直接下一步即可
2、使用
(1)安裝完成,頁面大概是這樣的

(2)我們直接開始調(diào)用WebService接口
點(diǎn)擊SOAP菜單,輸入一個(gè)名稱(名稱隨意取)。輸入wsdl的地址。點(diǎn)擊ok。

左側(cè)菜單出現(xiàn)一個(gè)文件夾,打開,雙擊最后一個(gè)

點(diǎn)擊運(yùn)行,在右側(cè)還可以選擇格式進(jìn)行展示

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Intellij IDEA中的Version Control問題
這篇文章主要介紹了Intellij IDEA中的Version Control問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11
SpringBoot集成Nacos實(shí)現(xiàn)注冊中心與配置中心流程詳解
這篇文章主要介紹了SpringBoot集成Nacos實(shí)現(xiàn)注冊中心與配置中心流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02
Java elasticSearch-api的具體操作步驟講解
這篇文章主要介紹了elasticSearch-api的具體操作步驟講解,本文通過詳細(xì)的步驟介紹和圖文代碼展示講解了該項(xiàng)技術(shù),需要的朋友可以參考下2021-06-06
IDEA插件之Mybatis Log plugin 破解及安裝方法
這篇文章主要介紹了IDEA插件之Mybatis Log plugin 破解方法及安裝方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09

