2016-03-30 9 views
3

I verwendet POST-Anfrage an den Server mit Retrofit2 senden:senden json und Datei mit Retrofit2

@POST("goals") 
    Call<Void> postGoal(@Body Goal goal); 

wo Tor war Objekt mit einigen String/Integer Felder aus.

Jetzt muss ich dort eine Fotodatei hinzufügen. Ich weiß, dass ich zu Schalter benötigenMehrteiliger verwenden:

@Multipart 
    @POST("goals") 
    Call<Void> postGoal(
      @Part("picture") RequestBody picture 
      ); 

//... 
//Instantaining picture 
RequestBody.create(MediaType.parse("image/*"), path) 

Aber wie soll ich vorherigen Felder hinzufügen? Gibt es eine Möglichkeit, ein ganzes Goal-Objekt hinzuzufügen, ohne es für Felder zu teilen?

+1

Haben Sie eine Lösung gefunden? – Amir

Antwort

0

können Sie fügen @Part mit Ihnen Ziel wie dieses

@Multipart 
    @POST("goals") 
    Call<Void> postGoal(
      @Part("picture") RequestBody picture, 
      @Part("goal") RequestBody goal 
      ); 

    //... 
    //Instantaining picture 
    RequestBody.create(MediaType.parse("image/*"), path) 

Sie können weitere Informationen finden: retrofit-2-how-to-upload-files-to-server

0

für json Senden und Datei, die Sie so etwas wie dieses folgen kann.

Jetzt konvertieren Sie Ihr Objekt, das Sie als JSON senden möchten, in Json mit Gson. so.

String json = new Gson().toJson(new Goal()); 

    File file = new File(path); 
         RequestBody requestFile = 
           RequestBody.create(MediaType.parse("multipart/form-data"), file); 

         // MultipartBody.Part is used to send also the actual file name 
         MultipartBody.Part body = 
           MultipartBody.Part.createFormData("picture", file.getName(), requestFile); 

         // add another part within the multipart request 
         RequestBody jsonBody= 
           RequestBody.create(
             MediaType.parse("multipart/form-data"), json); 
         Retrofit retrofit = new Retrofit.Builder() 
           .baseUrl(url) 
           .addConverterFactory(GsonConverterFactory.create()) 
           .build(); 
         RestApi api = retrofit.create(RestApi.class); 
         Call<ResponseBody> call = api.upload(jsonBody, body); 
         call.enqueue(new Callback<ResponseBody>() { 
          @Override 
          public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
           Log.d("onResponse: ", "success"); 
          } 

          @Override 
          public void onFailure(Call<ResponseBody> call, Throwable t) { 
           Log.d("onFailure: ", t.getLocalizedMessage()); 
          } 
         }); 
Verwandte Themen