#author("2019-01-25T08:01:03+00:00","","")
#author("2020-10-05T04:15:39+00:00","","")
// 下階層用テンプレート
#topicpath
----//ここにコンテンツを記述します。

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

#contents

** RESTなサービスを作成するJSONICの RESTServlet [#i3a3464c]
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)を取得することが出来ます。


*** やってみる [#r451a346]
実際簡単なプログラムでやってみます。RESTのURIとして
 /text2unicode/t/[文字(をURL Encodeしたもの)].json
を呼び出すと、
 {
  "text":"文字",
  "unicode":"文字をUnicode表記したもの"
 }
を返すようなものを考えます。

たとえば、
 /text2unicode/t/%E3%81%82.json   <-「あ」をURL Encodeしたもの
にアクセスすると、
 {"text":"あ","unicode":"\\u3042"}
が返却されるようにします。


***JSONICのインストールと設定 [#qdabfd9c]
JSONICのインストールは簡単で、[[JSONIC - simple json encoder/decoder for java>http://jsonic.sourceforge.jp/]] からダウンロードしてきて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が渡されてきます。

***戻りのオブジェクト [#a359392c]
戻りのオブジェクトは下記のようなPOJOを定義します。ちなみのこのPOJOは上記のfindメソッドの戻り値にしますが、JSONICはPOJOなオブジェクトを自動でJSON形式に変換してくれます。
 public class UnicodeTextObject {
     private String text;
     private String unicode;
     ...Getter/Setter省略
 }

***nu.mine.kino.gae.rest.AjaxText2unicodeControllerの実装 [#c5dbb1a1]
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)>http://jsonic.sourceforge.jp/webservice.html#restservlet]] の規約に則って、クライアントからのリクエストにマッピングされるようです。インタフェースとかがない緩い感じの規約です。

あ書き忘れましたが、Unicode表記の文字列を取得するのに
 StringEscapeUtils.escapeJava(text);
とCommons Langを使ってるのでそのjarもWEB-INF/libに入れとく必要がありますね。

**呼び出してみる [#n7d8a219]
試しに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"}
が返却されました!




**関連リンク [#x99d4764]
-[[WebサービスAPI (JSONIC 1.3)>http://jsonic.sourceforge.jp/webservice.html#restservlet]]

----
この記事は
#vote(おもしろかった[2],そうでもない[0])
#vote(おもしろかった[3],そうでもない[0])
- 書いてみたもののGoogle App Engineあんま関係なく、普通にRESTの記事になってしまった(´д`;) -- [[きの]] &new{2013-07-07 (日) 11:02:53};

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS