web-dev-qa-db-fra.com

Envoi de JSON dans POST requête avec retrofit

J'ai vu ces questions plusieurs fois et essayé de nombreuses solutions mais sans résoudre mon problème, j'essaie d'envoyer un json dans une demande POST utilisant la modification, je ne suis pas un expert en programmation donc je peux manquer quelque chose d'évident.

Mon JSON est dans une chaîne et ressemble à ça:

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

Mon interface (appelée APIService.Java) ressemble à ça:

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

Et mon ClientServiceGenerator.Java ressemble à ça:

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);
}}

Et enfin voici le code de mon activité

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();
        }
    });

Dites-moi si vous avez besoin d'autre chose, j'espère que quelqu'un pourrait m'aider.

EDIT Je ne l'ai pas mentionné la première fois mais mon JSON ne sera pas toujours avec les mêmes clés (id, nom, slug).

13
Teasel

Vous devez d'abord créer un objet pour représenter le json dont vous avez besoin:

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;
    }
}

Ensuite, modifiez votre service pour pouvoir envoyer cet objet:

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

Enfin, passez cet objet:

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

UPD

Pour pouvoir envoyer des données, utilisez Object au lieu de Data:

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