Вернуть статус HTTP, созданный в Play! Рамки

У меня есть create действие в Play! framework, который должен возвращать код состояния 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)?


person deamon    schedule 18.09.2011    source источник


Ответы (3)


Причина, по которой это происходит, заключается в том, что как только вы создали что-то, вы сообщаете play Show вашему чему-то, вызывая действие show.

Чтобы добиться этого, игра выполняет перенаправление (для поддержания своего состояния 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);
}
person Codemwnci    schedule 18.09.2011
comment
201 Created следует отправлять вместе с заголовком Location, чего не произойдет с решением 2. Не могли бы вы объяснить решение 1, я его не понимаю? - person deamon; 18.09.2011
comment
Решение 1 не подходит. По сути, это означает, что после создания вашего запроса, затем запросите show(), поэтому ваш поток определяется на стороне клиента (т.е. javascript), а не на стороне сервера в вашем действии. - person Codemwnci; 18.09.2011
comment
Я проверил исходный код Play (1.2.3) и объект Redirect, имеет код, который по умолчанию равен 302. У него есть конструктор, предлагающий другой код, но этот конструктор, похоже, не используется во фреймворке. . - person Codemwnci; 18.09.2011

Пример кода для установки кода состояния в Play framework: Response.current().status = Http.StatusCode.CREATED;

person Robert de W    schedule 30.06.2012

В игровой среде вызов другого действия выполняет перенаправление, за исключением того, что вызываемое действие не является общедоступным. Итак, вот одно из решений:

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));
    }
}
person Andy    schedule 08.02.2018