0

Android で Jersey Client API を使用した Multipart-form-data POST リクエストに問題があります。私はウェブ上のさまざまな例に従ってきましたが、実装に関してはすべてかなり似ています。

Client client = createClientInstance();
WebResource r = client.resource(BASEURL).path("DataUpload");
ClientResponse post;
try {
    FormDataMultiPart multiPart = new FormDataMultiPart();
    multiPart.field("account", account);
    multiPart.field("checksum", checksum);
    multiPart.bodyPart(new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE));
    post = r.type(MediaType.MULTIPART_FORM_DATA)
        .accept(MediaType.TEXT_PLAIN)
        .post(ClientResponse.class, multiPart);

} catch (ClientHandlerException e) {
    Log.e(TAG, e.getLocalizedMessage());
} finally {
    client.destroy();
}

デバイスでこのコードを実行すると、例外が表示されます。

javax.ws.rs.WebApplicationException: java.lang.IllegalArgumentException: No MessageBodyWriter for body part of type 'java.io.File' and media type 'application/octet-stream'

Jersey は、追加の構成なしで File オブジェクトを処理することになっていると思いました。bodypart 行を削除すると、Jersey は要求を行うことができますが、それはこのポイントを排除します。

ビルドパスにこれらのライブラリがあります (これらは Maven で取り込まれました)。

  • ジャージ-クライアント-1.14
  • ジャージコア-1.14
  • ジャージ-マルチパート-1.14
  • mimepull-1-6
4

1 に答える 1

0

次の 2 つのことをお勧めします。

  1. FileDataBodyPart 構造から MIME タイプを削除して、Jersey が MIME タイプを見つけられるかどうかを確認します。

    multiPart.bodyPart(new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE));

  2. マルチパートボディライター(おそらくメソッド内)についてクライアント構成に伝えますcreateClientInstance()

    com.sun.jersey.api.client.config.ClientConfig config = new com.sun.jersey.api.client.config.DefaultClientConfig();
    config.getClasses().add(MultiPartWriter.class);
    client = Client.create(config);
    

それが役立つことを願っています。

于 2012-10-22T03:23:52.657 に答える