JavaRush /Java Blog /Random-ID /Layanan web. Langkah 2. Bagaimana cara menyederhanakan pe...
eGarmin
Level 41

Layanan web. Langkah 2. Bagaimana cara menyederhanakan penulisan klien?

Dipublikasikan di grup Random-ID
Pada catatan singkat ini, saya ingin meninjau kembali kode klien layanan web yang kami tulis di langkah sebelumnya . Dalam hal ini, saya berasumsi bahwa Anda memiliki IDEA yang terbuka, dan di dalamnya proyek dari Langkah 1. Layanan web kami harus diluncurkan dalam proyek ini:
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"));
    }
}
Perhatikan seberapa banyak yang perlu kita ketahui sebelumnya. Selain fakta bahwa Anda memerlukan akses ke deskripsi wsdl (tanpa ini, maaf, tidak ada cara):
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
Anda perlu membuka file xml ini sendiri dan melihat tag definitions, dan di dalamnya atribut targetNamespacedan namememanggil konstruktor QName:
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
maka Anda perlu terhubung secara manual ke tag service:
Service service = Service.create(url, qname);
dan di dalamnya ke tag port:
HelloWebService hello = service.getPort(HelloWebService.class);
dan baru setelah itu kita dapat memanggil metode jarak jauh:
hello.getHelloString("JavaRush")
Pertanyaannya: apakah ini sebabnya kakek buyut kita mati di medan perang, sehingga kita sekarang melakukan semuanya dengan tangan? Dan jika itu bukan layanan web kami, tetapi milik orang lain. Maka proses ini akan menjadi lebih tidak menyenangkan. Format XML dirancang untuk dibaca oleh mesin, bukan manusia. Jadi biarkan mesin melakukan pekerjaan kotor dan nikmati prosesnya. Untuk ini kita tidak perlu melakukan sesuatu yang istimewa, karena... SDK favorit kami, yang disebut JDK di Java, menyertakan utilitas khusus yang disebut wsimport . Tapi pertama-tama... Pertama, mari buat proyek baru di IDEA dengan memilih File > New Project... dari menu dan beri nama proyek HelloWS . Ketika kita ditanya di mana membuka proyek yang baru dibuat, kita perlu menjawab New Window , yaitu. di jendela baru, karena saya perhatikan sekali lagi bahwa sangat penting bahwa proyek sebelumnya terbuka, karena Kami ingat dari Langkah 1 bahwa layanan web kami berjalan di proyek itu. Anda tentu saja dapat meluncurkannya melalui konsol Windows, tetapi saya tidak suka melakukan itu. Dari proyek baru, buka konsol dengan memilih View > Tool Windows > Terminal , atau cukup menekan Alt+F12 . Sekarang kita berada di root proyek, dan kita perlu masuk ke folder src , jadi kita masukkan perintah berikut ke konsol: cd src Sekarang saatnya menggunakan utilitas wsimport . Ia bekerja berdasarkan prinsip berikut: kami memberikan deskripsi WSDL kepadanya , dan sebagai tanggapannya ia membuat file rintisan (disebut Stub-kelas), yang sudah berisi semua fungsi yang kami perlukan untuk mengakses layanan web. Kelas-kelas ini akan ditempatkan dalam paket ru.javarush.ws. Jika Anda bertanya dari mana nama paket itu berasal, jawabannya adalah: nama paket adalah namespace target yang dibalik dari deskripsi WSDL . Ingat atribut targetNamespacedalam tag definitionsdari WSDL . Di sana kami menulis yang berikut ini http:// ws.javarush.ru/. Dan ini bukan alamat situs, ini adalah kebiasaan untuk mendeskripsikan ruang nama dalam xml, dan jika kita membuang http://dan memperluas apa yang tersisa dalam urutan terbalik, kita akan mendapatkan nama paket kita. Jadi, mari kita jalankan utilitasnya: wsimport -keep http://localhost:1986/wss/hello?wsdl Agar dapat berfungsi, jalur ke sana harus ditentukan dalam variabel lingkungan PATH , atau Anda cukup menggunakan jalur lengkap ke sana. Bagi saya itu terletak di folder C:\Program Files\Java\jdk1.8.0_31\bin . Harap dicatat bahwa yang perlu Anda lakukan hanyalah meneruskan file WSDL melalui kunci –keep , yang tersedia dari jarak jauh melalui tautan, kecuali, tentu saja, kami telah menonaktifkan layanan web. Apa saja kelas rintisan ini? Hanya ada dua dari mereka. Salah satunya adalahHelloWebService, yang pada dasarnya adalah antarmuka layanan web yang sama yang kita buat secara manual pada Langkah 1. Perbedaannya minimal dan terletak pada kenyataan bahwa anotasi yang telah kita temui digunakan sedikit berbeda, dan sebagai tambahan, anotasi tambahan digunakan, yang mana Saya sebutkan saya tidak tahu apa-apa, tetapi karena semuanya berfungsi untuk kami sebelumnya tanpa mereka, maka itu jelas tidak wajib. Kelas kedua adalah stub HelloWebServiceImplService, yang mewarisi dari kelas tersebut Service. Kami telah menemukan kelas Servicedi klien kami. Saya tidak akan memberikan kode kelas ini, karena... Saya hampir tidak siap untuk menjelaskan semua barisnya, tetapi inti dari kelas ini adalah bahwa semua yang sebelumnya kita tulis di klien secara manual untuk terhubung ke layanan web dibuat secara otomatis di kelas ini dan kita hanya perlu melakukannya panggil salah satu metodenya dan kami akan memiliki semuanya dalam kerawang. Jadi mari kita tulis ulang kode klien kita di proyek baru menggunakan kelas-kelas ini dan pastikan kodenya lebih ringkas. Pertama, di folder src proyek baru, mari kita buat sebuah paket ru.javarush.client, dan di dalamnya ada kelas HelloWebServiceClientdengan metode main:
package ru.javarush.client;

