2016-04-18 11 views
1

私はレトロフィットで作業を始めていますが、この簡単なステップにはまっています。私はログインフォームを持っていて、サーバーで認証しようとしていますが、要求を送信できません。レトロフィット付きシンプルなログインフォーム

これは私が試したものです:

私のレトロフィットのクライアントは:

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); 
} 

マイログインインターフェース:

public interface Login { 

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

LoginCredentialsクラス:

public class LoginCredentials { 

    private String name; 
    private String pass; 

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

そして、私が知っている部分LLそれ:

@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()); 
     } 
    }); 

} 

そして、私はエラーUse JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $を取得しておくが、私はそれが何を意味するのか見当がつかない。

+0

あなたのサーバーが実際に戻っているものの例を投稿することができますか? – snkashis

+0

要求が成功した場合、私のサーバはStringを返します。このように、apiトークンとして使用される文字列:7ec16632-e1f4-4787-91f4-7279ce6c48d2 –

+0

さて、私はあなたの 'handleResponse'コードを見る必要があると思います。 – snkashis

答えて

3

を述べたあなたはまた、このバグはおそらく最新GSONバージョンをインポートすることによって解決することができ

{"api_token": "token"} 

のように、サーバからの実際のJSONを返すことができると思います。私が思ったよりも簡単でした。メソッドの応答タイプをResponseBodyに設定すると、Retrofitの解析をスキップできます。あなたはただ応答を読んで、提供するstring()メソッドを使う必要があります。それでおしまい!

例:

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

は、このように使用:

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

このエラーは、gsonがJSONオブジェクトとしてサーバーから文字列を解析しようとしていて、開始括弧を見つけることができないことを意味します。

私はそれを考え出したhere

+0

レスポンスからStringを読み取る方法はありますか?私はちょうど私が今サーバーを台無しにすることができると確信していません。基本的に私が望むのは、自分のデータオブジェクトでPOSTリクエストを送信し、Stringを受け取ることです。それは可能ですか? –

+0

私の答えのリンクから解決策を試しましたか?要するに、最新のgsonをbuild.gradleに追加して、それを改造して '.addConverterFactory(GsonConverterFactory.create(new Gson()))を構築する際に使用することができます。 – Alex

+0

私はしましたが動作しませんでした。同じ結果。 –

関連する問題