【问题标题】:Returning RESTful response codes in Play在 Play 中返回 RESTful 响应代码
【发布时间】:2010-12-17 18:33:08
【问题描述】:

我刚刚开始使用 REST,我一直在阅读 this 帖子和提到的 book 关于 REST response codes。然而,当我查看 Play 的 Controller 课程时,它似乎仅限于返回

  • 200 - 好的
  • 301 - 永久移动
  • 302 - 找到
  • 304 - 未修改
  • 400 - 错误请求
  • 401 - 未授权
  • 403 - 禁止
  • 404 - 未找到
  • 5xx

这似乎遗漏了一些可能有用的代码:

  • 201 - 已创建(对于成功的 JSON 帖子的良好响应?)
  • 202 - 已接受(对于排队的请求)
  • 204 - 无内容(PUT/POST/DELETE 成功的可能响应)
  • 307 - 临时重定向
  • 405 - 方法不允许
  • 406 - 不可接受
  • 409 - 冲突
  • 410 - 走了
  • 415 - 不支持的媒体类型(当没有定义 JSON 模板时,这似乎是对 JSON 格式请求的适当响应)

毕竟那些都不需要吗? Play 会自动处理这些情况吗?

此外,一个控制器似乎无法很好地处理同一资源的 REST 请求和正常网页请求,因为网页总是以200 返回。我有什么遗漏吗?

【问题讨论】:

    标签: rest httpresponse playframework


    【解决方案1】:

    查看play.mvc.Http.StatusCode对象的Play Source code(Play 1.1),Play似乎有以下代码

    public static final int OK = 200;
    public static final int CREATED = 201;
    public static final int ACCEPTED = 202;
    public static final int PARTIAL_INFO = 203;
    public static final int NO_RESPONSE = 204;
    public static final int MOVED = 301;
    public static final int FOUND = 302;
    public static final int METHOD = 303;
    public static final int NOT_MODIFIED = 304;
    public static final int BAD_REQUEST = 400;
    public static final int UNAUTHORIZED = 401;
    public static final int PAYMENT_REQUIERED = 402;
    public static final int FORBIDDEN = 403;
    public static final int NOT_FOUND = 404;
    public static final int INTERNAL_ERROR = 500;
    public static final int NOT_IMPLEMENTED = 501;
    public static final int OVERLOADED = 502;
    public static final int GATEWAY_TIMEOUT = 503;
    

    这表示您已识别的某些代码已被确认,例如 201、202、204。但是,值 307、405、406、409、410 和 415 不存在。

    此外,201、202、204 已被确认,但不会在源代码中的其他任何地方引用。因此,除非 Netty 服务器或提供的其中一个 jar 文件正在为 Play 管理这些(我不确定它是否能做到),否则我无法看到 Play 如何在不了解代码库的情况下神奇地处理这些情况。

    查看 renderJSON 的代码,它似乎没有将状态代码设置为发送回结果的一部分(因此使用默认 200),因此以下 hack 可能工作。 p>

    public static void myJsonAction() {
        response.status = 201;
        renderJSON(jsonString); // replace with your JSON String
    }
    

    【讨论】:

    • 我测试了设置response.status,果然,就是这么简单。
    • 知道这些常量在 Play 2.x 中的位置吗? Play 2.x Scala 怎么样?
    • 找到 Scala 2.x 响应代码,例如play.api.mvc.Results#NoContent
    【解决方案2】:

    在当前的 Play 版本中,您必须改用 status()。示例:

    status(201, jsonData);
    

    在 Scala 中,它应该像本示例中那样工作,取自 official docs:

    Status(488)("Strange response type")
    

    【讨论】:

    • 如何在 scala 中使用它,我已经搜索过没有像 status() 这样的方法
    • 在 2.7 中位于此处:play.mvc.Http.Status
    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    相关资源
    最近更新 更多