2016-12-02 6 views
3

Hier verwende ich @Fields Daten mit @FormUrlEncoded Aber ich muss beide in der gleichen API @Part("user_image") RequestBody file mit @Multipart verwenden. Wie ist das möglich? Danke im Voraus. So senden Sie eine Bilddatei mit Retrofit (@Fields)

@FormUrlEncoded 
@POST("/datingapp/index.php/Webservice") 
Call<Result> signupUser(@Field("user_name") String name, 
          @Field("age") String age, 
          @Field("work") String work, 
          @Field("home_town") String home_town, 
          @Field("gender") String gender, 
          @Field("interest") String interest, 
          @Field("study") String study, 
          @Field("email") String email, 
          @Field("password") String password, 
          @Field("device_id") String device_id, 
          @Field("device_type") String device_type, 
          @Part("user_image") RequestBody file, 
          @Field("signup") String signup); 
+0

Sie können ein Bild in Form von Base64-String senden. Ich habe Retrofit nie benutzt, aber schaut mal [HIER] (http://stackoverflow.com/questions/22787585/android-retrofit-base64-body) und [HIER] (http://stackoverflow.com/questions/32009612/retrofit) -send-base64-codierte-string-in-parameter) –

Antwort

2

Http Protokoll nicht zulassen 2 Content-Type in der gleichen Anfrage. So müssen Sie sich entscheiden:

  • application/x-www-form-urlencoded
  • multipart/form-data

Sie verwenden application/x-www-form-urlencoded durch Annotation mit @FormUrlEncoded um Bild zu senden Sie müssen wandle die gesamte Datei in Text um (zB base64). wie diese

@Multipart 
@POST("/datingapp/index.php/Webservice") 
Call<Result> signupUser(@Part("user_name") String name, 
         @Part("age") String age, 
         @Part("work") String work, 
         @Part("home_town") String home_town, 
         @Part("gender") String gender, 
         @Part("interest") String interest, 
         @Part("study") String study, 
         @Part("email") String email, 
         @Part("password") String password, 
         @Part("device_id") String device_id, 
         @Part("device_type") String device_type, 
         @Part("user_image") RequestBody file, 
         @Part("signup") String signup); 
+0

ThanQ Sir !!! Es klappt! : D –

+0

in der PUT-Methode ist es möglich ??? @Lionel Briand –

+0

@KoVartthan Das Verhalten ist das gleiche wie POST so technisch ja –

0
@Multipart 
@POST("/datingapp/index.php/Webservice") 
Call<Result> signupUser(@PartMap Map<String,String> queryMap, 
          @Part("user_image") RequestBody file); 

Hier die @PartMap enthält die anderen Parameter erforderlich, die nichts anderes als eine HashMap enthält, Schlüssel und Werte z ist,

LinkedHashMap<String,String> map = new LinkedHashMap<String,String>(); 
map.put("user_name",username); 

wie oben und so weiter.

-1

Make-API-Aufruf:

Ein besserer Ansatz wäre die Verwendung multipart/form-data durch Beschreiben Sie Ihre Anfrage so sein die Form von Schlüssel und Wert

@POST("/datingapp/index.php/Webservice") 
@FormUrlEncoded 
@Multipart 
Call<Result> signupUser(@FieldMap LinkedHashMap<String, String> data,@Part RequestBody file); 

und geben Ihre Daten in

LinkedHashMap<String, String> data = new LinkedHashMap<>(); 
data.put("user_name", user_name); 
data.put("age", age); 
data.put("work", work); 
data.put("work", work); 
data.put("gender", gender); and so on .... 

für Bild in bekommen Multiparts:

RequestBody file= RequestBody.create(MediaType.parse("image/jpeg"), file); 

letzten Aufruf der api treffen:

Call<Result> call = apiService.signupUser(data ,file); 

Hope this funktioniert :)

+1

'@ Multipart' Annotation kann nicht mit' @ FormUrlEncoded' verwendet werden, und '@ FieldMap' muss' @ PartMap' sein – Ninja

Verwandte Themen