【问题标题】:Return HTTP Status "created" in Play! Framework在 Play 中返回 HTTP 状态“创建”!框架
【发布时间】:2011-11-19 15:16:13
【问题描述】:

我在 Play 中有一个 create 动作!框架控制器应该返回 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));
    }
}

另见method chaining in the Play! framework documentation

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

【问题讨论】:

    标签: java rest playframework http-status-codes playframework-1.x


    【解决方案1】:

    发生这种情况的原因是,一旦你创建了你的东西,你就会通过调用 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);
    }
    

    【讨论】:

    • 201 Created 应该与Location 标头一起发送,这在解决方案2 中不会发生。您能解释一下解决方案1,我不明白吗?
    • 解决方案 1 不好。基本上是说,在您的请求创建之后,然后请求 show(),因此您的流程是由客户端(即 javascript)决定的,而不是在您的操作中的服务器端。
    • 我检查了 Play (1.2.3) 和 Redirect 对象的源代码,有一个代码,默认为 302。它有一个构造函数来提供不同的代码,但这个构造函数确实似乎没有在框架中使用。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2020-10-01
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 2022-06-15
        • 2022-10-23
        相关资源
        最近更新 更多