JavaRush /Java Blog /Random-TW /網頁服務。步驟 1. 什麼是 Web 服務以及如何使用它?
eGarmin
等級 41

網頁服務。步驟 1. 什麼是 Web 服務以及如何使用它?

在 Random-TW 群組發布
題目確實是個問題,因為… 我自己也不知道它是什麼,我將第一次嘗試在本文的框架內使用它。我唯一可以保證的是下面提供的程式碼可以工作,但我的短語只是對我自己如何理解這一切的假設和猜測。那麼,我們走吧... 網頁服務。 步驟 1. 什麼是 Web 服務以及如何使用它? - 1

介紹

我們需要從為什麼創建 Web 服務的概念開始。當這個概念出現在世界上時,允許應用程式進行遠距離互動的技術已經存在,其中一個程式可以呼叫另一個程式中的某種方法,該程式可以在位於另一個城市甚至國家的電腦上啟動。所有這些都縮寫為 RPC(遠端過程呼叫)。範例包括 CORBA 技術和 Java 的 RMI(遠端方法呼叫)。他們似乎一切都很好,尤其是 CORBA,因為… 您可以使用任何程式語言來使用它,但仍然缺少一些東西。我認為 CORBA 的缺點是它透過自己的一些網路協定而不是簡單的 HTTP 來運作,而 HTTP 可以通過任何防火牆。Web 服務的想法是創建一個將插入到 HTTP 封包中的 RPC。由此開始了標準的開發。該標準的基本概念是什麼:
  1. 肥皂。在呼叫遠端過程之前,您需要在 SOAP 格式的 XML 檔案中描述此呼叫。SOAP 只是 Web 服務中使用的眾多 XML 標記之一。我們想要透過 HTTP 傳送到某處的所有內容首先都會轉換為 XML SOAP 描述,然後填入 HTTP 封包中並透過 TCP/IP 傳送到網路上的另一台電腦。
  2. WSDL。有一個網路服務,即 其方法可以被遠端呼叫的程式。但該標準要求該程式附有一個描述,內容是“是的,你是對的 - 這確實是一個 Web 服務,你可以從中調用這樣那樣的方法。” 該描述由另一個 XML 檔案表示,該檔案具有不同的格式,即 WSDL。那些。WSDL 只是一個描述 Web 服務的 XML 文件,僅此而已。
為什麼你問得這麼簡短?不能說得具體一點嗎?這可能是可能的,但要做到這一點,您必須查閱 T. Mashnin 的《Java Web Services》等書籍。其中前 200 頁詳細描述了 SOAP 和 WSDL 標準的每個標籤。值得做嗎?在我看來,不,因為... 所有這些都是Java自動創建的,你只需要編寫應該遠端呼叫的方法的內容。於是,Java中出現了JAX-RPC這樣的API。如果有人不知道,當他們說 Java 有這樣或那樣的 API 時,這意味著有一個包含一組類別的套件封裝了相關技術。JAX-RPC 隨著時間的推移從一個版本演變到另一個版本,最終成為 JAX-WS。WS 顯然代表 WebService,您可能會認為這只是當今流行術語 RPC 的重命名。這不是真的,因為 現在,Web 服務已經偏離了最初的想法,不僅允許您呼叫遠端方法,還允許您簡單地以 SOAP 格式傳送文件訊息。我還不知道為什麼需要這樣做;這裡的答案不太可能是「以防萬一需要」。我自己也想向更有經驗的同志學習。最後,JAX-RS 出現了,用於所謂的 RESTful Web 服務,但這是另一篇文章的主題。介紹到這裡就可以結束了,因為… 接下來我們將學習如何使用 JAX-WS。

一般的做法

在 Web 服務中始終存在客戶端和伺服器。伺服器是我們的 Web 服務,有時稱為端點(例如,來自客戶端的 SOAP 訊息到達的端點)。我們需要執行以下操作:
  1. 描述我們網路服務的介面
  2. 實現這個介面
  3. 啟動我們的網路服務
  4. 編寫客戶端並遠端呼叫所需的Web服務方法
您可以透過不同的方式啟動 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);
}
在這段程式碼中,這些類別就是所謂的註釋WebServiceWebMethod除了將我們的介面及其方法標記為 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 服務。

結論

本主題簡要介紹了 Web 服務。我再說一遍,我寫的大部分內容都是我對其工作原理的猜測,因此你不應該太相信我。如果有知識的人糾正我,我將不勝感激,因為那樣我會學到一些東西。 UPD。 讓我們繼續對話
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION