JavaRush /Java Blog /Random-ID /Layanan web. Langkah 1. Apa itu layanan web dan bagaimana...
eGarmin
Level 41

Layanan web. Langkah 1. Apa itu layanan web dan bagaimana cara menggunakannya?

Dipublikasikan di grup Random-ID
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... Layanan web.  Langkah 1. Apa itu layanan web dan bagaimana cara menggunakannya?  - 1

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:
  1. 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.
  2. 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.
Mengapa Anda bertanya begitu singkat? Tidak bisakah kamu lebih spesifik? Mungkin saja, tetapi untuk melakukan hal ini Anda harus membaca buku seperti T. Mashnin, “Java Web Services.” Di sana, pada 200 halaman pertama, terdapat penjelasan rinci tentang setiap tag standar SOAP dan WSDL. Apakah itu layak dilakukan? Menurut saya, tidak, karena... semua ini dibuat secara otomatis di Java, dan Anda hanya perlu menulis konten metode yang seharusnya dipanggil dari jarak jauh. Jadi, API seperti JAX-RPC muncul di Java. Kalau ada yang belum tahu, kalau dibilang Java punya API ini dan itu, berarti ada paket dengan sekumpulan kelas yang merangkum teknologi yang dimaksud. JAX-RPC berevolusi dari waktu ke waktu dari versi ke versi dan akhirnya menjadi JAX-WS. WS jelas merupakan singkatan dari WebService dan Anda mungkin berpikir bahwa ini hanyalah penggantian nama RPC sebagai kata kunci yang populer saat ini. Ini tidak benar, karena Sekarang layanan web telah menyimpang dari ide aslinya dan memungkinkan Anda tidak hanya memanggil metode jarak jauh, tetapi juga mengirim pesan dokumen dalam format SOAP. Saya masih belum tahu mengapa hal ini diperlukan; kecil kemungkinannya jawaban di sini adalah “kalau-kalau diperlukan.” Saya sendiri ingin belajar dari kawan-kawan yang lebih berpengalaman. Dan terakhir, JAX-RS muncul untuk apa yang disebut layanan web RESTful, tetapi ini adalah topik artikel terpisah. Perkenalan bisa berakhir disini, karena... Selanjutnya kita akan belajar bekerja dengan JAX-WS.

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:
  1. Jelaskan antarmuka layanan web kami
  2. Implementasikan antarmuka ini
  3. Luncurkan layanan web kami
  4. Tulis klien dan panggil metode layanan web yang diinginkan dari jarak jauh
Anda dapat meluncurkan layanan web dengan berbagai cara: mendeskripsikan kelas dengan metode maindan 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 antarmuka 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 kode ini, kelas-kelas tersebut disebut anotasi WebServicedan WebMethodtidak melakukan apa pun kecuali menandai antarmuka kita dan metodenya sebagai layanan web. Hal yang sama berlaku untuk kelas SOAPBinding. Satu-satunya perbedaan adalah SOAPBindinganotasi dengan parameter. Dalam hal ini, parameter digunakan styledengan 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 HelloWebServicePublisherdengan 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 paket ru.javarush.client, dan di dalamnya sebuah kelas HelloWebServiceClientdengan 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.

Kesimpulan

Topik ini memberikan penjelasan singkat tentang layanan web. Sekali lagi, saya akan mengatakan bahwa sebagian besar dari apa yang saya tulis adalah tebakan saya tentang cara kerjanya, dan oleh karena itu Anda tidak boleh terlalu mempercayai saya. Saya akan berterima kasih jika orang yang berpengetahuan mengoreksi saya, karena dengan begitu saya akan belajar sesuatu. UPD. Mari kita lanjutkan pembicaraannya
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION