Top / GoogleAppEngine / JSONICでRESTしてみる

Google App EngineにRESTなサービスを追加したいと思います。

RESTなサービスを作成するJSONICの RESTServlet

RESTなリクエストをパラメータとして解析するサーブレットとしてJSONICの

net.arnx.jsonic.web.RESTServlet

を使用してみました。これはweb.xmlの設定で

  "mappings": {
    "/{class}/{source}.json":"nu.mine.kino.gae.controller.Ajax${class}Controller"
  }

とか書くことで、

 /hoge/fuga.json

へのリクエストを、

nu.mine.kino.gae.controller.AjaxHogeController#find(Map params)

へ転送することができたり、戻り値のオブジェクトを自動でJSON形式に変換してくれたりする便利なサーブレットです。ちなみに上記の例だとparamsからは params.get("source")とやってパラメタの値(この例だとfuga)を取得することが出来ます。

やってみる

実際簡単なプログラムでやってみます。RESTのURIとして

/text2unicode/t/[文字(をURL Encodeしたもの)].json

を呼び出すと、

{
 "text":"文字",
 "unicode":"文字をUnicode表記したもの"
}

を返すようなものを考えます。

たとえば、

/text2unicode/t/%E3%81%82.json   <-「あ」をURL Encodeしたもの

にアクセスすると、

{"text":"あ","unicode":"\\u3042"}

が返却されるようにします。

JSONICのインストールと設定

JSONICのインストールは簡単で、JSONIC - simple json encoder/decoder for java からダウンロードしてきてjarをWEB-INF/libにおくことと、web.xmlに以下を追加します。

<servlet>
    <servlet-name>restServlet</servlet-name>
    <servlet-class>net.arnx.jsonic.web.RESTServlet</servlet-class>
    <init-param>
        <param-name>config</param-name>
        <param-value>
            {
                "debug": true,
                "mappings": {
                  "/{class}/{uort}/{source}.json":"nu.mine.kino.gae.rest.Ajax${class}Controller"
                }
            }
        </param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>restServlet</servlet-name>
    <url-pattern>*.json</url-pattern>
</servlet-mapping>

マッピングを

"/{class}/{uort}/{source}.json":"nu.mine.kino.gae.rest.Ajax${class}Controller"

このようにしたので

/text2unicode/t/%E3%81%82.json

にアクセスすると、

nu.mine.kino.gae.rest.AjaxText2unicodeController#find(Map params)

が呼び出され、パラメタに

{source=%E3%81%82, class=text2unicode, uort=t}

というMapが渡されてきます。

戻りのオブジェクト

戻りのオブジェクトは下記のようなPOJOを定義します。ちなみのこのPOJOは上記のfindメソッドの戻り値にしますが、JSONICはPOJOなオブジェクトを自動でJSON形式に変換してくれます。

public class UnicodeTextObject {
    private String text;
    private String unicode;
    ...Getter/Setter省略
}

nu.mine.kino.gae.rest.AjaxText2unicodeControllerの実装

nu.mine.kino.gae.rest.AjaxText2unicodeControllerを実装します。こんな感じです。

public class AjaxText2unicodeController {
    public UnicodeTextObject find(Map<String, String> params)
            throws UnsupportedEncodingException {
        String source = URLDecoder.decode(params.get("source"), "UTF-8");
        String uort = params.get("uort");
        System.out.println(params);
        UnicodeTextObject create =
            new TextUtilsService().create(source, uort.charAt(0));
        return create;
    }
}
public class TextUtilsService {
    public String unicode2Text(String unicode) {
        return StringEscapeUtils.unescapeJava(unicode);
    }
    public String text2Unicode(String text) {
        return StringEscapeUtils.escapeJava(text);
    }

    public UnicodeTextObject create(String source, char c) {
        UnicodeTextObject ret = new UnicodeTextObject();
        switch (c) {
        case 'u': //urlがuなら unicode -> text
            String unicode2Text = unicode2Text(source);
            ret.setText(unicode2Text);
            ret.setUnicode(source);
            break;
        case 't': //urlがtなら text -> unicode
            String text2Unicode = text2Unicode(source);
            ret.setUnicode(text2Unicode);
            ret.setText(source);
            break;
        default:
            ret.setText(source);
            ret.setUnicode(source);
            break;
        }
        return ret;
    }
 }

いろいろ書いてますが、

public UnicodeTextObject find(Map<String, String> params);

このメソッド内で

String source = URLDecoder.decode(params.get("source"), "UTF-8");

このように引数のMapからパラメタを取得し、

UnicodeTextObject create =
    new TextUtilsService().create(source, uort.charAt(0));
return create;

としてPOJOを作成して返しているだけですね。

ちなみにこのメソッド

public UnicodeTextObject find(Map<String, String> params)

このシグネチャは、WebサービスAPI (JSONIC 1.3) の規約に則って、クライアントからのリクエストにマッピングされるようです。インタフェースとかがない緩い感じの規約です。

あ書き忘れましたが、Unicode表記の文字列を取得するのに

StringEscapeUtils.escapeJava(text);

とCommons Langを使ってるのでそのjarもWEB-INF/libに入れとく必要がありますね。

呼び出してみる

試しにGoogle App Engineを起動して

http://localhost:8888/text2unicode/t/%E7%B0%A1%E5%8D%98%E3%81%ABREST%E3%81%A7%E3%81%8D%E3%81%9F.json

へブラウザとかREST ClientとかでGetでアクセスしてみましょう。

{"text":"簡単にRESTできた","unicode":"\\u7C21\\u5358\\u306BREST\\u3067\\u304D\\u305F"}

が返却されました!

関連リンク


この記事は

選択肢 投票
おもしろかった 3  
そうでもない 0  
  • 書いてみたもののGoogle App Engineあんま関係なく、普通にRESTの記事になってしまった(´д`;) -- きの? 2013-07-07 (日) 11:02:53

Top / GoogleAppEngine / JSONICでRESTしてみる

現在のアクセス:4165


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-10-05 (月) 13:15:39 (1291d)