Вернуть HTTP статус «создан» в Play! Фреймворк - PullRequest
5 голосов
/ 18 сентября 2011

У меня есть 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));
    }
}

См. также сцепление метода в Play!базовая документация .

Приведенный выше код возвращает код состояния 302 Found вместо 201 Created.Что я могу сделать, чтобы Play вернул правильный статус (и заголовок Location)?

Ответы [ 3 ]

6 голосов
/ 18 сентября 2011

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

Чтобы достичь этого, игра выполняетперенаправление (для поддержания своего состояния RESTful), чтобы сообщить браузеру, что в результате вызова действия create() он должен теперь перенаправить на действие show().

Итак, у вас есть параoptions.

  1. Не отображать ответ, и пусть клиентская сторона обрабатывает, куда он идет после его создания (не идеально).
  2. Вместо вызова show (), просто выполните рендерингэто самостоятельно в методе create () ...

Чтобы использовать вариант 2, он может выглядеть следующим образом:

public static void create() {
    Something something = new Something();
    something.save();
    response.status = StatusCode.CREATED;
    renderTemplate("Application/show.html", something);
}
1 голос
/ 30 июня 2012

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

0 голосов
/ 08 февраля 2018

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

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