Android Volley .NET Rest 令牌授权失败
Android Volley .NET Rest token authorization fails
我正在尝试使用我在 .NET Framework 中构建的 Web API,它使用令牌身份验证系统。这些 API 正在使用 Volley 在 Android 中消耗。
所以这些 API 在邮递员中测试时工作完美,所以我将按照我在 Android 中使用的代码分享邮递员配置的屏幕截图。
public static void authorizeAPIClient(final String username, final String password, RequestQueue requestQueue){
StringRequest stringRequest = new StringRequest(Request.Method.POST,
apiPath + "api/authorise/token",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
MainActivity.getToken(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
public String getBodyContentType() {
return "application/x-www-form-urlencoded; charset=UTF-8";
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("grant_type", "password");
params.put("username", username);
params.put("password", password);
return params;
}
};
requestQueue.add(stringRequest);
}
所以这部分工作完美,我能够从 JSON 中提取令牌,甚至使用邮递员测试了在 Android 设备上收到的令牌,它工作得很好。我觉得奇怪的是我使用 getParams()
将用户名和密码传递给它,而在邮递员中我需要通过表单来完成。
现在我们已经从服务器获得了一个令牌并确定它可以工作,我尝试调用另一个需要令牌的函数。
public static void getUserDetails(final String userId, final String token, RequestQueue requestQueue){
StringRequest stringRequest = new StringRequest(Request.Method.GET,
apiPath + "API/points/getUserDetails",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i("API", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("API", error.toString());
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("UserId", userId);
return params;
}
@Override
public Map<String, String> getHeaders(){
Map<String, String> params = new HashMap<String, String>();
params.put("Authorization", "Bearer " + token);
return params;
}
};
requestQueue.add(stringRequest);
调用此函数时,根据我传递参数的方式和 headers:
,出现以下错误之一
com.android.volley.ServerError
com.android.volley.AuthFailureError
我不确定哪个错误先出现,即它会在 AuthFailureError
之前或之后抛出服务器错误,因此很难确定它是否曾经授权或 URL ] 参数传递正确。
有谁知道我做错了什么,我一直在搜索 Whosebug,但没有任何效果。
此外,对于所有黑色衬里、敏感信息,我们深表歉意:D
试试这个
public static void getUserDetails(final String userId, final String token, RequestQueue requestQueue){
StringRequest stringRequest = new StringRequest(Request.Method.GET,
apiPath + "API/points/getUserDetails?UserId=" + userId,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i("API", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("API", error.toString());
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError{
Map<String, String> params = new HashMap<String, String>();
params.put("Authorization", "Bearer " + token);
return params;
}
};
requestQueue.add(stringRequest);
我正在尝试使用我在 .NET Framework 中构建的 Web API,它使用令牌身份验证系统。这些 API 正在使用 Volley 在 Android 中消耗。
所以这些 API 在邮递员中测试时工作完美,所以我将按照我在 Android 中使用的代码分享邮递员配置的屏幕截图。
public static void authorizeAPIClient(final String username, final String password, RequestQueue requestQueue){
StringRequest stringRequest = new StringRequest(Request.Method.POST,
apiPath + "api/authorise/token",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
MainActivity.getToken(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
public String getBodyContentType() {
return "application/x-www-form-urlencoded; charset=UTF-8";
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("grant_type", "password");
params.put("username", username);
params.put("password", password);
return params;
}
};
requestQueue.add(stringRequest);
}
所以这部分工作完美,我能够从 JSON 中提取令牌,甚至使用邮递员测试了在 Android 设备上收到的令牌,它工作得很好。我觉得奇怪的是我使用 getParams()
将用户名和密码传递给它,而在邮递员中我需要通过表单来完成。
现在我们已经从服务器获得了一个令牌并确定它可以工作,我尝试调用另一个需要令牌的函数。
public static void getUserDetails(final String userId, final String token, RequestQueue requestQueue){
StringRequest stringRequest = new StringRequest(Request.Method.GET,
apiPath + "API/points/getUserDetails",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i("API", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("API", error.toString());
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("UserId", userId);
return params;
}
@Override
public Map<String, String> getHeaders(){
Map<String, String> params = new HashMap<String, String>();
params.put("Authorization", "Bearer " + token);
return params;
}
};
requestQueue.add(stringRequest);
调用此函数时,根据我传递参数的方式和 headers:
,出现以下错误之一com.android.volley.ServerError
com.android.volley.AuthFailureError
我不确定哪个错误先出现,即它会在 AuthFailureError
之前或之后抛出服务器错误,因此很难确定它是否曾经授权或 URL ] 参数传递正确。
有谁知道我做错了什么,我一直在搜索 Whosebug,但没有任何效果。
此外,对于所有黑色衬里、敏感信息,我们深表歉意:D
试试这个
public static void getUserDetails(final String userId, final String token, RequestQueue requestQueue){
StringRequest stringRequest = new StringRequest(Request.Method.GET,
apiPath + "API/points/getUserDetails?UserId=" + userId,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i("API", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("API", error.toString());
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError{
Map<String, String> params = new HashMap<String, String>();
params.put("Authorization", "Bearer " + token);
return params;
}
};
requestQueue.add(stringRequest);