2015-12-20 17 views
5

Sto utilizzando Retrofit per inviare alcuni dati al mio back-end. Devo inviare 3 stringhe e un oggetto posto personalizzato. Ecco quello che sto facendo:Utilizzare i parametri @Field e @Body in Retrofit insieme

@POST("/post/addphoto/") 
    public void addImage(@Field("image_url") String url, @Field("caption") String caption, @Field("google_place_id") String placeId, @Body Place place, Callback<UploadCallBack> response); 

Con questo, sto ottenendo questo errore:

@Field parameters can only be used with form encoding. 

E quando uso @FormUrlEncoded, in questo modo:

@FormUrlEncoded 
@POST("/post/addphoto/") 
     public void addImage(@Field("image_url") String url, @Field("caption") String caption, @Field("google_place_id") String placeId, @Body Place place, Callback<UploadCallBack> response); 

ottengo questo errore :

@FormUrlEncoded or @Multipart can not be used with @Body parameter. 

Come posso farlo funzionare?

+0

Tiwari, si può sapere se si desidera image_url essere aggiunto a/post/URL di addphoto? – cgr

+0

@cgr No, non voglio aggiungerlo. In realtà, image_url è l'URL di un'immagine di Facebook che voglio archiviare in back-end insieme ad altri campi. L'oggetto Place è ciò che ottengo per la posizione associata a quell'immagine, estratta da Facebook. –

+0

per quanto ne so, è necessario considerare la situazione come se si avesse solo 1 posto per contenere i dati nella richiesta, sarà RAW (corpo) o Form-shaped (FormUrlEncoded + Part) quindi qui è come stai provando a mixare 2 strutture dati in un posto, non è possibile farlo – Yazan

risposta

2

Infine, ha funzionato. @Body e @Field non possono essere usati insieme. Se @Body viene utilizzato, dovrebbe essere l'unico parametro e non può essere combinato con @FormUrlEncode o @MultiPart. Quindi abbandonò quell'idea. Un'altra opzione era usare solo @Field e inviare l'oggetto Place come una stringa JSON.

Ecco quello che ho fatto per l'interfaccia API:

@POST("/post/addphoto/") 
    public void addImage(@Field("image_url") String url, @Field("caption") String caption, @Field("google_place_id") String placeId, @Field("facebook_place") String place, Callback<UploadCallBack> response); 

e in questo modo ho creato il valore da inviare per facebook_place campo:

Place place = ... 
Gson gson = new GsonBuilder().disableHtmlEscaping().create(); 
String placeJSON = gson.toJson(place); 
Problemi correlati