我有一个由邮递员生成的查询,用于将文件和一些信息发送到我的服务器。它在我的程序中运行得很好。
MediaType mediaType = MediaType.parse("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
RequestBody body = RequestBody.create(mediaType,
"------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"filename\"; filename=\"C:\\testFile.doc\"\r\nContent-Type: application/msword\r\n\r\n\r\n" +
"------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"id\"\r\n\r\n7\r\n" +
"------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"type\"\r\n\r\n3\r\n" +
"------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"note\"\r\n\r\nafejhejfh\r\n" +
"------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"list[0][id]\"\r\n\r\n1\r\n" +
"------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"list[0][is_checked]\"\r\n\r\n0\r\n" +
"------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"list[0][filename]\"; filename=\"C:\\test.pdf\"\r\nContent-Type: application/pdf\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--");
改造方法:
@Headers({"Accept: application/json", "content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"})
@POST("api/save")
Call<SaveResponse> save(@Header("Authorization") String authorization,
@Body RequestBody map);
第一次面对with边界,需要将上面的示例更改为动态创建的Partmap。因为需要在循环中添加来自另一个列表的一些参数。我尝试用下面的例子生成partmap,并像在api文档中写的那样将"WebKitFormBoundary7MA4YWxkTrZu0gW“添加到头文件中。
--header 'Authorization: {{authorization}}' \
--header 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
下面的代码从服务器返回422错误
查询映射。
Map<String, RequestBody> requestMap = new HashMap<>();
RequestBody file = null;
if (file != null) {
file = RequestBody.create(MediaType.parse("application/msword"), testFile);
requestMap.put("filename", file);
}
RequestBody id = RequestBody.create(MediaType.parse("text/plain"), "18");
RequestBody type = RequestBody.create(MediaType.parse("text/plain"), "3");
RequestBody notes = RequestBody.create(MediaType.parse("text/plain"), notesTextArea.getText());
RequestBody list0id = RequestBody.create(MediaType.parse("text/plain"), "1");
RequestBody list0is_checked = RequestBody.create(MediaType.parse("text/plain"), "0");
RequestBody pdfFilename = null;
if (pdfFile != null) {
pdfFilename = RequestBody.create(MediaType.parse("application/pdf"), pdfFile);
requestMap.put("list[0][filename]", pdfFilename );
}
requestMap.put("file", file);
requestMap.put("id", id);
requestMap.put("type", type);
requestMap.put("notes", notes);
requestMap.put("list[0]id", list0id);
requestMap.put("list[0]is_checked", list0is_checked);
改造方法:
@Multipart
@Headers({"Accept: application/json", "content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"})
@POST("api/save")
Call<SaveResponse> save(@Header("Authorization") String authorization,
@PartMap Body map);
因此,我需要任何帮助来理解如何将WebKitFormBoundary7MA4YWxkTrZu0gW和其他需要的信息放到我的零件图中。
提前感谢您的帮助
附注:新年快乐的程序员)
发布于 2018-01-05 09:46:35
所以我用这种方式解决了这个问题
向我的服务器发出请求。request without header "content-type: multipart/form-data;接口文档中描述的boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"“。
@Multipart
@Headers({"Accept: application/json"})
@POST("api/save")
Call<SaveResponse> save(@Header("Authorization") String authorization,
@PartMap Map<String, RequestBody> map,
@Part List<MultipartBody.Part> files);
动态填充我们的查询
private void fillQuery() {
fileListPart = new ArrayList<>();
MultipartBody.Part filePart = null;
if (mainFile != null) {
if (mainFile.getName().endsWith(".pdf")) {
filePart = MultipartBody.Part.createFormData("filename", mainFile.getName(), RequestBody.create(MediaType.parse("application/pdf"), mainFile));
} else if (mainFile.getName().endsWith(".doc") || mainFile.getName().endsWith(".docx")) {
filePart = MultipartBody.Part.createFormData("filename", mainFile.getName(), RequestBody.create(MediaType.parse("application/msword"), mainFile));
}
fileListPart.add(filePart);
}
requestBodyMap = new HashMap<>();
RequestBody id = RequestBody.create(MediaType.parse("text/plain"), "id");
RequestBody type = RequestBody.create(MediaType.parse("text/plain"), "type");
RequestBody notes = RequestBody.create(MediaType.parse("text/plain"), "notes");
requestBodyMap.put("id", id);
requestBodyMap.put("type", type);
requestBodyMap.put("notes", notes);
for (int i = 0; i < dynamicCollectionWirhParameters.size(); i++) {
String prefix = "list[";
String checkIdParameter = "][id]";
String checkIsCheckedParameter = "][is_checked]";
String checkFileParameter = "][filename]";
RequestBody checklist_id = RequestBody.create(MediaType.parse("text/plain"), "2");//id
RequestBody is_checked = RequestBody.create(MediaType.parse("text/plain"), "1"); // server convert 1 and 0 to boolean value
requestBodyMap.put(prefix + i + checkIdParameter, checklist_id);
requestBodyMap.put(prefix + i + checkIsCheckedParameter, is_checked);
if (dynamicCollectionFileCollection.get(i) != null) {
File tempFile = dynamicCollectionFileCollection.get(i);
filePart = null;
if (tempFile.getName().endsWith(".pdf")) {
filePart = MultipartBody.Part.createFormData(prefix + i + checkFileParameter, dynamicCollectionFileCollection.get(i).getName(), RequestBody.create(MediaType.parse("application/pdf"), dynamicCollectionFileCollection.get(i)));
} else if (dynamicCollectionFileCollection.get(i).getName().endsWith(".doc") || dynamicCollectionFileCollection.get(i).getName().endsWith(".docx")) {
filePart = MultipartBody.Part.createFormData(prefix + i + checkFileParameter, dynamicCollectionFileCollection.get(i).getName(), RequestBody.create(MediaType.parse("application/msword"), dynamicCollectionFileCollection.get(i)));
}
fileListPart.add(filePart);
}
}
}
并将我们的数据发送到服务器
private void saveDatas() {
fillQuery();
Call<SaveResponse> sendDatasCall = DependenciesStorage.getRetrofitService().save(
DependenciesStorage.getAuthorizationKey(),
requestBodyMap, fileListPart);
sendDatasCall.enqueue(new Callback<SaveResponse>() {
@Override
public void onResponse(Call<SaveResponse> call, Response<SaveResponse> response) {
if (response.isSuccessful()) {
} else {
}
}
@Override
public void onFailure(Call<SaveResponse> call, Throwable throwable) {
}
});
}
看起来很简单)但是我花了几乎两天的时间才找到它
https://stackoverflow.com/questions/48042641
复制