2017-03-06 85 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=有东西获得要求? –