使用动态网址进行改造

时间:2017-03-06 06:13:06

标签: android retrofit2 slack-api

我正在使用sign in with Slack API

要获取访问令牌,需要HTTP GET请求:

这是授权网址,我使用它进行登录并通过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) {

        }
    });
}

现在,它抛出了nullpointer错误,我认为请求url不起作用,所以我明白了。

  

java.lang.NullPointerException:尝试在空对象引用上调用接口方法'retrofit2.Call com.loginApi.LoginService.makeUserLogin(java.util.Map)'

我怎么知道,HTTP GET请求网址正在命中?我该如何建立网址,登录后它会被点击,我得到令牌?

2 个答案:

答案 0 :(得分:0)

您可以将https://slack.com/用作基本网址,并在apiinterface中使用动态网址创建所有方法,例如..

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

答案 1 :(得分:0)

可能是由于以下语句检索了loginService对象。

删除此项检查

GetCultures()

并查看是否结算。由于内存分配/解除分配,应用程序可能已经清除了变量