Play Framework: возврат 400 вместо 415

Я создаю службу RESTful с помощью Play. Я хочу, чтобы Play отклонял любой запрос, в котором тип мультимедиа не указан как JSON в заголовке запроса.

В учебнике есть хороший пример этого. http://www.playframework.com/documentation/2.0/JavaJsonRequests

Читай, где написано...

@BodyParser.Of(Json.class)
public static index sayHello() {
  String name = json.findPath("name").getTextValue();
  if(name == null) {
    return badRequest("Missing parameter [name]");
  } else {
    return ok("Hello " + name);
  }
}

Примечание. В этом случае HTTP-ответ 400 будет автоматически возвращен для запросов, отличных от JSON.

Почему он возвращает ошибку HTTP 400, неверный запрос, а не ошибку HTTP 415, неподдерживаемый тип носителя?

Есть ли способ изменить это поведение?


person Marc M.    schedule 06.10.2013    source источник
comment
Я не уверен, что они говорят о заголовке или содержании. Ответ 400 выглядит нормально, если заголовок установлен в json, но содержимое находится в другом формате. Если речь идет о заголовке, то вы правы, 415 кажется более подходящим. Вы проверили его и увидели неправильный ответ? Если да, вы можете отправить отчет об ошибке, если его еще нет.   -  person kapex    schedule 06.10.2013
comment
Просьба Капепа о разъяснении хороша. Если вы установили Content-header в своем запросе на application/json и получили 400 за допустимый json, значит, вы обнаружили ошибку в промежуточном программном обеспечении BodyParser. Если ваш JSON искажен или заголовок не отправлен, 400 в порядке. Возможное исправление состоит в том, чтобы, возможно, создать собственную аннотацию анализа JSON для тела (возможно, путем расширения существующего анализатора тела), хотя это кажется излишним.   -  person Ray Toal    schedule 06.10.2013
comment
Я думаю, что я всегда получал 400, позвольте мне проверить. Спасибо, отличный момент.   -  person Marc M.    schedule 07.10.2013


Ответы (1)


Вы можете вернуть собственный HTTP-ответ с помощью метода status(int, String):

return status(415, "The only supported content type is application/json");
person aaberg    schedule 06.10.2013
comment
Если я неправильно понимаю 415, я не уверен, что отсутствующий параметр или искаженный JSON будет составлять 415. request().body().asJson(); Может возвращать значение null по многим причинам. JSON может быть неправильно сформирован, но заголовок Content-type по-прежнему оценивается как application/json, поэтому вы получаете не неподдерживаемый носитель, а искаженный. - person Marc M.; 06.10.2013
comment
Я думаю, ответчик имел в виду, что вы можете вернуть 415 непосредственно из своего кода, но просто не нашли времени, чтобы показать новое сообщение об ошибке. Я взял на себя смелость отредактировать ответ. Надеюсь, все в порядке, @aaberg. - person Ray Toal; 07.10.2013
comment
Нет проблем @RayToal :) - person aaberg; 07.10.2013