JavaRush /Blog Java /Random-MS /Perkhidmatan web. Langkah 2. Bagaimana untuk memudahkan p...
eGarmin
Tahap

Perkhidmatan web. Langkah 2. Bagaimana untuk memudahkan penulisan pelanggan?

Diterbitkan dalam kumpulan
Pada nota ringkas ini, saya ingin menyemak semula kod pelanggan perkhidmatan web yang kami tulis dalam langkah sebelumnya . Dalam kes ini, saya akan menganggap bahawa anda telah membuka IDEA, dan di dalamnya projek dari Langkah 1. Perkhidmatan web kami harus dilancarkan dalam projek 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 berapa banyak yang perlu kita ketahui terlebih dahulu. Sebagai tambahan kepada fakta bahawa anda memerlukan akses kepada penerangan wsdl (tanpa ini, maaf, tidak ada cara):
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
anda perlu membuka fail xml ini sendiri dan melihat tag definitions, dan di dalamnya atribut targetNamespacedan namememanggil pembina QName:
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
maka anda perlu menyambung secara manual ke teg service:
Service service = Service.create(url, qname);
dan di dalamnya ke tag port:
HelloWebService hello = service.getPort(HelloWebService.class);
dan hanya selepas itu kita boleh memanggil kaedah jauh:
hello.getHelloString("JavaRush")
Persoalannya ialah: adakah ini sebab moyang kita mati di medan perang, sehingga kita kini melakukan semuanya dengan tangan? Dan jika ia bukan perkhidmatan web kami, tetapi milik orang lain. Kemudian proses ini akan menjadi lebih tidak menyenangkan. Format XML direka untuk dibaca oleh mesin, bukan manusia. Jadi mari biarkan mesin melakukan kerja kotor dan nikmati prosesnya. Untuk ini, kita tidak perlu melakukan sesuatu yang istimewa, kerana... SDK kegemaran kami, yang dipanggil JDK di Java, termasuk utiliti khas yang dipanggil wsimport . Tetapi perkara pertama dahulu... Mula-mula, mari buat projek baharu dalam IDEA dengan memilih Fail > Projek Baharu... daripada menu dan memberikan projek itu nama HelloWS . Apabila kami ditanya di mana untuk membuka projek yang baru dibuat, kami perlu menjawab New Window , i.e. dalam tetingkap baharu, kerana saya akan ambil perhatian sekali lagi bahawa adalah sangat penting bahawa projek sebelumnya dibuka, kerana Kami masih ingat dari Langkah 1 bahawa kami menjalankan perkhidmatan web kami dalam projek itu. Anda boleh, sudah tentu, hanya melancarkannya melalui konsol Windows, tetapi saya tidak suka berbuat demikian. Daripada projek baharu, buka konsol dengan memilih View > Tool Windows > Terminal , atau hanya menekan Alt+F12 . Sekarang kita berada dalam akar projek, dan kita perlu masuk ke dalam folder src , jadi kita masukkan arahan berikut ke dalam konsol: cd src Kini tiba masanya untuk menggunakan utiliti wsimport . Ia berfungsi mengikut prinsip berikut: kami memberikannya penerangan WSDL , dan sebagai tindak balas ia mencipta fail rintisan (dipanggil Stub-classes), yang sudah mengandungi semua fungsi yang kami perlukan untuk mengakses perkhidmatan web. Kelas-kelas ini akan diletakkan dalam pakej ru.javarush.ws. Jika anda bertanya dari mana datangnya nama pakej, jawapannya ialah: nama pakej ialah ruang nama sasaran terbalik daripada penerangan WSDL . Ingat atribut targetNamespacedalam teg definitionsdaripada WSDL . Di sana kami telah menulis perkara berikut http:// ws.javarush.ru/. Dan ini bukan alamat tapak, ini adalah kebiasaan untuk menerangkan ruang nama dalam xml, dan jika kami membuang http://dan mengembangkan apa yang kekal dalam susunan terbalik, kami akan mendapat nama pakej kami. Jadi, mari jalankan utiliti: wsimport -keep http://localhost:1986/wss/hello?wsdl Untuk berfungsi, laluan ke sana mesti ditentukan dalam pembolehubah persekitaran PATH , atau anda boleh menggunakan laluan penuh ke sana. Bagi saya ia terletak dalam folder C:\Program Files\Java\jdk1.8.0_31\bin . Sila ambil perhatian bahawa semua yang anda perlu lakukan ialah menghantar fail WSDL melalui kekunci –keep , yang tersedia dari jauh melalui pautan, melainkan, sudah tentu, kami telah melumpuhkan perkhidmatan web. Apakah kelas stub ini? Hanya ada dua daripada mereka. Salah satunya ialahHelloWebService, yang pada asasnya adalah antara muka perkhidmatan web yang sama yang kami buat secara manual dalam Langkah 1. Perbezaannya adalah minimum dan ia terletak pada fakta bahawa anotasi yang telah kami temui digunakan secara berbeza sedikit, dan sebagai tambahan, anotasi tambahan digunakan, yang Saya menyebut saya tidak tahu apa-apa, tetapi kerana semuanya bekerja untuk kami tanpa mereka sebelum ini, maka mereka jelas tidak wajib. Kelas kedua ialah stub HelloWebServiceImplService, yang mewarisi daripada kelas Service. Kami telah pun menemui kelas Servicedalam pelanggan kami. Saya tidak akan memberikan kod kelas ini, kerana... Saya hampir tidak bersedia untuk menerangkan semua barisnya, tetapi intipati kelas datang kepada fakta bahawa semua yang kami tulis sebelum ini dalam klien secara manual untuk menyambung ke perkhidmatan web dibuat secara automatik dalam kelas ini dan kami hanya perlu panggil salah satu kaedahnya dan kami akan mempunyai segala-galanya dalam kerja terbuka. Jadi mari kita tulis semula kod pelanggan kami dalam projek baharu menggunakan kelas ini dan pastikan kod itu lebih ringkas. Pertama, dalam folder src projek baharu, mari buat package ru.javarush.client, dan di dalamnya kelas HelloWebServiceClientdengan kaedah 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") );
    }
}
Menghuraikan kod adalah asas dan apa yang saya terangkan dalam komen sudah cukup. Setelah melancarkan klien, kita harus melihat baris: Hello, JavaRush Community!Pada masa yang sama, pelanggan dari projek dari Langkah 1 akan terus berfungsi dan memaparkan teksnya yang kami tulis di dalamnya, iaitu: Hello, JavaRush! Pada ketika ini, mungkin, kita boleh menyelesaikan ini Langkah, kerana matlamatnya telah tercapai. Kami menyedari bahawa jika terdapat perihalan WSDL bagi perkhidmatan web, maka jdk bersedia untuk memberikan kami penjanaan stubkelas stub automatik untuk memudahkan penulisan pelanggan untuk perkhidmatan web ini. Pada pendapat saya, ini adalah ciri yang sangat berguna apabila anda ingin menguji perkhidmatan web orang lain dan tidak mengintip penerangan WSDLnya . Tinjauan ke masa hadapan Dalam artikel seterusnya tentang perkhidmatan web, saya ingin menggariskan idea tentang cara menggunakan perkhidmatan web ke dalam bekas servlet Tomcat dan ke dalam pelayan aplikasi yang berbeza, supaya anda tidak perlu menjalankan perkhidmatan web sebagai aplikasi berasingan, seperti yang kami lakukan dalam 2 Langkah pertama. Tetapi sebelum itu, saya fikir adalah lebih baik untuk membuat penyimpangan pendek mengenai topik apa itu servlet, bekas servlet dan bagaimana ia berbeza daripada pelayan aplikasi dan web biasa... . Di samping itu, kami perlu membuat gambaran ringkas tentang pelayan aplikasi , yang, pada pendapat saya, patut diberi perhatian kami.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION