5

create在 Play 中有一个动作!应该返回 HTTP 状态代码Created并将客户端重定向到创建对象的位置的框架控制器。

public class SomeController extends Controller {

    public static void create() {
        Something something = new Something();
        something.save();
        response.status = StatusCode.CREATED;  // Doesn't work!
        show(something.id);
    }

    public static void show(long id) {
        render(Something.findById(id));
    }
}

另请参阅Play 中的方法链接!框架文档

上面的代码返回状态码302 Found而不是201 Created. 我该怎么做才能让 Play 返回正确的状态(和Location标题)?

4

3 回答 3

6

发生这种情况的原因是,一旦你创造了你的东西,你就会Show通过调用show动作来告诉你的东西玩。

为了实现这一点,play 正在执行重定向(以保持其 RESTful 状态),告诉浏览器作为调用create()动作的结果,它现在必须重定向到show()动作。

所以,你有几个选择。

  1. 不要呈现响应,让客户端在创建响应后处理它的去向(不理想)。
  2. 而不是调用 show(),只需在 create() 方法中自己渲染它......

要使用选项 2,它可能如下所示:

public static void create() {
    Something something = new Something();
    something.save();
    response.status = StatusCode.CREATED;
    renderTemplate("Application/show.html", something);
}
于 2011-09-18T14:59:36.767 回答
1

Play框架中设置状态码的示例代码:Response.current().status = Http.StatusCode.CREATED;

于 2012-06-30T18:04:45.220 回答
0

在播放框架中,调用另一个动作会执行重定向,只是调用的动作不是公共的。因此,这是解决方案之一:

public class SomeController extends Controller {

    public static void create() {
        Something something = new Something();
        something.save();
        response.status = StatusCode.CREATED;  // Doesn't work!
        show(something.id);
    }

    private static void show(long id) {
        render(Something.findById(id));
    }
}
于 2018-02-08T05:52:20.233 回答