我需要调用REST API,它只是更新数据库中字段的值。为此,我使用以下Volley请求,但它返回一个意外的响应代码401(未经授权),似乎忽略了OAuth2授权的标头。我检查了访问令牌值,它是否正确。我的错是什么?
private void sendRegistrationTokenToServer(final String token) {
// user ID taken from SharedPreferences
final String id = Integer.toString(SharedPrefManager.getInstance(this).getUserId());
StringRequest stringRequest = new StringRequest
(
Request.Method.PUT,
Constants.URL_GCM_TOKEN+"/"+ Utils.base64Encode(id),
new Response.Listener<String>()
{
@Override
public void onResponse(String s)
{
Intent registrationComplete = new Intent(REGISTRATION_TOKEN_SENT);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(registrationComplete);
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError volleyError)
{
Toast.makeText(getBaseContext(), "Unexpected error occurred when saving the GCM token for push notifications", Toast.LENGTH_LONG).show();
}
})
{
@Override
protected Map<String, String> getParams() throws AuthFailureError
{
Map<String, String> params = new HashMap<>();
params.put("gcm_token", token);
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError
{
Map<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json");
String bearer = "Bearer ".concat(SharedPrefManager.getInstance(getBaseContext()).getUserAccessToken());
headers.put("Authorization", bearer);
return headers;
}
};
App.getInstance().addToRequestQueue(stringRequest);
}
答案 0 :(得分:1)
我回答自己,万一有人需要知道解决方案:) 出于某种推动,服务器策略删除了 Authorization 标头,因此我必须提供一个名为 X-Authorization-Copy 的不同自定义标头,其值与< em>授权一个(“ Bearer ”),我不得不修改服务器代码以管理未找到 Authorization 标头的情况请求。因此,服务器会检查是否存在其他自定义 X-Authorization-Copy 标头,并从中获取授权数据。 此外,Content-Type标头必须是x-www-form-urlencoded,而不是application / json,否则会出错。 现在它有效。