JavaRush /Blog Java /Random-MS /Perkhidmatan web. Langkah 1. Apakah perkhidmatan web dan ...
eGarmin
Tahap

Perkhidmatan web. Langkah 1. Apakah perkhidmatan web dan bagaimana untuk bekerja dengannya?

Diterbitkan dalam kumpulan
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... Perkhidmatan web.  Langkah 1. Apakah perkhidmatan web dan bagaimana untuk bekerja dengannya?  - 1

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:
  1. 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.
  2. 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.
Mengapa begitu ringkas anda bertanya? Tidak bolehkah anda lebih spesifik? Ia mungkin boleh dilakukan, tetapi untuk melakukan ini, anda perlu beralih kepada buku seperti T. Mashnin, "Java Web Services." Di sana, sepanjang 200 halaman pertama, terdapat penerangan terperinci bagi setiap teg piawaian SOAP dan WSDL. Adakah ia berbaloi untuk dilakukan? Pada pendapat saya, tidak, kerana... semua ini dicipta secara automatik di Jawa, dan anda hanya perlu menulis kandungan kaedah yang sepatutnya dipanggil dari jauh. Jadi, API seperti JAX-RPC muncul di Jawa. Jika sesiapa tidak tahu, apabila mereka mengatakan bahawa Java mempunyai API begini dan begitu, ini bermakna terdapat pakej dengan set kelas yang merangkumi teknologi yang dipersoalkan. JAX-RPC berkembang dari semasa ke semasa dari versi ke versi dan akhirnya menjadi JAX-WS. WS jelas bermaksud WebService dan anda mungkin berfikir bahawa ini hanyalah penamaan semula RPC sebagai kata kunci popular hari ini. Ini tidak benar, kerana Kini perkhidmatan web telah beralih daripada idea asal dan membolehkan anda bukan sahaja memanggil kaedah jauh, tetapi juga hanya menghantar mesej dokumen dalam format SOAP. Saya tidak tahu mengapa ini diperlukan lagi; tidak mungkin jawapan di sini adalah "sekiranya ia diperlukan." Saya sendiri ingin belajar daripada rakan-rakan yang lebih berpengalaman. Dan terakhir, kemudian JAX-RS muncul untuk apa yang dipanggil perkhidmatan web RESTful, tetapi ini adalah topik artikel yang berasingan. Pengenalan boleh berakhir di sini, kerana... Seterusnya kita akan belajar bekerja dengan JAX-WS.

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:
  1. Terangkan antara muka perkhidmatan web kami
  2. Laksanakan antara muka ini
  3. Lancarkan perkhidmatan web kami
  4. Tulis pelanggan dan hubungi kaedah perkhidmatan web yang diingini dari jauh
Anda boleh melancarkan perkhidmatan web dengan cara yang berbeza: sama ada menerangkan kelas dengan kaedah maindan 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 muka 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);
}
Dalam kod ini, kelas adalah apa yang dipanggil anotasi WebServicedan WebMethodtidak melakukan apa-apa kecuali menandakan antara muka kami dan kaedahnya sebagai perkhidmatan web. Perkara yang sama berlaku untuk kelas SOAPBinding. Satu-satunya perbezaan ialah SOAPBindingia adalah anotasi dengan parameter. Dalam kes ini, parameter digunakan styledengan 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 HelloWebServicePublisherdengan 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 pakej ru.javarush.client, dan di dalamnya kelas HelloWebServiceClientdengan 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.

Kesimpulan

Topik ini menyediakan lawatan ringkas ke perkhidmatan web. Sekali lagi, saya akan mengatakan bahawa kebanyakan daripada apa yang saya tulis adalah tekaan saya tentang cara ia berfungsi, dan oleh itu anda tidak perlu terlalu mempercayai saya. Saya akan bersyukur jika orang yang berilmu membetulkan saya, kerana kemudian saya akan belajar sesuatu. UPD. Mari kita sambung perbualan
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION