web-dev-qa-db-ja.com

JSONをPOSTレトロフィット付きのリクエストで送信

私はこの質問を何度も見て、多くの解決策を試しましたが、問題を解決せずに、POSTレトロフィットを使用してリクエストを送信しようとしています。私はプログラミングの専門家ではありません明らかな何かを見逃すかもしれません。

私のJSONは文字列にあり、そのように見えます:

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

私のインターフェイス(APIService.Javaと呼ばれる)は次のようになります。

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

そして、私のClientServiceGenerator.Javaは次のようになります。

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

そして最後に、ここに私のアクティビティのコードがあります

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

他に何か必要な場合は教えてください、誰かが私を助けることができることを願っています。

[〜#〜] edit [〜#〜]最初に言及しなかったが、私のJSONは常に同じキー(id、nom、slug)を使用するとは限らない。

13
Teasel

まず、必要なJSONを表すオブジェクトを作成する必要があります。

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

次に、このオブジェクトを送信できるようにサービスを変更します。

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

最後に、このオブジェクトを渡します。

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

[〜#〜] upd [〜#〜]

データを送信できるようにするには、Objectの代わりに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