Возвращение RESTful кодов ответов в Play - PullRequest
12 голосов
/ 17 декабря 2010

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

  • 200 - ОК
  • 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.Я что-то там пропускаю?

Ответы [ 2 ]

12 голосов
/ 18 декабря 2010

Глядя на исходный код Play (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
}
8 голосов
/ 17 февраля 2014

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

status(201, jsonData);

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

Status(488)("Strange response type")
...