題目確實是個問題,因為… 我自己也不知道它是什麼,我將第一次嘗試在本文的框架內使用它。我唯一可以保證的是下面提供的程式碼可以工作,但我的短語只是對我自己如何理解這一切的假設和猜測。那麼,我們走吧...
介紹
我們需要從為什麼創建 Web 服務的概念開始。當這個概念出現在世界上時,允許應用程式進行遠距離互動的技術已經存在,其中一個程式可以呼叫另一個程式中的某種方法,該程式可以在位於另一個城市甚至國家的電腦上啟動。所有這些都縮寫為 RPC(遠端過程呼叫)。範例包括 CORBA 技術和 Java 的 RMI(遠端方法呼叫)。他們似乎一切都很好,尤其是 CORBA,因為… 您可以使用任何程式語言來使用它,但仍然缺少一些東西。我認為 CORBA 的缺點是它透過自己的一些網路協定而不是簡單的 HTTP 來運作,而 HTTP 可以通過任何防火牆。Web 服務的想法是創建一個將插入到 HTTP 封包中的 RPC。由此開始了標準的開發。該標準的基本概念是什麼:- 肥皂。在呼叫遠端過程之前,您需要在 SOAP 格式的 XML 檔案中描述此呼叫。SOAP 只是 Web 服務中使用的眾多 XML 標記之一。我們想要透過 HTTP 傳送到某處的所有內容首先都會轉換為 XML SOAP 描述,然後填入 HTTP 封包中並透過 TCP/IP 傳送到網路上的另一台電腦。
- WSDL。有一個網路服務,即 其方法可以被遠端呼叫的程式。但該標準要求該程式附有一個描述,內容是“是的,你是對的 - 這確實是一個 Web 服務,你可以從中調用這樣那樣的方法。” 該描述由另一個 XML 檔案表示,該檔案具有不同的格式,即 WSDL。那些。WSDL 只是一個描述 Web 服務的 XML 文件,僅此而已。
一般的做法
在 Web 服務中始終存在客戶端和伺服器。伺服器是我們的 Web 服務,有時稱為端點(例如,來自客戶端的 SOAP 訊息到達的端點)。我們需要執行以下操作:- 描述我們網路服務的介面
- 實現這個介面
- 啟動我們的網路服務
- 編寫客戶端並遠端呼叫所需的Web服務方法
main
並直接將 Web 服務作為伺服器啟動,或將其部署到 Tomcat 或任何其他伺服器等伺服器。第二種情況,我們自己不啟動新的伺服器,也不在電腦上開啟另一個端口,而只是簡單地告訴Tomcat servlet 容器「我們在這裡編寫了Web 服務類,請發布它們,以便每個與您聯繫的人都可以”使用我們的網路服務。” 無論採用何種方法啟動 Web 服務,我們都將擁有相同的用戶端。
伺服器
讓我們啟動 IDEA 並建立一個新專案Create New Project。指定名稱HelloWebService並按一下「下一步」按鈕,然後按一下「完成」按鈕。在src資料夾中,我們將建立套件ru.javarush.ws。在此套件中,我們將建立一個介面HelloWebService
:
package ru.javarush.ws;
// это аннотации, т.е. способ отметить наши классы и методы,
// How связанные с веб-сервисной технологией
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
// говорим, что наш интерфейс будет работать How веб-сервис
@WebService
// говорим, что веб-сервис будет использоваться для вызова методов
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloWebService {
// говорим, что этот метод можно вызывать удаленно
@WebMethod
public String getHelloString(String name);
}
在這段程式碼中,這些類別就是所謂的註釋WebService
,WebMethod
除了將我們的介面及其方法標記為 Web 服務之外什麼也不做。這同樣適用於班級SOAPBinding
。唯一的區別是SOAPBinding
它是帶有參數的註釋。在這種情況下,使用一個參數style
和一個值來指示 Web 服務將不透過文件訊息工作,而是作為經典 RPC,即 呼叫一個方法。讓我們實作我們的介面邏輯並在我們的套件中建立一個類別HelloWebServiceImpl
。順便說一句,我注意到以 Impl 結尾類別是 Java 中的一種約定,根據該約定,介面的實作是這樣指定的(Impl - 來自「實作」一詞,即實作)。這不是必需的,您可以隨意命名該類,但良好的舉止需要這樣做:
package ru.javarush.ws;
// таже annotation, что и при описании интерфейса,
import javax.jws.WebService;
// но здесь используется с параметром endpointInterface,
// указывающим полное Name класса интерфейса нашего веб-сервиса
@WebService(endpointInterface = "ru.javarush.ws.HelloWebService")
public class HelloWebServiceImpl implements HelloWebService {
@Override
public String getHelloString(String name) {
// просто возвращаем приветствие
return "Hello, " + name + "!";
}
}
讓我們將我們的 Web 服務作為獨立伺服器啟動,即 無需任何 Tomcat 和應用程式伺服器的參與(這是一個單獨討論的主題)。為此,在src資料夾的專案結構中,我們將建立一個包ru.javarush.endpoint
,並在其中建立一個HelloWebServicePublisher
帶有方法的類別main
:
package ru.javarush.endpoint;
// класс, для запуска веб-serverа с веб-сервисами
import javax.xml.ws.Endpoint;
// класс нашего веб-сервиса
import ru.javarush.ws.HelloWebServiceImpl;
public class HelloWebServicePublisher {
public static void main(String... args) {
// запускаем веб-server на порту 1986
// и по addressу, указанному в первом аргументе,
// запускаем веб-сервис, передаваемый во втором аргументе
Endpoint.publish("http://localhost:1986/wss/hello", new HelloWebServiceImpl());
}
}
現在讓我們按Shift+F10來執行這個類別。控制台中不會出現任何內容,但伺服器正在運行。您可以在瀏覽器中輸入http://localhost:1986/wss/hello?wsdl行來驗證這一點。開啟的頁面一方面證明我們有一個 Web 伺服器 (http://) 在我們的電腦 (localhost) 上的連接埠 1986 上運行,另一方面顯示了我們的 Web 服務的 WSDL 描述。如果停止應用程序,描述將變得不可用,Web 服務本身也將變得不可用,因此我們不會這樣做,而是繼續編寫客戶端。
客戶
在專案資料夾src中,我們將建立一個包ru.javarush.client
,並在其中建立一個HelloWebServiceClient
帶有方法的類別main
:
package ru.javarush.client;
// нужно, чтобы получить wsdl описание и через него
// дотянуться до самого веб-сервиса
import java.net.URL;
// такой эксепшн возникнет при работе с an objectом URL
import java.net.MalformedURLException;
// классы, чтобы пропарсить xml-ку c wsdl описанием
// и дотянуться до тега service в нем
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
// интерфейс нашего веб-сервиса (нам больше и нужно)
import ru.javarush.ws.HelloWebService;
public class HelloWebServiceClient {
public static void main(String[] args) throws MalformedURLException {
// создаем ссылку на wsdl описание
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
// Параметры следующего конструктора смотрим в самом первом теге WSDL описания - definitions
// 1-ый аргумент смотрим в атрибуте targetNamespace
// 2-ой аргумент смотрим в атрибуте name
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
// Теперь мы можем дотянуться до тега service в wsdl описании,
Service service = Service.create(url, qname);
// а далее и до вложенного в него тега port, чтобы
// получить ссылку на удаленный от нас an object веб-сервиса
HelloWebService hello = service.getPort(HelloWebService.class);
// Ура! Теперь можно вызывать удаленный метод
System.out.println(hello.getHelloString("JavaRush"));
}
}
我對清單中的程式碼給出了最多的評論。我沒有什麼要添加的,所以讓我們運行(Shift+F10)。我們應該在控制台中看到文字:Hello, JavaRush!
如果您沒有看到它,那麼您可能忘記啟動 Web 服務。
GO TO FULL VERSION