Tajuk topik benar-benar persoalan, kerana... Saya sendiri tidak tahu apa itu dan buat pertama kalinya saya akan cuba bekerja dengannya dalam rangka artikel ini. Satu-satunya perkara yang saya boleh jamin ialah kod yang dibentangkan di bawah akan berfungsi, tetapi frasa saya hanya akan menjadi andaian dan tekaan tentang bagaimana saya sendiri memahami semua ini. Jadi, mari kita pergi...
pengenalan
Kita perlu bermula dengan sebab konsep perkhidmatan web dicipta. Pada masa konsep ini muncul di dunia, teknologi telah wujud yang membenarkan aplikasi berinteraksi pada jarak jauh, di mana satu program boleh memanggil beberapa kaedah dalam program lain, yang boleh dilancarkan pada komputer yang terletak di bandar atau negara lain. Semua ini disingkatkan sebagai RPC (Remote Procedure Calling). Contohnya termasuk teknologi CORBA, dan untuk Java - RMI (Remote Method Invoking). Dan semuanya kelihatan baik pada mereka, terutamanya dalam CORBA, kerana... Anda boleh bekerja dengannya dalam mana-mana bahasa pengaturcaraan, tetapi masih ada yang hilang. Saya percaya bahawa kelemahan CORBA ialah ia berfungsi melalui beberapa protokol rangkaiannya sendiri dan bukannya HTTP mudah, yang akan dimuatkan melalui mana-mana tembok api. Idea perkhidmatan web adalah untuk mencipta RPC yang akan dimasukkan ke dalam paket HTTP. Maka bermulalah pembangunan standard. Apakah konsep asas piawaian ini:- SABUN . Sebelum memanggil prosedur jauh, anda perlu menerangkan panggilan ini dalam fail XML dalam format SOAP. SOAP hanyalah salah satu daripada banyak penanda XML yang digunakan dalam perkhidmatan web. Semua yang kami mahu hantar ke suatu tempat melalui HTTP mula-mula ditukar menjadi penerangan SOAP XML, kemudian disumbat ke dalam paket HTTP dan dihantar ke komputer lain pada rangkaian melalui TCP/IP.
- WSDL . Terdapat perkhidmatan web, i.e. program yang kaedahnya boleh dipanggil dari jauh. Tetapi piawaian memerlukan program ini disertakan dengan perihalan yang mengatakan bahawa "ya, anda betul - ini benar-benar perkhidmatan web dan anda boleh memanggil kaedah ini dan itu daripadanya." Penerangan ini diwakili oleh fail XML lain, yang mempunyai format yang berbeza, iaitu WSDL. Itu. WSDL hanyalah fail XML yang menerangkan perkhidmatan web dan tidak lebih.
Pendekatan umum
Dalam perkhidmatan web sentiasa ada pelanggan dan pelayan. Pelayan ialah perkhidmatan web kami dan kadangkala dipanggil titik akhir (seperti dalam, titik akhir di mana mesej SOAP daripada pelanggan sampai). Kita perlu melakukan perkara berikut:- Terangkan antara muka perkhidmatan web kami
- Laksanakan antara muka ini
- Lancarkan perkhidmatan web kami
- Tulis pelanggan dan hubungi kaedah perkhidmatan web yang diingini dari jauh
main
dan melancarkan perkhidmatan web secara langsung sebagai pelayan, atau gunakannya ke pelayan seperti Tomcat atau mana-mana yang lain. Dalam kes kedua, kami sendiri tidak melancarkan pelayan baharu dan tidak membuka port lain pada komputer, tetapi cukup beritahu bekas servlet Tomcat bahawa "kami telah menulis kelas perkhidmatan web di sini, sila terbitkannya supaya semua orang yang menghubungi anda boleh gunakan perkhidmatan web kami." Tanpa mengira kaedah melancarkan perkhidmatan web, kami akan mempunyai pelanggan yang sama.
Pelayan
Mari lancarkan IDEA dan buat projek baharu Buat Projek Baharu . Tentukan nama HelloWebService dan klik butang Seterusnya , kemudian butang Selesai . Dalam folder src kami akan mencipta pakej ru.javarush.ws . Dalam pakej ini kami akan mencipta antara mukaHelloWebService
:
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 kod ini, kelas adalah apa yang dipanggil anotasi WebService
dan WebMethod
tidak melakukan apa-apa kecuali menandakan antara muka kami dan kaedahnya sebagai perkhidmatan web. Perkara yang sama berlaku untuk kelas SOAPBinding
. Satu-satunya perbezaan ialah SOAPBinding
ia adalah anotasi dengan parameter. Dalam kes ini, parameter digunakan style
dengan nilai yang menunjukkan bahawa perkhidmatan web akan berfungsi bukan melalui mesej dokumen, tetapi sebagai RPC klasik, i.e. untuk memanggil kaedah. Mari kita laksanakan logik antara muka kami dan buat kelas dalam pakej kami HelloWebServiceImpl
. Ngomong-ngomong, saya perhatikan bahawa menamatkan kelas dengan Impl ialah konvensyen di Jawa, mengikut mana pelaksanaan antara muka ditetapkan sedemikian (Impl - daripada perkataan pelaksanaan, iaitu pelaksanaan). Ini bukan keperluan dan anda bebas untuk menamakan kelas apa sahaja yang anda mahu, tetapi adab yang baik memerlukannya:
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 lancarkan perkhidmatan web kami sebagai pelayan bebas, i.e. tanpa penyertaan mana-mana Tomcat dan pelayan aplikasi (ini adalah topik untuk perbincangan berasingan). Untuk melakukan ini, dalam struktur projek dalam folder src , kami akan mencipta pakej ru.javarush.endpoint
, dan di dalamnya kami akan membuat kelas HelloWebServicePublisher
dengan kaedah 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 jalankan kelas ini dengan menekan Shift+F10 . Tiada apa-apa akan muncul dalam konsol, tetapi pelayan sedang berjalan. Anda boleh mengesahkan ini dengan menaip baris http://localhost:1986/wss/hello?wsdl dalam penyemak imbas anda . Halaman yang dibuka, di satu pihak, membuktikan bahawa kami mempunyai pelayan web (http://) yang berjalan pada port 1986 pada komputer kami (localhost), dan, sebaliknya, menunjukkan penerangan WSDL perkhidmatan web kami. Jika anda menghentikan aplikasi, penerangan akan menjadi tidak tersedia, begitu juga perkhidmatan web itu sendiri, jadi kami tidak akan melakukan ini, tetapi teruskan menulis klien.
Pelanggan
Dalam folder projek src kami akan mencipta pakejru.javarush.client
, dan di dalamnya kelas HelloWebServiceClient
dengan kaedah 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 komen maksimum pada kod dalam penyenaraian. Saya tidak mempunyai apa-apa untuk ditambah, jadi mari jalankan (Shift+F10). Kita harus melihat teks dalam konsol: Hello, JavaRush!
Jika anda tidak melihatnya, maka anda mungkin terlupa untuk memulakan perkhidmatan web.
GO TO FULL VERSION