You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:31:15