使用Volley携带参数发DELETE请求遇认证失败的解决方法
解决Volley发送DELETE请求时的AuthFailureError问题
我尝试向API发送DELETE请求以删除指定ID的城市,API文档要求请求携带认证token和城市ID参数,但运行初始代码时始终遇到com.android.volley.AuthFailureError错误。
初始代码:
void deleteCity(String cityId, final VolleyResponseListener volleyResponseListener){ String url = baseUrl + "city"; try { JSONObject params = new JSONObject(); params.put("token", token); params.put("city_id", cityId); JsonObjectRequest jsonObjectRequest = new JsonObjectRequest (Request.Method.DELETE, url, params, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try{ String success = response.get("success").toString(); if(success.equals("true")){ volleyResponseListener.onResponse(); }else{ String errorMessage = response.get("errorMessage").toString(); throw new Exception(errorMessage); } } catch (Exception e) { volleyResponseListener.onError(e.getMessage()); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println(error); volleyResponseListener.onError("Volley Error"); } }); requestQueue.add(jsonObjectRequest); }catch (JSONException e){ volleyResponseListener.onError("Param error"); } }
通过将城市ID作为查询参数拼接到URL,同时在请求头中传递认证token的方式解决了该问题,最终代码如下:
void deleteCity(String cityId, final VolleyResponseListener volleyResponseListener){ String url = baseUrl + "city?city_id="+cityId; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest (Request.Method.DELETE, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try{ String success = response.get("success").toString(); if(success.equals("true")){ volleyResponseListener.onResponse(); }else{ String errorMessage = response.get("errorMessage").toString(); throw new Exception(errorMessage); } } catch (Exception e) { volleyResponseListener.onError(e.getMessage()); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println(error); volleyResponseListener.onError("Volley Error"); } }){ @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = super.getHeaders(); if (headers == null || headers.equals(Collections.emptyMap())) { headers = new HashMap<String, String>(); } headers.put("token", token); return headers; } }; requestQueue.add(jsonObjectRequest); }
关键改动说明:
- 将
city_id作为查询参数直接拼接到请求URL,避免通过DELETE请求体传递参数(部分服务端不会解析DELETE请求的请求体) - 重写
getHeaders()方法,将认证token添加到请求头中,符合REST API常见的认证方式 - 构造
JsonObjectRequest时传入null作为请求体参数,此时参数已通过URL和请求头完成传递
内容的提问来源于stack exchange,提问作者BFM
相关产品推荐
相关产品推荐

