3

При выдаче запроса POST с большим телом к ​​моему методу действия в платформе Play я получаю null при извлечении данных. Если тело довольно мало, я могу получить данные просто отлично.Запрос POST с большим телом, полученным пустым на стороне сервера

Вот образец короткий набор данных:

{ 
    "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 в хроме и ċurl отправить запрос, как не удалось.

В чем может быть проблема? Может быть, мне нужно включить заголовок Content-Lenght для больших запросов? Если да, то как я могу вручную вычислить его для любых данных JSON?

ответ

6

Пожалуйста, проверьте PlayFramework documentation, они упоминалось, что длина максимального по умолчанию для запроса является 100KB:

Максимальная длина содержимого

Текст на основе парсеры тела (например, текст, 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()); 
    } 
} 
+0

Да, я только что узнал об этом. Он работает сейчас. Спасибо, в любом случае. Примите и повысите на меня :) –

+1

Я хочу, чтобы 'request(). Body()' выбрал исключение, когда была превышена длина содержимого. Это действительно загадочно. –

Смежные вопросы