JavaRush /Java Blog /Random-JA /ウェブサービス。ステップ 1. Web サービスとは何ですか?また、その操作方法は何ですか?
eGarmin
レベル 41

ウェブサービス。ステップ 1. Web サービスとは何ですか?また、その操作方法は何ですか?

Random-JA グループに公開済み
トピックのタイトルは本当に質問です。なぜなら... 私自身、それが何であるかわからないので、この記事の枠組みの中で初めてそれに取り組んでみようと思います。私が保証できる唯一のことは、以下に示すコードが機能するということですが、私の表現は私自身がこれらすべてをどのように理解しているかについての仮定と推測にすぎません。じゃ、行こう... ウェブサービス。 ステップ 1. Web サービスとは何ですか?また、その操作方法は何ですか?  - 1

導入

Web サービスという概念がなぜ生まれたのかということから始める必要があります。この概念が世に登場した頃には、アプリケーションが遠隔地で対話できる技術がすでに存在しており、あるプログラムが別のプログラムのメソッドを呼び出し、そのメソッドを別の都市や国にあるコンピューター上で起動することができました。これはすべて RPC (Remote Procedure Calling) と略されます。例には、CORBA テクノロジや Java の RMI (リモート メソッド呼び出し) が含まれます。特に CORBA ではすべてがうまくいっているようです。どのプログラミング言語でも操作できますが、まだ何かが欠けていました。CORBA の欠点は、あらゆるファイアウォールを通過できる単純な HTTP ではなく、独自のネットワーク プロトコルの一部を通じて動作することだと思います。Web サービスのアイデアは、HTTP パケットに挿入される RPC を作成することでした。こうして規格の開発が始まりました。この規格の基本概念は次のとおりです。
  1. 石鹸。リモート プロシージャを呼び出す前に、この呼び出しを SOAP 形式の XML ファイルに記述する必要があります。SOAP は、Web サービスで使用される多数の XML マークアップの 1 つにすぎません。HTTP 経由でどこかに送信したいものはすべて、まず XML SOAP 記述に変換され、次に HTTP パケットに詰め込まれて、TCP/IP 経由でネットワーク上の別のコンピューターに送信されます。
  2. WSDL。Web サービスがあります。メソッドをリモートから呼び出すことができるプログラム。しかし、標準では、このプログラムには「はい、その通りです。これは実際には Web サービスであり、そこからさまざまなメソッドを呼び出すことができます。」という説明を付けることが求められています。この記述は、WSDL という異なる形式の別の XML ファイルによって表されます。それらの。WSDL は、Web サービスを記述する単なる XML ファイルです。
なぜそんなに簡潔に尋ねるのですか?もっと具体的に言えないでしょうか?おそらく可能ですが、これを行うには、T. Mashnin の「Java Web Services」などの書籍を参照する必要があります。最初の 200 ページにわたって、SOAP および WSDL 標準の各タグの詳細な説明が記載されています。やる価値はあるでしょうか?私の意見では、いいえ、なぜなら... これらはすべて Java で自動的に作成され、リモートで呼び出されるメソッドの内容を記述するだけで済みます。そこで、JavaにはJAX-RPCといったAPIが登場しました。知らない人のために説明すると、Java にはこれこれの API があると言うとき、それは、問題のテクノロジをカプセル化する一連のクラスを含むパッケージがあることを意味します。JAX-RPC は時間の経過とともにバージョンごとに進化し、最終的に JAX-WS になりました。WS は明らかに WebService の略であり、これは最近人気のバズワードである RPC の名前を変更しただけだと思う​​かもしれません。これは真実ではありません。現在、Web サービスは元の概念から離れており、リモート メソッドを呼び出すだけでなく、SOAP 形式でドキュメント メッセージを送信することもできます。なぜこれが必要なのかはまだわかりませんが、「必要になった場合に備えて」という答えは得られそうにありません。私自身も、より経験豊富な同志から学びたいと思っています。そして最後に、いわゆる RESTful Web サービス用に JAX-RS が登場しましたが、これについては別の記事で取り上げます。紹介はここで終わりでもいいので… 次に、JAX-WS の操作方法を学習します。

