玩! 2+以RESTful方式添加JSON支持

时间:2012-09-25 04:22:17

标签: java ruby-on-rails rest playframework

我习惯做ROR,但我需要在Java环境中创建RESTfull WebService。所以我决定尝试玩Play!因为它看起来真的很棒。

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

我想要的是与ROR类似的工作。至少,我希望能够通过以下方式获得JSON支持:

  • 调用.json网址
  • 使用“Accept:application / json”Header

所以我尝试了一些像这样的脏东西:

    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()

但显然不支持使用header指定json请求的客户端...


所以,我需要的是某种方式来找出是否有任何Header指定内容类型或Accept application / json。如果是这样,BarController.index()将返回BarController.indexJSON()......

总而言之,它与ROR非常相似:

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

总而言之:

有没有人经历过与我相同的推理并达到目的?

1 个答案:

答案 0 :(得分: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支持,如果没有标题,您需要检查您的经典函数:

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)
        );
    }
}

结束那是所有人!

有人有更好的解决方案吗?我不太喜欢这个...因为我要重复许多代码......