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...
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ì:- 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.
- 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ế.
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:- Mô tả giao diện của dịch vụ web của chúng tôi
- Triển khai giao diện này
- Khởi chạy dịch vụ web của chúng tôi
- 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
main
và 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ệnHelloWebService
:
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 WebService
và WebMethod
khô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à SOAPBinding
nó là một chú thích có tham số. Trong trường hợp này, một tham số được sử dụng style
vớ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.endpoint
và trong đó chúng ta sẽ tạo một lớp HelloWebServicePublisher
vớ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óiru.javarush.client
và trong đó một lớp HelloWebServiceClient
có 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.
GO TO FULL VERSION