2016-05-10 36 views
11

Ho visto molte volte questa domanda e ho provato molte soluzioni ma senza risolvere il mio problema, sto provando a inviare un json in una richiesta POST usando il retrofit, non sono un esperto in programmazione in modo da poter perdere qualcosa di ovvio.Invio JSON in richiesta POST con retrofit

mio JSON è in una stringa e si presenta così:

{"id":1,"nom":"Hydrogène","slug":"hydrogene"} 

mia interfaccia (chiamato APIService.java) si presenta così:

@POST("{TableName}/{ID}/update/0.0") 
Call<String> cl_updateData(@Path("TableName") String TableName, @Path("ID") String ID); 

E il mio ClientServiceGenerator.java assomiglia a quello:

public class ClientServiceGenerator{ 
private static OkHttpClient httpClient = new OkHttpClient(); 

public static <S> S createService(Class<S> serviceClass, String URL) { 
    Retrofit.Builder builder = 
      new Retrofit.Builder() 
        .baseUrl(URL) 
        .addConverterFactory(GsonConverterFactory.create()); 

    Retrofit retrofit = builder.client(httpClient).build(); 
    return retrofit.create(serviceClass); 
}} 

E infine ecco il codice nella mia attività

APIService client = ClientServiceGenerator.createService(APIService.class, "http://mysiteexample.com/api.php/"); 
    Call<String> call = client.cl_updateData("atomes", "1"); 
    call.enqueue(new Callback<String>() { 
     @Override 
     public void onResponse(Response<String> response, Retrofit retrofit) { 
      if (response.code() == 200 && response.body() != null){ 
       Log.e("sd", "OK"); 
      }else{ 
       Log.e("Err", response.message()+" : "+response.raw().toString()); 
      } 
     } 

     @Override 
     public void onFailure(Throwable t) { 
      AlertDialog alertError = QuickToolsBox.simpleAlert(EditDataActivity.this, "updateFail", t.getMessage(), new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 
      alertError.show(); 
     } 
    }); 

Dimmi se hai bisogno di qualsiasi altra cosa, spero che qualcuno mi potrebbe aiutare.

EDIT non ne ha parlato prima volta, ma il mio JSON non saranno sempre con le stesse chiavi (id, nom, slug).

+0

Ho visto questo post, ma sembra che alcuni animali sono stati rimossi e tutto ciò che provarono fallito così vengo qui per trovare un'altra soluzione . – Teasel

risposta

12

In primo luogo è necessario creare un oggetto per rappresentare l'JSON è necessario:

public class Data { 
    int id; 
    String nom; 
    String slug; 

    public Data(int id, String nom, String slug) { 
     this.id = id; 
     this.nom = nom; 
     this.slug = slug; 
    } 
} 

Quindi, modificare il vostro servizio per essere in grado di inviare questo oggetto:

@POST("{TableName}/{ID}/update/0.0") 
Call<String> cl_updateData(@Path("TableName") String TableName, @Path("ID") String ID, @Body Data data); 

Infine, passare questo oggetto :

Call<String> call = client.cl_updateData("atomes", "1", new Data(1, "Hydrogène", "hydrogene")); 

UPD

Per essere in grado di inviare dati utilizzano Object invece di Data:

@POST("{TableName}/{ID}/update/0.0") 
Call<String> cl_updateData(@Path("TableName") String TableName, @Path("ID") String ID, 
     @Body Object data); 
+0

Cosa succede se volevo utilizzare lo stesso metodo per richieste multiple, senza utilizzare gli stessi tipi? Voglio dire, non posso usare una classe come Data perché non so come saranno i miei dati, è stato un esempio quindi non userò sempre id, nom e slug. C'è un modo per farlo usando una lista o qualcosa del genere? – Teasel

+0

@Teasel che non è un problema. Basta usare 'Object' invece di' Data' e passare tutti i dati che ti servono –

+0

Mi dispiace disturbarla Signore, ma posso avere un piccolo esempio? Il mio cervello è un po 'in fiamme adesso, come faccio a usare un oggetto per questo? – Teasel

Problemi correlati