7

POSTを含むリクエストを作成しようとしてmultipart-form-dataいますNT Credentials。認証要求によりPOSTが再送信され、繰り返し不可能なエンティティ例外が発生します。

MultipartContentで生成されたエンティティをラップしようとしましたBufferedHttpEntityが、スローしNullPointerExceptionsますか?

final GenericUrl sau = new GenericUrl(baseURI.resolve("Record"));
final MultipartContent c = new MultipartContent().setMediaType(MULTIPART_FORM_DATA).setBoundary("__END_OF_PART__");
final MultipartContent.Part p0 = new MultipartContent.Part(new HttpHeaders().set("Content-Disposition", format("form-data; name=\"%s\"", "RecordRecordType")), ByteArrayContent.fromString(null, "C_APP_BOX"));
final MultipartContent.Part p1 = new MultipartContent.Part(new HttpHeaders().set("Content-Disposition", format("form-data; name=\"%s\"", "RecordTitle")), ByteArrayContent.fromString(null, "JAVA_TEST"));
c.addPart(p0);
c.addPart(p1);

のドキュメントはByteArrayContent言う

バイト配列の内容に基づいて反復可能な入力ストリームを生成する AbstractInputStreamContent の具体的な実装。

すべての部分を再現可能にしても、問題は解決しません。このコードは を System.out.println("c.retrySupported() = " + c.retrySupported());出力するためc.retrySupported() = trueです。

次のドキュメントを見つけました。

1.1.4.1. 反復可能なエンティティ エンティティは反復可能である場合があります。つまり、そのコンテンツを複数回読み取ることができます。これは、自己完結型のエンティティ (ByteArrayEntity や StringEntity など) でのみ可能です。

文字列の内容を抽出して、メディア タイプの に変換MultipartContentしましたが、同じエラーが発生します。ByteArrayContentmulti/part-form

しかし、私が試して呼び出すと、まだ次の例外が発生しますrequest.execute()

Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity.

ApacheHttpTransportでは、反復可能なエンティティを作成するよう説得するにはどうすればよいでしょうか?

4

2 に答える 2

5

から継承したすべてのクラスを変更して、コードが入力されたときに繰り返し可能なコンテンツが正しく作成されるHttpContentように、それらが正しく報告されるようにする必要がありました。.retrySupported()ApacheHttpTransport

それが私が使用していたものであるため、変更はバージョンに対して行われました1.20.0devブランチに対してプル リクエストを送信しているHEADので、これまたはこれのいくつかのバージョンが次のリリースに含まれることを願っています。

マージする必要がある変更は次のとおりです。

于 2015-12-03T18:35:37.690 に答える
0

マルチパート エンティティのすべてのパートのコンテンツの長さがわかっている場合 (負でない値として返される場合)、エンティティは反復可能として扱われます。マルチパート エンティティを再現可能にする最も簡単な方法は、そのすべてのパーツを再現可能にすることです。

于 2015-11-26T09:24:38.583 に答える