2016-01-13 7 views
7

Ich konnte nur das Beispiel Hallo Welt (GithubService) aus den Dokumenten ausführen.Wie wird eine POST-Anfrage mit Retrofit 2 durchgeführt?

Das Problem ist, wenn ich meinen Code ausführen, ich folgende Fehlermeldung erhalten, innerhalb von onFailure()

Verwenden JsonReader.setLenient (true) in Zeile 1 Spalte 1 Pfad malformed JSON zu akzeptieren $

Meine API akzeptiert POST-Parameterwerte, daher müssen Sie sie nicht als JSON codieren, aber sie gibt die Antwort in JSON zurück.

Für die Antwort habe ich ApiResponse-Klasse, die ich mit Tools generiert.

Meine Schnittstelle:

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

Hier ist, wie ich den Dienst nutzen:

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

die vollständige Stacktrace veröffentlichen, aber das Problem ist wahrscheinlich, dass die Antwort ungültig ist. es gibt viele Debug-Optionen in Retrofit, verwenden Sie sie – njzk2

Antwort

8

Wenn Sie nicht JSON codiert params wollen verwenden diese:

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

Sie sollten sich bewusst sein, wie Sie die Post params kodieren möchten. Wichtig ist auch die @Header Annotation im Folgenden. Es wird verwendet, um den verwendeten Inhaltstyp im HTTP-Header zu definieren.

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

Sie müssen Ihre Postparams irgendwie kodieren. Um JSON für die Übertragung zu verwenden, fügen Sie .addConverterFactory(GsonConverterFactory.create(gson)) in Ihre Retrofit-Deklaration ein.

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

Eine weitere Quelle des Problems könnte sein, dass die JSON, das vom Rest Backend-Kommen scheint nicht korrekt zu sein. Sie sollten die JSON-Syntax mit einem Validator prüfen, z. http://jsonlint.com/.

+1

'@Header nicht anwendbar auf Methode' so kann nicht kompilieren, ich möchte nicht zu JSON codieren, einfach unverarbeitete Werte –

+0

Korrektur - @Headers (" Content-Typ: Anwendung/Json ") –