1

ROR には慣れていますが、Java 環境で RESTfull WebService を作成する必要があります。そこで、Play! で試してみることにしました。それは本当に素晴らしいアイデアのように見えるからです。

だから私はそれらの指示に従って行われた既存のfirstappにJSONを追加する方法を見つけようとしています: http://www.playframework.org/documentation/2.0.3/JavaTodoList

私が欲しいのは、RORと同様に機能するものです。少なくとも、次の方法で JSON サポートを依頼できるようにしたいと考えています。

  • .json URL の呼び出し
  • 「Accept: application/json」ヘッダーを使用

だから私はそのような汚いことを試しました:

    JsonNode json = request().body().asJson();
    if(json != null) {
        return ok(Json.toJson(Task.all()));
    }

    return ok(
            views.html.index.render(Task.all(), taskForm)
    );

そして、それは明らかに現在機能していません...


クライアントが必要としているタイプを検出する必要があります。私は何人かの人々がそのような汚れたルートを追加しているのを見ました:

    POST    /bars                                       BarController.index()
    GET     /bars.json                                  BarController.indexJSON()

しかし、ヘッダーを使用してjsonリクエストを指定するクライアントを明らかにサポートしていません...


したがって、必要なのは、コンテンツ タイプまたは Accept application/json を指定するヘッダーがあるかどうかを確認する何らかの方法です。その場合、BarController.index() は BarController.indexJSON() を返します...

全体として、ROR とほとんど同じです。

respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @bars }
end

概して :

私よりも同じ理屈で終わりを迎えた人はいますか?

4

1 に答える 1

0

そこで、次のようにコントローラーで関数を使用して問題を解決しました。

public static Result index()
public static Result indexJSON()

次に、ルートを追加しました:

GET     /tasks                      controllers.TaskController.index()
GET     /tasks/json                 controllers.TaskController.indexJSON()

私は task.json を好みましたが、 /tasks/:id.json は許可されませんでした ...

ヘッダーのサポートについては、ヘッダーがない場合は従来の関数をチェックインする必要があります。

public static Result index() {
    if (request().getHeader(play.mvc.Http.HeaderNames.ACCEPT).equalsIgnoreCase("application/json") || request().getHeader(Http.HeaderNames.CONTENT_TYPE).equalsIgnoreCase("application/json")) {
        return indexJSON();
    }
    else {
        return ok(
                views.html.index.render(Task.all(), taskForm)
        );
    }
}

以上で終わりです。

誰かがより良い解決策を持っていますか? 私はこれがあまり好きではありません...私は多くのコードを繰り返すつもりなので...

于 2012-09-25T16:05:49.083 に答える