POST-запрос с большим телом получен пустым на стороне сервера
При выдаче POST
запрос с большим телом на мой метод действия Play Framework, я получаю null
при извлечении данных. Если тело довольно маленькое, я могу получить данные просто отлично.
Вот пример короткого набора данных:
{
"creator": "zoltan",
"sport": "hike",
"geometry": [
{
"time": "2009-07-10 12:56:10 +0000",
"x": 10.275514,
"y": 47.514749,
"z": 756.587
},
{
"time": "2009-07-10 12:56:19 +0000",
"x": 10.275563,
"y": 47.514797,
"z": 757.417
}
]
}
Когда я выпускаю POST
запрос с этим JSON в теле, все отлично работает. Однако, если я добавлю еще много (~4000) точек в geometry
массив, я получаю null
в действии.
Вот мой метод действия:
@Transactional
//@BodyParser.Of(Json.class) // tried with this as well
public static Result createTour() {
LOG.debug("Raw request body: " + request().body().asText());
JsonNode node = request().body().asJson();
LOG.debug("JSON request body: " + node);
TourDto tourDto;
try {
tourDto = jsonToTour(node);
int id = TourDataAccessUtils.create(tourDto);
return created(toJson(id));
} catch (JsonProcessingException e) {
LOG.error("While parsing JSON request.", e);
return Results.badRequest(
toJson(Throwables.getRootCause(e).getMessage()));
}
}
Я пытался использовать Advanced REST Client в Chrome и ċurl
отправить запрос, оба не удалось.
В чем может быть проблема? Может быть, мне нужно включить Content-Lenght
заголовок для больших запросов? Если да, то как я могу вручную рассчитать его для произвольных данных JSON?
1 ответ
Пожалуйста, проверьте документацию PlayFramework. Они отметили, что максимальная длина запроса по умолчанию составляет 100 КБ:
Максимальная длина контента
Текстовые синтаксические анализаторы тела (такие как text, json, xml или formUrlEncoded) используют максимальную длину контента, потому что они должны загружать весь контент в память.
Существует длина содержимого по умолчанию (по умолчанию 100 КБ).
Совет: Размер содержимого по умолчанию можно определить в application.conf:
parsers.text.maxLength = 128K
Вы также можете указать максимальную длину содержимого с помощью аннотации @BodyParser.Of:
// Accept only 10KB of data.
@BodyParser.Of(value = BodyParser.Text.class, maxLength = 10 * 1024)
pulic static Result index() {
if(request().body().isMaxSizeExceeded()) {
return badRequest("Too much data!");
} else {
ok("Got body: " + request().body().asText());
}
}