Play frameworkでGET/POSTでデータを受け取る

このエントリはPlay frameworkひとりアドベントカレンダーの8日目です。

今日はGET/POSTで送信されたデータを受信してみます。 いずれの場合もJSONで送ったデータが返ってくるようにします。

formのバインディングとかあるみたいだけど、わからんちんなので使いません。
上級者が使えばよろしい。

レスポンス例

{"fuga":["fugo","fuge"],"hoge":"hoga"}

GETの場合はこのリクエストで正しいデータがくるようにします。

curl 'http://localhost:9000/push?hoge=hoga&fuga=fugo&fuga=fuge'

POSTの場合はこのリクエストで正しいデータがくるようにします。

curl --data 'hoge=hoga&fuga=fugo&fuga=fuge' 'http://localhost:9000/push'

GETの場合

Controller#request#queryStringMap<String, String[]> からデータを取得します。

POSTの場合

Controller#body#asFormUrlEncodedMap<String, String[]> からデータを取得します。

サンプルコード

こんな感じ。相変わらず簡単。

/conf/routes

GET      /push        controllers.Application.getPush()
POST     /push        controllers.Application.postPush()

/app/controller/Application.java

package controllers;

import java.util.Map;

import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.ObjectNode;

import play.libs.Json;
import play.mvc.Controller;
import play.mvc.Result;

public class Application extends Controller {

	public static ObjectNode convert(Map data) {
		ObjectNode json = Json.newObject();
		for (String key : data.keySet()) {
			if (data.get(key) == null || data.get(key).length == 0) {
				continue;
			} else if (data.get(key).length == 1) {
				json.put(key, data.get(key)[0]);
			} else {
				ArrayNode child = json.putArray(key);
				for (String value : data.get(key)) {
					child.add(value);
				}
			}
		}
		return json;
	}

	public static Result getPush() {
		Map queryStrings = request().queryString();
		return ok(convert(queryStrings));
	}

	public static Result postPush() {
		Map form = request().body().asFormUrlEncoded();
		return ok(convert(form));
	}

}

See also