我在Android上使用Jersey客户端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引入):
答案 0 :(得分:0)
我可以建议尝试两件事:
从FileDataBodyPart构造中删除MIME类型,以查看Jersey是否可以找到默认为默认的mime类型:
multiPart.bodyPart(new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE));
告诉您的客户端配置有关多部分正文编写器(可能在您的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);
希望有所帮助。