JavaRush /Blog Java /Random-VI /Dịch vụ web. Bước 1. Dịch vụ web là gì và cách làm việc v...
eGarmin
Mức độ

Dịch vụ web. Bước 1. Dịch vụ web là gì và cách làm việc với nó?

Xuất bản trong nhóm
Tiêu đề chủ đề thực sự là một câu hỏi, bởi vì... Bản thân tôi cũng không biết nó là gì và lần đầu tiên tôi sẽ thử làm việc với nó trong khuôn khổ bài viết này. Điều duy nhất tôi có thể đảm bảo là đoạn mã được trình bày bên dưới sẽ hoạt động, nhưng các cụm từ của tôi sẽ chỉ là những giả định và phỏng đoán về cách bản thân tôi hiểu tất cả những điều này. Vì vậy, chúng ta hãy đi... Dịch vụ web.  Bước 1. Dịch vụ web là gì và cách làm việc với nó?  - 1

Giới thiệu

Chúng ta cần bắt đầu với lý do tại sao khái niệm dịch vụ web được tạo ra. Vào thời điểm khái niệm này xuất hiện trên thế giới, các công nghệ đã tồn tại cho phép các ứng dụng tương tác từ xa, trong đó một chương trình có thể gọi một số phương thức trong một chương trình khác, phương thức này có thể được khởi chạy trên một máy tính đặt ở thành phố khác hoặc thậm chí là quốc gia. Tất cả điều này được viết tắt là RPC (Gọi thủ tục từ xa). Các ví dụ bao gồm các công nghệ CORBA và cho Java - RMI (Gọi phương thức từ xa). Và mọi thứ dường như đều tốt trong đó, đặc biệt là trong CORBA, bởi vì... Bạn có thể làm việc với nó bằng bất kỳ ngôn ngữ lập trình nào, nhưng vẫn còn thiếu một cái gì đó. Tôi tin rằng nhược điểm của CORBA là nó hoạt động thông qua một số giao thức mạng riêng thay vì HTTP đơn giản, giao thức này sẽ phù hợp với bất kỳ tường lửa nào. Ý tưởng của dịch vụ web là tạo một RPC sẽ được chèn vào các gói HTTP. Do đó bắt đầu sự phát triển của tiêu chuẩn. Các khái niệm cơ bản của tiêu chuẩn này là gì:
  1. XÀ BÔNG . Trước khi gọi một thủ tục từ xa, bạn cần mô tả lệnh gọi này trong tệp XML ở định dạng SOAP. SOAP chỉ đơn giản là một trong nhiều đánh dấu XML được sử dụng trong các dịch vụ web. Mọi thứ chúng ta muốn gửi đi đâu đó qua HTTP trước tiên được chuyển đổi thành mô tả XML SOAP, sau đó được nhồi vào gói HTTP và gửi đến một máy tính khác trên mạng thông qua TCP/IP.
  2. WSDL . Có một dịch vụ web, tức là một chương trình có phương pháp có thể được gọi từ xa. Nhưng tiêu chuẩn yêu cầu chương trình này phải kèm theo một mô tả có nội dung "vâng, bạn nói đúng - đây thực sự là một dịch vụ web và bạn có thể gọi các phương thức như vậy từ nó." Mô tả này được thể hiện bằng một tệp XML khác, có định dạng khác, cụ thể là WSDL. Những thứ kia. WSDL chỉ là một tệp XML mô tả một dịch vụ web và không có gì hơn thế.
Sao bạn hỏi ngắn gọn thế? Bạn không thể cụ thể hơn được sao? Có thể là có thể, nhưng để làm được điều này bạn sẽ phải đọc những cuốn sách như T. Mashnin, “Dịch vụ web Java”. Ở đó, trên 200 trang đầu tiên có mô tả chi tiết về từng thẻ của tiêu chuẩn SOAP và WSDL. Có đáng làm không? Theo tôi thì không, vì... tất cả điều này được tạo tự động trong Java và bạn chỉ cần viết nội dung của các phương thức được cho là được gọi từ xa. Vì vậy, một API như JAX-RPC đã xuất hiện trong Java. Nếu ai đó không biết, khi họ nói rằng Java có API như vậy, điều đó có nghĩa là có một gói với một tập hợp các lớp gói gọn công nghệ được đề cập. JAX-RPC phát triển theo thời gian từ phiên bản này sang phiên bản khác và cuối cùng trở thành JAX-WS. WS rõ ràng là viết tắt của WebService và bạn có thể nghĩ rằng đây chỉ đơn giản là việc đổi tên RPC như một từ thông dụng phổ biến hiện nay. Điều này không đúng, bởi vì Giờ đây, các dịch vụ web đã loại bỏ ý tưởng ban đầu và cho phép bạn không chỉ gọi các phương thức từ xa mà còn chỉ cần gửi tin nhắn tài liệu ở định dạng SOAP. Tôi vẫn chưa biết tại sao điều này lại cần thiết; không chắc câu trả lời ở đây sẽ là “phòng trường hợp cần thiết”. Bản thân tôi cũng mong muốn được học hỏi từ các đồng chí có kinh nghiệm hơn. Và cuối cùng, JAX-RS đã xuất hiện cho cái gọi là dịch vụ web RESTful, nhưng đây là chủ đề của một bài viết riêng. Phần giới thiệu có thể kết thúc ở đây, bởi vì... Tiếp theo chúng ta sẽ học cách làm việc với JAX-WS.

