1

我习惯做 ROR,但我需要在 Java 环境中创建一个 RESTfull WebService。所以我决定用 Play 试试看!因为它看起来真的是个好主意。

所以我试图找到一种方法将 JSON 添加到我已经存在的 firstapp 中,按照这些说明完成:http ://www.playframework.org/documentation/2.0.3/JavaTodoList

我想要的是与 ROR 类似的东西。至少,我希望能够通过以下方式请求 JSON 支持:

  • 调用 .json URL
  • 使用“接受:应用程序/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 请求...


所以,我需要的是某种方式来找出是否有任何 Header 指定内容类型或接受应用程序/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 ...

对于 Header 支持,如果没有 header ,您需要检查您的经典函数:

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 回答