我正在完成一个使用okhttp与web服务进行通信的项目。
对于常规的GET和POST请求一切都很顺利,但我无法正确上传文件。
okhttp文档在这些方面非常缺乏,而我在这里或其他任何地方找到的所有内容似乎都不能在我的情况下工作。
这应该很简单:我必须同时发送文件和一些字符串值。但是我无法弄清楚如何做到这一点。
根据我找到的一些示例,我首先尝试了以下操作:
对于常规的GET和POST请求一切都很顺利,但我无法正确上传文件。
okhttp文档在这些方面非常缺乏,而我在这里或其他任何地方找到的所有内容似乎都不能在我的情况下工作。
这应该很简单:我必须同时发送文件和一些字符串值。但是我无法弄清楚如何做到这一点。
根据我找到的一些示例,我首先尝试了以下操作:
RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM)
.addFormDataPart("group", getGroup())
.addFormDataPart("type", getType())
.addFormDataPart("entity", Integer.toString(getEntity()))
.addFormDataPart("reference", Integer.toString(getReference()))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"task_file\""), RequestBody.create(MediaType.parse("image/png"), getFile()))
.build();
我收到了“400错误请求”的提示。
于是我尝试了 okhttp 的示例代码:
RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM)
.addPart(Headers.of("Content-Disposition", "form-data; name=\"group\""), RequestBody.create(null, getGroup()))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"type\""), RequestBody.create(null, getType()))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"entity\""), RequestBody.create(null, Integer.toString(getEntity())))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"reference\""), RequestBody.create(null, Integer.toString(getReference())))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"task_file\""), RequestBody.create(MediaType.parse("image/png"), getFile()))
.build();
同样的结果。
不知道还有什么尝试或者调试这个问题时需要查看什么。
使用以下代码完成请求:
// adds the required authentication token
Request request = new Request.Builder().url(getURL()).addHeader("X-Auth-Token", getUser().getToken().toString()).post(requestBody).build();
Response response = client.newCall(request).execute();
但我相信问题在于我构建请求体的方式。
我做错了什么?
编辑:顺便说一下,“getFile()”返回一个文件对象。其余参数都是字符串和整数。
RequestBody.create(MEDIA_TYPE_PNG, sourceFile)
中的sourceFile
是文件对象。 - Pratik ButaniMultipartBuilder
已经不存在了。 - zygimantus