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()); 
  }
}
Другие вопросы по тегам