【问题标题】:Play! 2+ Adding JSON support in a RESTfull way玩! 2+ 以 RESTful 方式添加 JSON 支持
【发布时间】:2012-09-16 13:42:01
【问题描述】:

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

所以我正在尝试找到一种方法将 JSON 添加到我已经存在的 firstapp 中,按照这些说明完成: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()

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


所以,我需要某种方法来确定是否有任何标头指定内容类型或接受应用程序/json。如果是这样,BarController.index() 将返回 BarController.indexJSON()...

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

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

总之:

有没有人经历过和我一样的推理并走到了尽头?

【问题讨论】:

  • 您希望request().body().asJson(); 会返回什么?
  • 如果 body 是 JSON 格式,它会返回一个 JsonNode...
  • 那么您是否将 json 发布到您的服务?
  • 另外,“它不工作”是什么意思? json 是空的吗?
  • 是的,大多数情况下,如果您对收藏进行 GET 操作,您只想检索它。所以你不要发送 à JSON Body。但是你发送一个 HEADER:Accept: application/json...

标签: java ruby-on-rails rest playframework


【解决方案1】:

所以我通过在控制器中使用 to 解决了我的问题,如下所示:

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

到此为止!

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

【讨论】:

  • 如果我没看错,你甚至不需要 task.json 路由吗?另外,tasks.{format},我猜你在某个地方的方法中收到了一个格式变量?
  • 你要重复什么?
  • 我需要 task.json,因为一些 lowREST 客户端不使用正确的标头。我尝试了任务格式。并且路由无效:`对于请求'GET /tasks.json'这些路由已经尝试过,顺序如下:1GET/assets/$file<.>controllers.Assets.at(path:String = "/ public", file:String) 2GET/task.{format}controllers.TaskController.index() 3POST/task.{format}controllers.TaskController.newTask() 4POST/tasks/$id/deletecontrollers .TaskController.deleteTask(id:Long)`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
相关资源
最近更新 更多