How to create REST client in Java (4)

REST

In the previous articles, I explained about getting resources by GET and mapping them to Java objects.
This article explains how to use another HTTP methods ( POST / PUT / DELETE ).

はじめに

【第三回】から暫く間があきましたが、続きます。

前回までは、GETメソッドを利用してリソースを取得し、これをJavaオブジェクトにマッピングする方法に関して書きましたが、今回は別メソッドでの方法に関して説明します。

POST / PUT メソッド

Webアプリケーションで利用されるメソッドの中で、GETに続いて多いのはPOSTメソッドでしょう。
RESTful Web サービスにおいては、POST メソッドはリソースの新規作成の際に利用される場合が多いかと思います。

実はリソースの新規作成に関しては PUT メソッド を利用する事もできます。
( 使い分けに関しては、POSTとPUTの使い分けを参照 )

これら二つのメソッドはリソースの新規作成、及び、リソースの更新を行う場合に利用されます。

Jersey を利用した POST リクエストを送信するためのコードを書いてみます。
【第二回】のRestClient.java に追記して下さい。

RestClient.java

    /**
     * Send Post or PUT Request to RESTful Web Service.
     */
	private <E> String sendRequest(String uri, E entity, String method,
			Class<E> cls, MediaType type) {

        Client client = getClient();
        ClientRequest.Builder builder = ClientRequest.create();
        try {
            builder.type(type).entity(entity);
            ClientRequest request = builder.build(new URI(uri), method);
            ClientResponse response = client.handle(request);
            switch (response.getStatus()) {
            case 200:   // OK
            case 201:   // CREATED
                return response.getEntity(String.class);
            default:    // OK, CREATED 以外
                String error = response.getEntity(String.class);
                throw new RuntimeException(error);
            }
        } catch (URISyntaxException e) {
            throw new RuntimeException(e.getMessage());
        }
    }

上のコードは POST / PUT の双方のメソッドに対応するコードになっています。Jersey を利用する場合、ほぼ同じやり方で送信する事ができます。

レスポンスのステータスコードは 200 (OK)、あるいは、201 (CREATED) が正常系で、それ以外は異常系となります。
( ステータスコードに関しては 【図解】RESTful WebサービスにおけるHTTPステータスコード を参照 )

POST / PUT 送信のためのメソッドも作成しましょう。以下コードも RestClient.java に追加します。

    /**
     * Send PUT method.
     */
    public <E> String put(String uri, E entity, Class<E> cls, MediaType type) {
        return sendRequest(uri, entity, HttpMethod.PUT, cls, type);
    }
    
    /**
     * Send POST method.
     */
    public <E> String post(String uri, E entity, Class<E> cls, MediaType type) {
        return sendRequest(uri, entity, HttpMethod.POST, cls, type);
    }

RestClient を利用した POST / PUT リクエスト送信

上記メソッドを利用するコードは以下のようになります。
以下コード例では put メソッドを利用していますが、 post メソッドでも同様です。

【第二回】で作成した Node クラスを利用する場合には以下のようなコードになります。

	RestClient client = new RestClient("superuser", "superuser");
	String uri = "..."; // specify URI
	Node node = new Node();
	node.name = "...";

	( *snip* -  set necessary values ) 

	client.put(uri, node, Node.class, MediaType.APPLICATION_XML_TYPE);

リソースとJavaオブジェクトをマッピングしていない場合には、XML や JSON を直接文字列として設定/送信すればOKです。

	RestClient client = new RestClient("superuser", "superuser");
	String uri = "..."; // specify URI
	StringBuilder xml = new StringBuilder()
	xml.append("...");

	( *snip* ) 

	client.put(uri, xml.toString(), String.class, MediaType.APPLICATION_XML_TYPE);

DELETE メソッド

残りは DELETE メソッドです。
リソース削除の際に利用されます。

以下を RestClient.java に追記します。

    /**
     * Send DELETE method.
     */
    public void delete(String uri) {
        Client client = getClient();
        ClientRequest.Builder builder = ClientRequest.create();
        try {
            ClientRequest request = builder.build(new URI(uri), HttpMethod.DELETE);
            ClientResponse response = client.handle(request);
            if (response.getStatus() != 204) {  // NO CONTENT以外
                String error = response.getEntity(String.class);
                throw new RuntimeException(error);
            }
        } catch (URISyntaxException e) {
            throw new RuntimeException(e.getMessage());
        }
    }

上記コードでは、ステータスコードは 204 (NO CONTENT) 場合のみ正常としています。
利用するWebサービスが返すステータスコードに応じてこの辺りの値は適宜変更する等してください。

RestClient を利用した DELETE リクエスト送信

DELETEリクエストに関しては書くまでもないかと思いますが、以下のような使い方になります。

	RestClient client = new RestClient("superuser", "superuser");
	client.delete("....."); // specify URI

まとめ

JavaでRESTクライアントを作成する【第一回】 から四回にわたって、JavaでRESTクライアントを作成し、これを利用する方法に関して書いてきました。

Java を利用して REST クライアントを利用する場合の最大のメリットは、XML/JSON から Java オブジェクトへのマッピングによって、通常のJavaオブジェクトを扱う感覚でRESTful Webサービスを利用できる事だと思います。

【第二回】 ではリソースに対応するJavaクラスを手動で作成しましたが、リソースのXMLスキーマ等が用意されている場合、これらクラスの生成は自動で行う事が可能です。

プログラミング言語を利用した Web サービスへのアクセスを行った事がない場合、一度試してみてはいかがでしょうか。