Judul topiknya memang pertanyaan, karena... Saya sendiri belum tahu apa itu dan untuk pertama kalinya saya akan mencoba mengolahnya dalam kerangka artikel ini. Satu-satunya hal yang dapat saya jamin adalah bahwa kode di bawah ini akan berfungsi, tetapi ungkapan saya hanya berupa asumsi dan tebakan tentang bagaimana saya sendiri memahami semua ini. Jadi ayo pergi...
Perkenalan
Kita harus mulai dengan alasan mengapa konsep layanan web diciptakan. Pada saat konsep ini muncul di dunia, sudah ada teknologi yang memungkinkan aplikasi berinteraksi dari jarak jauh, di mana satu program dapat memanggil beberapa metode dalam program lain, yang dapat diluncurkan pada komputer yang terletak di kota atau bahkan negara lain. Semua ini disingkat RPC (Remote Procedure Calling). Contohnya termasuk teknologi CORBA, dan untuk Java - RMI (Remote Method Invoking). Dan semuanya tampak baik-baik saja, terutama di CORBA, karena... Anda dapat mengerjakannya dalam bahasa pemrograman apa pun, tetapi masih ada yang kurang. Saya percaya bahwa kelemahan CORBA adalah ia bekerja melalui beberapa protokol jaringannya sendiri, bukan HTTP sederhana, yang dapat masuk melalui firewall apa pun. Ide dari layanan web ini adalah untuk membuat RPC yang akan dimasukkan ke dalam paket HTTP. Maka dimulailah pengembangan standar. Apa konsep dasar standar ini:- SABUN MANDI . Sebelum memanggil prosedur jarak jauh, Anda perlu menjelaskan panggilan ini dalam file XML dalam format SOAP. SOAP hanyalah salah satu dari banyak markup XML yang digunakan dalam layanan web. Segala sesuatu yang ingin kita kirim ke suatu tempat melalui HTTP terlebih dahulu diubah menjadi deskripsi XML SOAP, kemudian dimasukkan ke dalam paket HTTP dan dikirim ke komputer lain di jaringan melalui TCP/IP.
- WSDL . Ada layanan web, mis. sebuah program yang metodenya dapat dipanggil dari jarak jauh. Namun standarnya mengharuskan program ini disertai dengan deskripsi yang menyatakan bahwa "ya, Anda benar - ini benar-benar layanan web dan Anda dapat memanggil metode ini dan itu darinya". Deskripsi ini diwakili oleh file XML lain yang memiliki format berbeda, yaitu WSDL. Itu. WSDL hanyalah file XML yang menjelaskan layanan web dan tidak lebih.
Pendekatan umum
Dalam layanan web selalu ada klien dan server. Server adalah layanan web kami dan terkadang disebut titik akhir (seperti titik akhir di mana pesan SOAP dari klien mencapai). Kita perlu melakukan hal berikut:- Jelaskan antarmuka layanan web kami
- Implementasikan antarmuka ini
- Luncurkan layanan web kami
- Tulis klien dan panggil metode layanan web yang diinginkan dari jarak jauh
main
dan meluncurkan layanan web secara langsung sebagai server, atau menyebarkannya ke server seperti Tomcat atau lainnya. Dalam kasus kedua, kami sendiri tidak meluncurkan server baru dan tidak membuka port lain di komputer, tetapi cukup memberi tahu wadah servlet Tomcat bahwa “kami telah menulis kelas layanan web di sini, silakan publikasikan sehingga semua orang yang menghubungi Anda dapat gunakan layanan web kami." Terlepas dari metode peluncuran layanan web, kami akan memiliki klien yang sama.
pelayan
Mari luncurkan IDEA dan buat proyek baru. Buat Proyek Baru . Tentukan nama HelloWebService dan klik tombol Berikutnya , lalu tombol Selesai . Di folder src kita akan membuat paket ru.javarush.ws . Dalam paket ini kita akan membuat antarmukaHelloWebService
:
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);
}
Dalam kode ini, kelas-kelas tersebut disebut anotasi WebService
dan WebMethod
tidak melakukan apa pun kecuali menandai antarmuka kita dan metodenya sebagai layanan web. Hal yang sama berlaku untuk kelas SOAPBinding
. Satu-satunya perbedaan adalah SOAPBinding
anotasi dengan parameter. Dalam hal ini, parameter digunakan style
dengan nilai yang menunjukkan bahwa layanan web akan bekerja bukan melalui pesan dokumen, tetapi sebagai RPC klasik, yaitu. untuk memanggil suatu metode. Mari kita terapkan logika antarmuka kita dan buat kelas di paket kita HelloWebServiceImpl
. Omong-omong, saya perhatikan bahwa mengakhiri kelas dengan Impl adalah sebuah konvensi di Java, yang menurutnya implementasi antarmuka ditunjuk (Impl - dari kata implementasi, yaitu implementasi). Ini bukan keharusan dan Anda bebas memberi nama kelas apa pun yang Anda inginkan, namun sopan santun mengharuskannya:
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 + "!";
}
}
Mari luncurkan layanan web kita sebagai server independen, mis. tanpa partisipasi Tomcat dan server aplikasi mana pun (ini adalah topik untuk diskusi terpisah). Untuk melakukan ini, dalam struktur proyek di folder src , kita akan membuat paket ru.javarush.endpoint
, dan di dalamnya kita akan membuat kelas HelloWebServicePublisher
dengan metode 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());
}
}
Sekarang mari kita jalankan kelas ini dengan menekan Shift+F10 . Tidak ada yang muncul di konsol, tetapi server sedang berjalan. Anda dapat memverifikasi ini dengan mengetikkan baris http://localhost:1986/wss/hello?wsdl di browser Anda . Halaman yang terbuka, di satu sisi, membuktikan bahwa kita memiliki server web (http://) yang berjalan pada port 1986 di komputer kita (localhost), dan, di sisi lain, menunjukkan deskripsi WSDL dari layanan web kita. Jika Anda menghentikan aplikasi, deskripsinya tidak akan tersedia, begitu pula layanan web itu sendiri, jadi kami tidak akan melakukan ini, namun beralih ke penulisan klien.
Klien
Di folder proyek src kita akan membuat sebuah paketru.javarush.client
, dan di dalamnya sebuah kelas HelloWebServiceClient
dengan metode 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"));
}
}
Saya memberikan komentar maksimal pada kode dalam daftar. Saya tidak punya apa-apa untuk ditambahkan, jadi mari kita jalankan (Shift+F10). Kita akan melihat teks di konsol: Hello, JavaRush!
Jika Anda tidak melihatnya, Anda mungkin lupa memulai layanan web.
GO TO FULL VERSION