// подключаем классы-заглушки
import ru.javarush.ws.*;

public class HelloWebServiceClient {
    public static void main(String[] args) {
        // подключаемся к тегу service в wsdl описании
        HelloWebServiceImplService helloService = new HelloWebServiceImplService();
        // получив информацию из тега service подключаемся к самому веб-сервису
        HelloWebService hello = helloService.getHelloWebServiceImplPort();

        // обращаемся к веб-сервису и выводим результат в консоль
        System.out.println( hello.getHelloString("JavaRush Community") );
    }
}
Mengurai kode itu dasar dan apa yang saya jelaskan di komentar sudah cukup. Setelah meluncurkan klien, kita akan melihat baris: Hello, JavaRush Community!Pada saat yang sama, klien dari proyek dari Langkah 1 akan terus bekerja dan menampilkan teks yang kita tulis di dalamnya, yaitu: Hello, JavaRush! Pada titik ini, mungkin, kita bisa menyelesaikan ini Langkah, karena tujuannya telah tercapai. Kami menyadari bahwa jika ada deskripsi WSDL dari layanan web, maka jdk siap memberi kami pembuatan stubkelas rintisan secara otomatis untuk menyederhanakan penulisan klien untuk layanan web ini. Menurut pendapat saya, ini adalah fitur yang sangat berguna ketika Anda ingin menguji layanan web orang lain dan tidak mengintip deskripsi WSDL -nya . Melihat ke masa depan Pada artikel berikutnya tentang layanan web, saya ingin menguraikan ide tentang cara menerapkan layanan web ke dalam wadah servlet Tomcat dan ke server aplikasi yang berbeda, sehingga Anda tidak perlu menjalankan layanan web sebagai aplikasi terpisah, seperti yang kita lakukan pada 2 Langkah pertama. Namun sebelum itu, saya pikir akan lebih baik untuk melakukan penyimpangan singkat tentang apa itu servlet, container servlet dan apa perbedaannya dari server aplikasi dan web biasa... . Selain itu, kita harus membuat gambaran singkat tentang server aplikasi , yang menurut saya patut mendapat perhatian kita.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION