Je dois publier un objet JSON à l'aide de Retrofit 2. Mon objet JSON est

{ "logTime": "", "des données" : [ { "dat1": "1", "dat2": "", "dat3": "", "dat4": "", "dat5": ""
}, { "dat1": "1", "dat2": "", "dat3": "", "dat4": "", "dat5": ""
} ]}

J'ai essayé d'utiliser le code suivant:

Services API

@FormUrlEncoded
@Headers({
        "Content-Type: application/json",
        "x-access-token: eyJhbGciOiJIU"
})
@POST("/api/employee/checkin")
Call<String> CHECKIN(@Body String data);

Classe d'activité

JSONStringer jsonStringer = null;
    try {
        jsonStringer=new JSONStringer().object().key("logTime").value("")
                .key("datas")
                .array()
                .object().key("dat1").value("1")
                .key("dat2").value("3")
                .key("dat3").value("5")
                .key("dat4").value("5")
                .endObject()
                .endArray()
                .endObject();
    } catch (JSONException e) {
        e.printStackTrace();
    }

    ApiService service = retroClient.getApiService();

    Call<String> login = service.CHECKIN(String.valueOf(jsonStringer));

    login.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            dialog.dismiss();
            try {
                String val = response.body();


            } catch (Exception e) {
                e.getMessage();
            }
        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {

        }
    });

J'ai obtenu "Erreur: aucune annotation de mise à niveau trouvée. (Paramètre n ° 2)" en utilisant ce code. Aidez-moi, s'il vous plaît. Merci d'avance.

9
Vinoth Kannan 24 janv. 2017 à 08:37

4 réponses

Meilleure réponse

Essayez ce code

Services API

 @POST("/api/employee/checkin")
Call<Sample> CHECKIN(@Body JSONStringer data);

Client API

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
    httpClient.addInterceptor(new Interceptor() {
        @Override
        public Response intercept(Interceptor.Chain chain) throws IOException {
            Request original = chain.request();

            // Request customization: add request headers
            Request.Builder requestBuilder = original.newBuilder()
                    .addHeader("Content-Type", "application/json")
                    .addHeader("x-access-token", "eyJhbGci");

            Request request = requestBuilder.build();
            return chain.proceed(request);
        }
    });

    OkHttpClient client = httpClient.build();



    return new Retrofit.Builder()
            .baseUrl(ROOT_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

Activité

 ApiService service = retroClient.getApiService();

    Call<Sample> call = service.CHECKIN(jsonStringer);

    call.enqueue(new Callback<Sample>() {
        @Override
        public void onResponse(Call<Sample> call, Response<Sample> response) {
            dialog.dismiss();
            if (response.isSuccessful()) {
                Sample result = response.body();


            } else {
                // response received but request not successful (like 400,401,403 etc)
                //Handle errors
            }

        }

        @Override
        public void onFailure(Call<Sample> call, Throwable t) {
            dialog.dismiss();
            Toast.makeText(MainActivity.this, "Network Problem", Toast.LENGTH_LONG).show();
        }

    });
2
Rajesh Kanna 24 janv. 2017 à 09:51

Lorsque vous utilisez l'annotation @FormUrlEncoded, transmettez les paramètres en utilisant le paramètre @Field au lieu de @Body. Faites donc ceci:

@FormUrlEncoded
@Headers({
        "Content-Type: application/json",
        "x-access-token: eyJhbGciOiJIU"
})
@POST("/api/employee/checkin")
Call<String> CHECKIN(@Field("data") String data);

J'ai supposé que votre serveur attend une clé data qui contiendra les détails. S'il s'agit d'autre chose, veuillez le modifier ici @Field("data")

MODIFIER:

Sur la base des commentaires:

@FormUrlEncoded
@Headers({
        "Content-Type: application/json",
        "x-access-token: eyJhbGciOiJIU"
})
@POST("/api/employee/checkin")
Call<String> CHECKIN(@Field("logTime") String logTime, @Field("datas") String datas);
0
Eric B. 24 janv. 2017 à 07:22

utiliser la bibliothèque GSON

Ajouter cette dépendance dans build.gradle

compile 'com.google.code.gson:gson:2.8.0'

Services API

@Headers({
        "Content-Type: application/json",
        "x-access-token: eyJhbGciOiJIU"
})
@POST("/api/employee/checkin")
Call<String> CHECKIN(@Body String data);

Classe d'activité

try {

            JsonArray datas = new JsonArray();

            JsonObject object = new JsonObject();
            object.addProperty("dat1","1");
            object.addProperty("dat2", "");
            object.addProperty("dat3", "");
            object.addProperty("dat4", "");
            object.addProperty("dat5", "");

            datas.add(object);

            JsonObject req = new JsonObject();
            req.addProperty("logTime", "");
            req.addProperty("datas", new Gson().toJson(datas));


        } catch (Exception e) {
            e.printStackTrace();
        }



    ApiService service = retroClient.getApiService();

    Call<String> login = service.CHECKIN(String.valueOf(req));

    login.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            dialog.dismiss();
            try {
                String val = response.body();


            } catch (Exception e) {
                e.getMessage();
            }
        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {

        }
    });
3
Rajesh Koshti 24 janv. 2017 à 06:48

Avez-vous ajouté RetroFit à build.gradle?

compile 'com.squareup.retrofit2:retrofit:2.1.0'
-3
Deyan Atanasov 24 janv. 2017 à 05:52