在Play中返回RESTful响应代码

时间:2010-12-17 18:33:08

标签: rest httpresponse playframework

我刚刚开始使用REST,我一直在阅读this帖子以及关于REST book的上述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。我错过了吗?

2 个答案:

答案 0 :(得分:12)

查看play.mvc.Http.StatusCode对象的播放源代码(播放1.1),播放似乎包含以下代码

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 可能工作。

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

答案 1 :(得分:8)

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

status(201, jsonData);

在Scala中,它应该像本例中的official docs

一样工作
Status(488)("Strange response type")