2016-04-18 13 views
1

Ich fange an, mit Retrofit zu arbeiten, aber ich stecke auf diesem einfachen Schritt fest. Ich habe ein Login-Formular und ich versuche mich mit dem Server zu authentifizieren, aber ich kann die Anfrage einfach nicht senden.Einfaches Login-Formular mit Nachrüstung

Dies ist, was ich versucht habe:

Mein Retrofit-Client:

private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 

private static Retrofit.Builder builder = 
     new Retrofit.Builder() 
       .baseUrl(API_BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()); 

public static <S> S createService(Class<S> serviceClass) { 
    Retrofit retrofit = builder.client(httpClient.build()).build(); 
    return retrofit.create(serviceClass); 
} 

Meine Login-Schnittstelle:

public interface Login { 

    @POST(LOGIN) 
    Call<String> loginWithCredentials(@Body LoginCredentials data); 
} 

Die LoginCredentials Klasse:

public class LoginCredentials { 

    private String name; 
    private String pass; 

    public LoginCredentials(String name, String pass) { 
     this.name = name; 
     this.pass = pass; 
    } 
} 

Und der Teil, wo ich ca werde es:

@Override 
public void onClick(View v) { 

    showProgress(true); 

    String username = userField.getText().toString(); 
    String password = passField.getText().toString(); 

    ApiController.Login loginClient = ApiController.createService(ApiController.Login.class); 
    Call<String> call =loginClient.loginWithCredentials(new LoginCredentials(username, password)); 
    call.enqueue(new Callback<String>() { 
     @Override 
     public void onResponse(Call<String> call, Response<String> response) { 
      handleResponse(response.body()); 
     } 

     @Override 
     public void onFailure(Call<String> call, Throwable t) { 
      showProgress(false); 
      Log.e(TAG, t.getLocalizedMessage()); 
     } 
    }); 

} 

Und ich erhalte den Fehler Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $ aber ich habe keine Ahnung, was es bedeutet.

+0

können Sie nach einem Beispiel von dem, was Ihr Server tatsächlich zurückkehrt? – snkashis

+0

Mein Server gibt eine Zeichenfolge zurück, wenn die Anfrage erfolgreich ist. Eine Zeichenfolge, die als API-Token verwendet wird, wie folgt: 7ec16632-e1f4-4787-91f4-7279ce6c48d2 –

+0

Okay, ich denke, wir müssen Ihren 'handleResponse'-Code sehen. – snkashis

Antwort

3

ich es herausgefunden gelöst werden könnten zurückkehren konnten. Es war einfacher als ich dachte. Sie können die Analyse überspringen, die Retrofit tut, indem Sie den Antworttyp der Methode als ResponseBody festlegen. Sie müssen nur die Antwort lesen und die string() Methode verwenden, die bereitstellt. Das ist es!

Beispiel:

public interface Login { 
    @POST(LOGIN) 
    Call<ResponseBody> loginWithCredentials(@Body LoginCredentials data); 
} 

Dann wie folgt verwenden:

String username = userField.getText().toString(); 
String password = passField.getText().toString(); 

ApiController.Login loginClient = ApiController.createService(ApiController.Login.class); 
Call<ResponseBody> call = loginClient.loginWithCredentials(new LoginCredentials(username, password)); 
call.enqueue(new Callback<ResponseBody>() { 
    @Override 
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
     if (response.isSuccessful()) { 
      try { 
       // get String from response 
       String stringResponse = response.body().string(); 
       // Do whatever you want with the String 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public void onFailure(Call<ResponseBody> call, Throwable t) { 
     // handle error 
    } 
}); 
0

Dieser Fehler bedeutet, dass Gson versucht, Zeichenfolge vom Server als JSON-Objekt zu analysieren und die öffnende Klammer nicht finden kann.

Ich glaube, Sie tatsächliche JSON vom Server wie

{"api_token": "token"} 

Auch diese Fehler möglicherweise durch den Import neueste Version Gson erwähnt here

+0

Gibt es eine Möglichkeit, wie ich die Zeichenfolge aus der Antwort lesen kann? Ich bin mir nicht sicher, ob ich gerade mit dem Server fertig werden kann. Grundsätzlich möchte ich die POST-Anfrage mit meinem Datenobjekt senden und einen String erhalten. Ist das möglich? –

+0

Haben Sie die Lösung aus dem Link von meiner Antwort versucht? kurz gesagt, du könntest den neuesten gson zu deinem build.gradle hinzufügen und ihn dann verwenden, während du '' .addConverterFactory (GsonConverterFactory.create (new Gson())) ' – Alex

+0

aufbautest, aber ich habe nicht funktioniert. Gleiches Ergebnis. –