Cách tiếp cận chung

Trong các dịch vụ web luôn có máy khách và máy chủ. Máy chủ là dịch vụ web của chúng tôi và đôi khi được gọi là điểm cuối (như điểm cuối nơi các thông báo SOAP từ máy khách tiếp cận). Chúng ta cần phải làm như sau:
  1. Mô tả giao diện của dịch vụ web của chúng tôi
  2. Triển khai giao diện này
  3. Khởi chạy dịch vụ web của chúng tôi
  4. Viết một ứng dụng khách và gọi từ xa phương thức dịch vụ web mong muốn
Bạn có thể khởi chạy một dịch vụ web theo nhiều cách khác nhau: mô tả một lớp bằng một phương thức mainvà khởi chạy dịch vụ web trực tiếp dưới dạng máy chủ hoặc triển khai nó đến một máy chủ như Tomcat hoặc bất kỳ máy chủ nào khác. Trong trường hợp thứ hai, bản thân chúng tôi không khởi chạy máy chủ mới và không mở cổng khác trên máy tính mà chỉ nói với bộ chứa servlet Tomcat rằng “chúng tôi đã viết các lớp dịch vụ web ở đây, vui lòng xuất bản chúng để mọi người liên hệ với bạn có thể sử dụng dịch vụ web của chúng tôi." Bất kể phương thức khởi chạy dịch vụ web nào, chúng tôi sẽ có cùng một khách hàng.

Máy chủ

Hãy khởi chạy IDEA và tạo một dự án mới Tạo dự án mới . Chỉ định tên HelloWebService và nhấp vào nút Tiếp theo , sau đó nhấp vào nút Kết thúc . Trong thư mục src chúng ta sẽ tạo gói ru.javarush.ws . Trong gói này chúng ta sẽ tạo một giao diện 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);
}
Trong mã này, các lớp được gọi là chú thích WebServiceWebMethodkhông làm gì ngoại trừ đánh dấu giao diện của chúng tôi và phương thức của nó là một dịch vụ web. Điều tương tự cũng áp dụng cho lớp học SOAPBinding. Sự khác biệt duy nhất là SOAPBindingnó là một chú thích có tham số. Trong trường hợp này, một tham số được sử dụng stylevới giá trị cho biết rằng dịch vụ web sẽ hoạt động không phải thông qua thông báo tài liệu mà dưới dạng RPC cổ điển, tức là. để gọi một phương thức. Hãy triển khai logic giao diện của chúng ta và tạo một lớp trong gói HelloWebServiceImpl. Nhân tiện, tôi lưu ý rằng việc kết thúc một lớp bằng Impl là một quy ước trong Java, theo đó việc triển khai các giao diện được chỉ định như vậy (Impl - từ từ triển khai, tức là triển khai). Đây không phải là một yêu cầu và bạn có thể tự do đặt tên cho lớp bất cứ điều gì bạn muốn, nhưng cách cư xử tốt đòi hỏi phải có:
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 + "!";
    }
}
Hãy khởi chạy dịch vụ web của chúng tôi dưới dạng một máy chủ độc lập, tức là. không có sự tham gia của bất kỳ máy chủ ứng dụng và Tomcat nào (đây là chủ đề dành cho một cuộc thảo luận riêng). Để làm điều này, trong cấu trúc dự án trong thư mục src , chúng ta sẽ tạo một gói ru.javarush.endpointvà trong đó chúng ta sẽ tạo một lớp HelloWebServicePublishervới một phương thức 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());
    }
}
Bây giờ hãy chạy lớp này bằng cách nhấn Shift+F10 . Sẽ không có gì xuất hiện trong bảng điều khiển nhưng máy chủ đang chạy. Bạn có thể xác minh điều này bằng cách nhập dòng http://localhost:1986/wss/hello?wsdl trong trình duyệt của mình . Một mặt, trang mở ra chứng minh rằng chúng tôi có máy chủ web (http://) chạy trên cổng 1986 trên máy tính của chúng tôi (localhost) và mặt khác, hiển thị mô tả WSDL về dịch vụ web của chúng tôi. Nếu bạn dừng ứng dụng, mô tả sẽ không khả dụng, cũng như chính dịch vụ web, vì vậy chúng tôi sẽ không thực hiện việc này mà chuyển sang viết ứng dụng khách.

Khách hàng

Trong thư mục dự án src, chúng ta sẽ tạo một gói ru.javarush.clientvà trong đó một lớp HelloWebServiceClientcó phương thức 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"));
    }
}
Tôi đã đưa ra nhận xét tối đa về mã trong danh sách. Tôi không có gì để thêm nên hãy chạy (Shift+F10). Chúng ta sẽ thấy dòng chữ trong bảng điều khiển: Hello, JavaRush!Nếu bạn không nhìn thấy nó thì có thể bạn đã quên khởi động dịch vụ web.

Phần kết luận

Chủ đề này cung cấp một chuyến tham quan ngắn gọn về các dịch vụ web. Một lần nữa, tôi sẽ nói rằng phần lớn những gì tôi viết chỉ là phỏng đoán của tôi về cách thức hoạt động của nó, và do đó bạn không nên tin tưởng tôi quá nhiều. Tôi sẽ biết ơn nếu những người hiểu biết sửa lỗi cho tôi, vì khi đó tôi sẽ học được điều gì đó. CẬP NHẬT. Hãy tiếp tục cuộc trò chuyện
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION