- 追加された行はこの色です。
- 削除された行はこの色です。
#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;}