Возврат кодов ответа RESTful в Play

Я только начинаю с REST, и я читал этот пост и упомянутый книга о REST коды ответов. Когда я смотрю на Play Controller, однако он, кажется, ограничен возвратом

  • 200 - OK
  • 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. Я что-то там пропал?

Ответ 1

Посмотрев на исходный код воспроизведения (Play 1.1) в объекте play.mvc.Http.StatusCode, у Play появится следующие коды

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), поэтому следующий хак может работать.

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

Ответ 2

В текущей версии Play вы должны использовать status(). Пример:

status(201, jsonData);

В Scala он должен работать так, как в этом примере, взятом из официальных официальных документов:

Status(488)("Strange response type")