2017-03-06 82 views
1

我正在使用sign in with Slack API使用動態網址進行改造

爲了獲得訪問令牌,有一個HTTP GET請求:

這是授權的url,我使用這個用於登錄並執行經由WebView

我正在使用WebView進行登錄集成。

我的類別是:

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

} 

在我的活動類,裏面shouldOverrideUrlLoading方法:

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) { 

     } 
    }); 
} 

現在,人們拋出空指針錯誤,我想請求的URL不能正常工作,所以我得到這個。

顯示java.lang.NullPointerException:嘗試上的空對象引用調用接口方法 'retrofit2.Call com.loginApi.LoginService.makeUserLogin(java.util.Map)'

我怎樣才能知道,HTTP GET請求url正在打?我怎麼能建立網址,並在登錄後得到命中,我得到的令牌?

+0

如果(loginService!= null)可以刪除此檢查並嘗試一次嗎?讓靜態方法返回新的實例。也許它可能會在應用程序運行中被清除,這就是爲什麼你得到零點例外 – Stallion

+0

如果你澄清我可以刪除什麼,你的信息將對我有幫助?而且,'(loginService!= null)'總是'true'。 –

+0

在上面的代碼中,我只能看到一行提到相同的內容。想知道爲什麼你不能在你的代碼中檢測到它?正如我所說的總是返回新的實例比檢查條件,並嘗試 – Stallion

回答

0

可能由於在login服務對象被檢索下面的語句。

刪除此檢查

if (loginService != null) 

,看看是否能解決。可能由於內存分配/解除分配,應用程序可能已清除變量

0

可以使用https://slack.com/爲基礎URL爲常見,在apiinterface創建所有方法與動態URL如..

@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是否獲得了所有三個參數。所以,我面臨問題來訪問登錄令牌。 –

+0

是的,它絕對需要所有三個參數只是通過hashmap它帶你的參數與鍵和值,並與獲取方法使用 –

+0

是否網址:https://slack.com/api/oauth.access?client_id=something&client_secret=something&code=有東西獲得要求? –