2016-01-13 2 views
7

Je n'ai pu exécuter que l'exemple hello world (GithubService) à partir des docs.Comment faire une requête POST avec Retrofit 2?

Le problème est quand je lance mon code, je reçois l'erreur suivante, à l'intérieur de onFailure()

Utilisez JsonReader.setLenient (true) pour accepter malformé JSON à la ligne 1 colonne 1 chemin $

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

Pour la réponse, j'ai obtenu la classe ApiResponse que j'ai générée en utilisant des outils.

Mon interface:

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

Voici comment j'utiliser 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------"); 
    } 
}); 
+0

Postez le plein stacktrace, mais le problème est probable que la réponse est malformé. utilisez-les – njzk2

Répondre

8

Si vous ne voulez pas JSON params codés utilisent ceci:

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

Vous devez être conscient de la façon dont vous voulez coder les params de poste. Important est également l'annotation @Header 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 coder vos paramètres de publication en quelque sorte. 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 vient du back-end de repos semble être incorrect. Vous devriez vérifier la syntaxe json avec un validateur, par ex. http://jsonlint.com/.

+1

'@Header non applicable à la méthode' donc impossible de compiler, je ne veux pas encoder en json, juste poster des valeurs brutes –

+0

Correction - @Headers (" Content-type: application/json ") –