2017-03-06 9 views
1

私はsign in with Slack APIを使用しています。改造した動的URLを使用

アクセストークンを取得するには、HTTPのGET要求がある:

これはURLを認可され、私はWebViewを経由して、ログインのためにこれを使用して実装:

ログイン統合にWebViewを使用しています。 shouldOverrideUrlLoadingメソッド内で、私の活動のクラスで

public class LoginApiClient { 
private static LoginService loginService; 

public static LoginService getLoginService(){ 
    if (loginService != null){ 
     Retrofit retrofitClient = new Retrofit.Builder() 
       .baseUrl("https://slack.com/") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     loginService = retrofitClient.create(LoginService.class); 
    } 
    return loginService; 
} 
} 

public interface LoginService { 
    @FormUrlEncoded 
    @GET("api/oauth.access") 
    Call<LoginResponse> makeUserLogin(@FieldMap Map<String, String > parameter); 
} 

public class LoginResponse { 
    ..... 
    @SerializedName("access_token") 
    @Expose 
    private String accessToken; 
    ..... 
    public String getAccessToken() { 
     return accessToken; 
    } 

    public void setAccessToken(String accessToken) { 
     this.accessToken = accessToken; 
    } 

} 

私のクラスは今

public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.startsWith("http://localhost:8000/")) { 

      UrlQuerySanitizer urlQuerySanitizer = new UrlQuerySanitizer(url); 
      codeParams = urlQuerySanitizer.getValue("code"); 
      Log.e(TAG, "shouldOverrideUrlLoading: " + codeParams); 
      retrieveToken(); 
      return true; 
     } else { 
      view.loadUrl(url); 
      return true; 
     } 
    } 

private void retrieveToken() { 
    LoginService loginService = LoginApiClient.getLoginService(); 
    Map<String, String> urlParameter = new HashMap<>(); 
    urlParameter.put("client_id", StringConstant.CLIENT_ID); 
    urlParameter.put("client_secret", StringConstant.CLIENT_SECRET); 
    urlParameter.put("code", codeParams); 
    Call<LoginResponse> call = loginService.makeUserLogin(urlParameter); 
    call.enqueue(new Callback<LoginResponse>() { 
     @Override 
     public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { 
      //navigate to next activity after saving token 
     } 

     @Override 
     public void onFailure(Call<LoginResponse> call, Throwable t) { 

     } 
    }); 
} 

、それはnullポインタエラーを投げていると私は要求URLが機能していないと思うので、私これを取れ。

java.lang.NullPointerExceptionが:NULLオブジェクト参照インターフェイスメソッド 'retrofit2.Call com.loginApi.LoginService.makeUserLogin(java.util.Map)' を起動しようとし

どのようにすることができHTTP GETリクエストのURLがヒットしていることを知っていますか?私はどのようにURLを構築するために行うことができますログイン後、ヒットし、私はトークンを取得?

+0

(loginService!= null)と一度試してください。静的メソッドが新しいインスタンスを返すようにします。おそらくアプリケーション実行中にクリアされる可能性があります。なぜヌルポイント例外が発生するのですか? – Stallion

+0

削除できるものを明確にすれば、あなたの情報は役に立ちます。そして、 '(loginService!= null)'は常に 'true'です。 –

+0

あなたの上記のコードでは、私は同じことを言及する行は1つしか見ることができません。なぜコード自体で検出できないのだろうか?私はいつもその状態をチェックし、試してみるよりも新しいインスタンスを返すと言ったように – Stallion

答えて

0

。..として共通のベースURLのhttps://slack.com/を使用してapiinterfaceでのような動的URLを持つすべてのメソッドを作成することができます。

if (loginService != null) 

、このチェックを外して、それが解決するかどうかを確認します。おそらくアプリケーションがメモリ割り当て/割り当て解除のために変数をクリアしている可能性があります

0

あなたはloginServiceオブジェクトが取得され、次のステートメントに起因する可能性

@GET("api/oauth.access") 
Call<JsonElement> oauth.access(@QueryMap HashMap<String, String> body); 

@GET("oauth/authorize") 
Call<JsonElement> oauth.access(@QueryMap HashMap<String, String> body); 
+0

もちろん、私はそれと似ています。しかし、問題は、動的URLが3つのパラメータすべてを取得しているかどうかわかりません。だから、私はログイントークンにアクセスするために問題に直面しています。 –

+0

はい、間違いなく3つのパラメータすべてをハッシュマップで渡しました。キーと値を使用してパラメータを取得し、取得メソッドで使用します。 –

+0

URLはhttps://slack.com/api/oauth.access?client_id=something&client_secret=something&code=何かリクエストがありますか? –

関連する問題