Перезагрузите @body с @multipart, имеющим проблему

Image Multipart в объекте типа класса.

Случай 1. (Что я сделал)

Параметры обслуживания:

{"id":"1","name":"vishal","image/file":""} 

В то время мой API Retrofit

 @Multipart @POST("webservice") Call<SignUpResp> loadSignupMultipart(@Part("description") RequestBody description, @Part MultipartBody.Part file, @QueryMap HashMap<String, String> params); 

Case 2. (Где у меня проблема) с @Body class<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); 

Я не знаю почему, но он возвращает ошибку, например:

«Параметры @Body нельзя использовать с формой или многочастной кодировкой»

Любая помощь будет оценена.

Solutions Collecting From Web of "Перезагрузите @body с @multipart, имеющим проблему"

Измените свой метод на

 @Multipart @POST("users/{id}/user_photos") Call<models.UploadResponse> uploadPhoto(@Path("id") int userId, @PartMap Map<String, RequestBody> params); 

Теперь, чтобы создать параметры запроса,

 //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, чтобы получить подсказку при отправке файла изображения с запросом.

Как простой способ, я сделал следующее:

Я тестировал , меняя

 Call<Result> resultCall = service.uploadImage(body); 

в

Call<Result> resultCall = service.uploadImage(body, result); Где результат

Класс Result.java (ответ) моего API:

 public class Result { @SerializedName("result") @Expose private String result; public String getValue() { return value; } public void setValue(String value) { this.value = value; } @SerializedName("value") @Expose private String value; /** * @return The result */ public String getResult() { return result; } /** * @param result The result */ public void setResult(String result) { this.result = result; } } 

И создал объект вроде:

 Result result = new Result(); result.setResult("success"); result.setValue("my value"); 

Вы можете изменить свой класс в соответствии с вашими потребностями, а затем передать объект при отправке запроса. Таким образом, ваш класс ApiService будет выглядеть так:

ApiService.java

 /** * @author Pratik Butani on 23/4/16. */ public interface ApiService { /* Retrofit get annotation with our URL And our method that will return us the List of Contacts */ @Multipart @POST("upload.php") Call<Result> uploadImage(@Part MultipartBody.Part file, @Part("result") Result result); } 

И мой PHP-код:

 <?php $file_path = ""; $var = $_POST['result']; //here I m getting JSON $file_path = $file_path . basename( $_FILES['uploaded_file']['name']); if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path)) { $result = array("result" => "success", "value" => $var); } else{ $result = array("result" => "error"); } echo json_encode($result); ?> 

Надеюсь, это поможет вам. Спасибо.

Мы можем добавить все параметры запроса в multipart body builder с указанным типом, как показано ниже в одном файле изображения. Я установил мультиплексный multipart/form-data типа носителя, а также другой параметр, который я установил для типа text/plain синтаксического анализа text/plain . Этот строитель построит, чтобы сделать Multipart Body и может отправить с помощью аннотации тела в многочастном теле.

 @Multipart @POST("user/update") Call<ResponseBody> addDocument(@@Part MultipartBody file); final MultipartBody.Builder requestBodyBuilder = new MultipartBody.Builder() .setType(MultipartBody.FORM); requestBodyBuilder.addFormDataPart("doc_image_file", imageFile.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), imageFile)); requestBodyBuilder.addFormDataPart("user_id", null, RequestBody.create(MediaType.parse("text/plain"),"12")); requestBodyBuilder.addFormDataPart("doc_name", null, RequestBody.create(MediaType.parse("text/plain"),"myfile")); requestBodyBuilder.addFormDataPart("doc_category", null, RequestBody.create(MediaType.parse("text/plain"),category)); requestBodyBuilder.addFormDataPart("doc_image_file", imageFile.getName(),RequestBody.create(MediaType.parse("multipart/form-data"),imageFile)); requestBodyBuilder.addFormDataPart("doc_text_content", null, RequestBody.create(MediaType.parse("text/plain"),body)); RequestBody multipartBody = requestBodyBuilder.build(); 

Вы также можете использовать Map с RequestBody как значение и строку в качестве ключей для добавления параметров, и вы можете отправить их с помощью Multipart и PartMap .

Проверьте следующий код, надейтесь, что это поможет:

 @Multipart @POST("/add") Call<ResponseBody> addDocument(@PartMap Map<String,RequestBody> params); Map<String, RequestBody> map = new HashMap<>(); map.put("user_id", RequestBody.create(MediaType.parse("multipart/form-data"), SessionManager.getInstance().getCurrentUserId())); map.put("doc_name", RequestBody.create(MediaType.parse("multipart/form-data"), CommonUtils.removeExtension(textFile.getName()))); map.put("doc_category", RequestBody.create(MediaType.parse("multipart/form-data"), category)); map.put("doc_image_file", RequestBody.create(MediaType.parse("multipart/form-data"), imageFile)); map.put("doc_text_content", RequestBody.create(MediaType.parse("multipart/form-data"), body)); map.put("doc_update_time", RequestBody.create(MediaType.parse("multipart/form-data"), "" + new Date(textFile.lastModified()))); 

Просто следуйте за тем, как веб-браузер делает multipart. Они кладут вложенные ключи в «[]» и также дают ключ к изображениям.

 Call<SubmitLevel1Part2IconResp> loadLevel1halfIconswithImage(@Part("headerdata[relation][icon_type]") RequestBody icon_type, @Part("headerdata[relation][name]") RequestBody name, @Part MultipartBody.Part file); 

И затем в java

  // MultipartBody.Part is used to send also the actual filename MultipartBody.Part body = MultipartBody.Part.createFormData("headerdata[relation][relative_image]", fileUpload.getName(), requestFile); call = service.loadLevel1halfIconswithImage(icon_type, name, body); 
 Here is my json request format is : { "task":{ "category_id":"1", "price":"10", "description":"1", "task_videos_attributes":[ { "link":"video file goes here", "size":"100x100" } ] } } // my request becomes HashMap<String, RequestBody> task = new HashMap(); task.put("task[category_id]", createPartFromString(categoryId)); task.put("task[price]", createPartFromString("" + etPrice.getText().toString())); task.put("task[description]", createPartFromString("" + etDescription.getText().toString())); // for videos file list final List<MultipartBody.Part> body = new ArrayList<>(); for (int i = 0; i < videos.size(); i++) { task.put("task[task_videos_attributes][" + i+ "][size]", createPartFromString("100x100")); File videoFile = new File(videos.get(i)); RequestBody requestBody = RequestBody.create(MediaType.parse("video/mp4"), videoFile); MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("task[task_videos_attributes][" + i + "][link]", videoFile.getName(), requestBody); body.add(fileToUpload); } // here is a final call new RestClient(this).getInstance().get().postTask(body, task).enqueue(callback); // This function converts my string to request body @NonNull private RequestBody createPartFromString(String descriptionString) { if (descriptionString == null) return RequestBody.create(MultipartBody.FORM, ""); return RequestBody.create( MultipartBody.FORM, descriptionString); } 

Надеюсь, это поможет вам …