web-dev-qa-db-fra.com

Comment faire une demande POST en utilisant retrofit 2?

Je n'ai pu exécuter que l'exemple du monde bonjour (GithubService) à partir des documents.

Le problème est que lorsque j'exécute mon code, j'obtiens l'erreur suivante, à l'intérieur de onFailure()

Utilisez JsonReader.setLenient (true) pour accepter un JSON malformé sur le chemin de la ligne 1 de la colonne 1 $

Mon API prend POST valeur params, donc pas besoin de les coder en JSON, mais elle retourne la réponse en JSON.

Pour la réponse, j'ai obtenu la classe ApiResponse que j'ai générée à l'aide d'outils.

Mon interface:

public interface ApiService {
    @POST("/")
    Call<ApiResponse> request(@Body HashMap<String, String> parameters);
}

Voici comment j'utilise le service:

HashMap<String, String> parameters = new HashMap<>();
parameters.put("api_key", "xxxxxxxxx");
parameters.put("app_id", "xxxxxxxxxxx");

Call<ApiResponse> call = client.request(parameters);
call.enqueue(new Callback<ApiResponse>() {
    @Override
    public void onResponse(Response<ApiResponse> response) {
        Log.d(LOG_TAG, "message = " + response.message());
        if(response.isSuccess()){
            Log.d(LOG_TAG, "-----isSuccess----");
        }else{
            Log.d(LOG_TAG, "-----isFalse-----");
        }

    }
    @Override
    public void onFailure(Throwable t) {
        Log.d(LOG_TAG, "----onFailure------");
        Log.e(LOG_TAG, t.getMessage());
        Log.d(LOG_TAG, "----onFailure------");
    }
});
12
Cool Do

Si vous ne voulez pas de paramètres encodés JSON, utilisez ceci:

@FormUrlEncoded
@POST("/")
Call<ApiResponse> request(@Field("api_key") String apiKey, @Field("app_id") String appId);
13
Vishal Raj

Vous devez savoir comment vous souhaitez coder les paramètres de publication. L'annotation @Header Est également importante dans ce qui suit. Il est utilisé pour définir le type de contenu utilisé dans l'en-tête HTTP.

@Headers("Content-type: application/json")
@POST("user/savetext")
    public Call<Id> changeShortText(@Body MyObjectToSend text);

Vous devez en quelque sorte encoder vos paramètres de publication. Pour utiliser JSON pour la transmission, vous devez ajouter .addConverterFactory(GsonConverterFactory.create(gson)) dans votre déclaration Retrofit.

Retrofit restAdapter = new Retrofit.Builder()
                .baseUrl(RestConstants.BASE_URL)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(httpClient)
                .build();

Une autre source de votre problème pourrait être que le JSON, qui provient du backend rest, semble être incorrect. Vous devriez vérifier la syntaxe json avec un validateur, par ex. http://jsonlint.com/ .

4
Philipp Hellmayr