Retrofti 2:Post 多个文件,其中包含部分名称以及 @FormUrlEncoded formData
Retrofti 2: Post multiple files with part names along with @FormUrlEncoded formData
我有一个相当复杂的 POST 我正在尝试使用 Retrofit2 制作。
@Multipart
@FormUrlEncoded
@POST("post")
Call<JSONObject> createPost(
@Field("name") String name,
@Part("media_1") MultipartBody.Part mediaOne,
@Part("media_2") MultipartBody.Part mediaTwo,
@Part("media_3") MultipartBody.Part mediaThree,
@Part("media_4") MultipartBody.Part mediaFour,
@Part("media_5") MultipartBody.Part mediaFive,
@Header("secret_key") int secretKey
);
它包含多个方面,例如一个名为 "name" 的参数,我通常会认为 post 带有 @Field 和 @FormUrlEncoded。我知道我不能同时拥有@Multipart 和@FormUrlEncoded,所以我想我想从上面的代码示例中删除@FormUrlEncoded 并将@Field 替换为@Part。这是正确的吗?
然后,我得到异常“使用 MultipartBody.Part 的@Part 参数不得在注释中包含零件名称”。但这不像我可以删除 @Part("media_1") 等,因为这些部分名称确保媒体文件上传到正确的位置。这里的解决方案是什么?
这是我做过的最复杂的 Retrofit2 调用。感谢您花时间审阅我的问题。
这里是我使用 Retrofit2 调用的地方,以防将其用作上下文有帮助:
file0 = FileUtils.getFile(filePath);
requestFile0 = RequestBody.create(MediaType.parse("multipart/form-data"), file0);
body0 = MultipartBody.Part.createFormData("image0", file0.getName(), requestFile0);
file1 = FileUtils.getFile(constructedLog.getLogImageLocations().get(1));
requestFile1 = RequestBody.create(MediaType.parse("multipart/form-data"), file1);
body1 = MultipartBody.Part.createFormData("logImage1", file1.getName(), requestFile1);
//etc for file2, file3, file4
Call<JSONObject> call = apiService.getApi().createPost(
getName(),
body0,
body1,
body2,
body3,
body4,
secretKey
);
API 调用的代码:
@Multipart
@POST("post")
Call<JSONObject> createPost(
@Part("name") RequestBody name,
@Part MultipartBody.Part mediaOne,
@Part MultipartBody.Part mediaTwo,
@Part MultipartBody.Part mediaThree,
@Part MultipartBody.Part mediaFour,
@Part MultipartBody.Part mediaFive,
@Header("secret_key") int secretKey
);
File file = new File(yourpathhere);
body0 = MultipartBody.Part.createFormData("media_1", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));
RequestBody name = RequestBody.create(MediaType.parse("text/plain"), yourString);
Call<JSONObject> call = apiService.getApi().createPost(
name,
body0,
body1,
body2,
body3,
body4,
secretKey
);
本质上,问题是我在 createFormData() 和 @Part 中都声明了名称。你只能做其中之一。
我还将第一个参数更改为 RequestBody。如果你只是尝试使用一个字符串,至少在我的例子中,API 会认为它应该有一个双引号。
Link 该解决方案:Retrofit 2.0-beta-2 is adding literal quotes to MultiPart values
我有一个相当复杂的 POST 我正在尝试使用 Retrofit2 制作。
@Multipart
@FormUrlEncoded
@POST("post")
Call<JSONObject> createPost(
@Field("name") String name,
@Part("media_1") MultipartBody.Part mediaOne,
@Part("media_2") MultipartBody.Part mediaTwo,
@Part("media_3") MultipartBody.Part mediaThree,
@Part("media_4") MultipartBody.Part mediaFour,
@Part("media_5") MultipartBody.Part mediaFive,
@Header("secret_key") int secretKey
);
它包含多个方面,例如一个名为 "name" 的参数,我通常会认为 post 带有 @Field 和 @FormUrlEncoded。我知道我不能同时拥有@Multipart 和@FormUrlEncoded,所以我想我想从上面的代码示例中删除@FormUrlEncoded 并将@Field 替换为@Part。这是正确的吗?
然后,我得到异常“使用 MultipartBody.Part 的@Part 参数不得在注释中包含零件名称”。但这不像我可以删除 @Part("media_1") 等,因为这些部分名称确保媒体文件上传到正确的位置。这里的解决方案是什么?
这是我做过的最复杂的 Retrofit2 调用。感谢您花时间审阅我的问题。
这里是我使用 Retrofit2 调用的地方,以防将其用作上下文有帮助:
file0 = FileUtils.getFile(filePath);
requestFile0 = RequestBody.create(MediaType.parse("multipart/form-data"), file0);
body0 = MultipartBody.Part.createFormData("image0", file0.getName(), requestFile0);
file1 = FileUtils.getFile(constructedLog.getLogImageLocations().get(1));
requestFile1 = RequestBody.create(MediaType.parse("multipart/form-data"), file1);
body1 = MultipartBody.Part.createFormData("logImage1", file1.getName(), requestFile1);
//etc for file2, file3, file4
Call<JSONObject> call = apiService.getApi().createPost(
getName(),
body0,
body1,
body2,
body3,
body4,
secretKey
);
API 调用的代码:
@Multipart
@POST("post")
Call<JSONObject> createPost(
@Part("name") RequestBody name,
@Part MultipartBody.Part mediaOne,
@Part MultipartBody.Part mediaTwo,
@Part MultipartBody.Part mediaThree,
@Part MultipartBody.Part mediaFour,
@Part MultipartBody.Part mediaFive,
@Header("secret_key") int secretKey
);
File file = new File(yourpathhere);
body0 = MultipartBody.Part.createFormData("media_1", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));
RequestBody name = RequestBody.create(MediaType.parse("text/plain"), yourString);
Call<JSONObject> call = apiService.getApi().createPost(
name,
body0,
body1,
body2,
body3,
body4,
secretKey
);
本质上,问题是我在 createFormData() 和 @Part 中都声明了名称。你只能做其中之一。
我还将第一个参数更改为 RequestBody。如果你只是尝试使用一个字符串,至少在我的例子中,API 会认为它应该有一个双引号。
Link 该解决方案:Retrofit 2.0-beta-2 is adding literal quotes to MultiPart values