问题描述
服务参数:
{"id":"1","name":"vishal","image/file":""}
当时我的Retrofit的API
@Multipart @POST("webservice") Call<SignUpResp> loadSignupMultipart(@Part("description") RequestBody description, @Part MultipartBody.Part file, @QueryMap HashMap<String, String> params);
案例 2.(我有问题的地方)与 @Body 类<UploadwithImage>
{ "methodName":"submitLevel1Part2Icon", "userid":"150", "headerData":{ "fiction":{ "icon_type":"1", "icon_id":"3"}, "nonfiction":{ "icon_type":"2", "icon_id":"4"}, "relation":{ "icon_type":"3", "icon_id":"0", "name":"Ronak", "relative_image":"<File>", "relation_id":"3"}, "self":{ "icon_type":"4", "icon_id":"0"} } }
我正在尝试这个 API
@Multipart @POST("webservice") Call<SubmitLevel1Part2IconResp> loadLevel1halfIconswithImage(@Part("description") RequestBody description, @Part MultipartBody.Part file, @Body UploadwithImage uploadImage);
Java 端
/** * code for multipart */ // create RequestBody instance from file RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), fileUpload); // MultipartBody.Part is used to send also the actual filename MultipartBody.Part body = MultipartBody.Part.createFormData("methodName[headerData][relation][relative_image]", fileUpload.getName(), requestFile); // add another part within the multipart request String descriptionString = "hello, this is description speaking"; RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString); call = service.loadLevel1halfIconswithImage(description, body, levelOneHalfIcons);
我不知道为什么,但它返回如下错误:
I don't know why but it returns error like:
"@Body 参数不能与表单或多部分编码一起使用"
"@Body parameters cannot be used with form or multi-part encoding"
我们将不胜感激.
推荐答案
把你的方法改成
@Multipart @POST("users/{id}/user_photos") Call<models.UploadResponse> uploadPhoto(@Path("id") int userId, @PartMap Map<String, RequestBody> params);
现在创建您的请求参数,
Now to create your request parameters,
//All the String parameters, you have to put like Map<String, RequestBody> map = new HashMap<>(); map.put("methodName", toRequestBody(methodName)); map.put("userid", toRequestBody(userId)); map.put("relation", toRequestBody(relation)); map.put("icon_type", toRequestBody(iconType)); map.put("icon_id", toRequestBody(iconId)); map.put("name", toRequestBody(name)); map.put("relation_id", toRequestBody(relationId)); //To put your image file you have to do File file = new File("file_name"); RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), file); map.put("relative_image"; filename="some_file_name.png"", fileBody); // This method converts String to RequestBody public static RequestBody toRequestBody (String value) { RequestBody body = RequestBody.create(MediaType.parse("text/plain"), value); return body ; } //To send your request call = service.loadLevel1halfIconswithImage(description, params);
如果您不想使用 PartMap,您可以简单地将它们作为参数传递.检查我的答案 https://stackoverflow.com/a/37052548/1320616 以获取有关通过请求发送图像文件的一些线索.
In case you do not want to use PartMap, you can simply pass them as parameters. Check my answer https://stackoverflow.com/a/37052548/1320616 to get some clue on sending image file with request.