【发布时间】:2017-03-06 20:44:06
【问题描述】:
我正在使用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) {
}
});
}
现在,它抛出空指针错误,我认为请求 url 不起作用,所以我明白了。
java.lang.NullPointerException:尝试在空对象引用上调用接口方法“retrofit2.Call com.loginApi.LoginService.makeUserLogin(java.util.Map)”
我怎么知道,HTTP GET 请求 url 正在命中?如何构建 url 并在登录后被点击并获得令牌?
【问题讨论】:
-
你可以删除这个检查 if (loginService != null) 并尝试一次吗?让静态方法返回新实例。可能它可能会在应用程序运行中被清除,这就是你得到空点异常的原因
-
如果您澄清我可以删除什么,您的信息将对我有所帮助?而且,
(loginService != null)始终是true。 -
在您上面的代码中,我只能看到一行提到相同的 .想知道为什么不能在代码本身中检测到?正如我所说,总是返回新实例而不是检查该条件并尝试
-
好的,非常感谢有问题。我也想知道我不能及时看到。
-
这个问题解决了吗?
标签: android retrofit2 slack-api