一般的方法

Web サービスには、常にクライアントとサーバーが存在します。サーバーは Web サービスであり、エンドポイント (クライアントからの SOAP メッセージが到達するエンドポイントなど) と呼ばれることもあります。次のことを行う必要があります。
  1. Webサービスのインターフェースについて説明する
  2. このインターフェースを実装する
  3. Webサービスを開始する
  4. クライアントを作成し、目的の Web サービス メソッドをリモートで呼び出す
Web サービスはさまざまな方法で起動できます。メソッドを使用してクラスを記述しmain、Web サービスをサーバーとして直接起動するか、Tomcat などのサーバーに Web サービスをデプロイします。2 番目のケースでは、私たち自身が新しいサーバーを起動したり、コンピューター上の別のポートを開いたりするのではなく、Tomcat サーブレット コンテナーに「ここに Web サービス クラスを作成しました。連絡するすべての人ができるように公開してください」と伝えるだけです。 Web サービスを使用してください。」Web サービスを起動する方法に関係なく、同じクライアントを使用します。

サーバ

IDEA を起動して、新しいプロジェクトを作成しましょうCreate New Project「HelloWebService」という名前を指定し、「次へ」ボタンをクリックしてから、「完了」ボタンをクリックします。srcフォルダーにパッケージru.javarush.wsを作成します。このパッケージでは、インターフェイスを作成します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);
}
このコードでは、クラスはいわゆるアノテーションでありWebServiceWebMethodインターフェイスとそのメソッドを Web サービスとしてマークすること以外は何も行いません。同じことがクラスにも当てはまりますSOAPBinding。唯一の違いは、SOAPBindingこれがパラメーターを含むアノテーションであることです。この場合、パラメータは、styleWeb サービスがドキュメント メッセージを通じてではなく、従来の RPC として機能することを示す値とともに使用されます。メソッドを呼び出すために。インターフェイス ロジックを実装し、パッケージ内にクラスを作成しましょうHelloWebServiceImpl。ところで、Impl でクラスを終了するのは Java の規則であり、これに従ってインターフェイスの実装がそのように指定されることに注意してください (Impl - 単語の実装、つまり実装から)。これは必須ではなく、クラスに自由に名前を付けることができますが、マナーとしてはこれが必要です。
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 + "!";
    }
}
Web サービスを独立したサーバーとして起動しましょう。つまり、Tomcat サーバーやアプリケーション サーバーが参加することはありません (これは別の議論のトピックです)。これを行うには、 srcフォルダー内のプロジェクト構造でpackage を作成しru.javarush.endpoint、その中にHelloWebServicePublisherメソッドを持つクラスを作成します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());
    }
}
次に、 Shift+F10 を押してこのクラスを実行しましょう。コンソールには何も表示されませんが、サーバーは実行されています。これを確認するには、ブラウザにhttp://localhost:1986/wss/hello?wsdlという行を入力します。開いたページは、一方では、Web サーバー (http://) がコンピューター (localhost) のポート 1986 で実行されていることを証明し、他方では、Web サービスの WSDL 記述を示します。アプリケーションを停止すると、Web サービス自体と同様に説明も使用できなくなるため、これは行わず、クライアントの作成に進みます。

クライアント

プロジェクト フォルダーsrcにパッケージを作成し、その中にメソッドを持つru.javarush.clientクラスを作成します。 HelloWebServiceClientmain
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"));
    }
}
リスト内のコードには最大限のコメントを付けました。追加するものは何もないので、実行しましょう (Shift+F10)。コンソールにテキストが表示されるはずです。Hello, JavaRush!テキストが表示されない場合は、Web サービスを開始するのを忘れている可能性があります。

結論

このトピックでは、Web サービスについて簡単に説明しました。もう一度言いますが、私が書いたことの多くはそれがどのように機能するかについての私の推測です。したがって、私をあまり信用しないでください。知識のある人が私を修正してくれるとありがたいです。そうすれば何かを学ぶことができます。 更新。 会話を続けましょう
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION