3

いくつかの文字列メッセージの詳細と添付ファイルを送信するという考えで、次のクライアント コードを使用して REST サービスを呼び出そうとしています。

ClientConfig config = new DefaultClientConfig();
config.getClasses().add(FormProvider.class);
Client client = Client.create(config);
WebResource webResource = client.resource("http://some.url/path1/path2");

File attachment = new File("./file.zip");

FormDataBodyPart fdp = new FormDataBodyPart(
            "content", 
            new ByteArrayInputStream(Base64.encode(FileUtils.readFileToByteArray(attachedLogs))),
            MediaType.APPLICATION_OCTET_STREAM_TYPE);
form.bodyPart(fdp);

ClientResponse response = webResource.type(MediaType.APPLICATION_FORM_URLENCODED).post(ClientResponse.class, form);     

私が対象としているサーバーは、Base64 でエンコードされたコンテンツを受け入れるため、File から ByteArray への追加の転送が必要になります。

また、クラス com.sun.jersey.core.impl.provider.entity.FormProvider は、「x-www-form-urlencoded」リクエストの生成と消費の両方で注目されていることがわかりました。

@Produces({"application/x-www-form-urlencoded", "*/*"})
@Consumes({"application/x-www-form-urlencoded", "*/*"})

しかし、それでも私は次のスタックトレースで終わります:

com.sun.jersey.api.client.ClientHandlerException: com.sun.jersey.api.client.ClientHandlerException: A message body writer for Java type, class com.sun.jersey.multipart.FormDataMultiPart, and MIME media type, application/x-www-form-urlencoded, was not found at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149) ~[jersey-client-1.9.1.jar:1.9.1]
at com.sun.jersey.api.client.Client.handle(Client.java:648) ~[jersey-client-1.9.1.jar:1.9.1]
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670) ~[jersey-client-1.9.1.jar:1.9.1]
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) ~[jersey-client-1.9.1.jar:1.9.1]
at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:563) ~[jersey-client-1.9.1.jar:1.9.1]

これについて何か助けはありますか?

4

2 に答える 2

4

クライアント側で何とか動作させることができました。問題は、ファイルを個別のメッセージ本文部分として送信することを強制していたのに対し、x-www-form-urlencoded は実際にはすべてのデータをクエリのパラメーターとしてパックしているということでした。

したがって、Jersey post メソッドを介して添付ファイルを送信する場合の作業クライアント コードは次のようになります。

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource webResource = client.resource("http://some.url/path1/path2");

MultivaluedMapImpl values = new MultivaluedMapImpl();
values.add("filename", "report.zip");
values.add("text", "Test message");
values.add("content", new String(Base64.encode(FileUtils.readFileToByteArray(attachedLogs))));
ClientResponse response = webResource.type(MediaType.APPLICATION_FORM_URLENCODED).post(ClientResponse.class, values);

私の場合、ファイルをエンコードされたバイト配列に変換するには、Apache Commons の Base64 エンコーダーが必要でした。これが一般的な要件かどうかはわかりません。

于 2012-05-22T07:57:26.813 に答える
1

Multipart/form-dataの代わりに使ってみてくださいapplication/x-www-form-urlencodedこのチュートリアルが役立つかもしれません。

于 2012-05-21T15:55:06.903 に答える