3

POSTPlay フレームワークのアクション メソッドに大きなボディのリクエストを発行すると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 を含むリクエストを発行すると、すべて正常に動作します。geometryただし、配列にさらに多く (〜 4000) のポイントを追加する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()));
    }
}

Chrome で高度な REST クライアントを使用しċurlてリクエストを送信しようとしましたが、どちらも失敗しました。

何が問題なのですか?Content-Lenght大規模なリクエストにヘッダーを含める必要があるのでしょうか? もしそうなら、どうすれば任意の JSON データに対して手動で計算できますか?

4

1 に答える 1

6

PlayFramework のドキュメントを確認してください。リクエストのデフォルトの最大長は100KB であると述べられています。

コンテンツの最大長

テキストベースの本文パーサー (text、json、xml、formUrlEncoded など) は、すべてのコンテンツをメモリにロードする必要があるため、コンテンツの最大長を使用します。

デフォルトのコンテンツ長があります (デフォルトは 100KB)。

ヒント: デフォルトのコンテンツ サイズは、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()); 
  }
}
于 2014-01-05T16:59:42.130 に答える