使用Volley库添加自定义标头

4

我开始在我的应用中使用Volley,并希望添加自定义头以作为安全标识符。我正在使用JsonObjectRequest并覆盖getHeaders()方法。

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,
                        url,
                        null,
                        new Response.Listener<JSONObject>() {
                            @Override
                            public void onResponse(JSONObject response) {
                                Log.d(TAG, response.toString());
                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Log.d(TAG, error.toString());
                            }
                        }) {
                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        HashMap<String, String> headers = new HashMap<>();
                        String mApiKey = "123";
                        headers.put("APIKEY", mApiKey);
                        return headers;
                    }

                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String, String> params = new HashMap<>();
                        params.put("param1", "1");
                        params.put("param2", "2");
                        params.put("param3", "3");
                        return params;
                    }
                };
                VolleySingleton.getInstance(getActivity()).addToRequestQueue(jsonObjectRequest);

但是我遇到了这个错误:
E/Volley﹕ [23620] BasicNetwork.performRequest: Unexpected response code 401 for http://...

抛出AuthFailureError错误。 我也尝试使用StringRequest,但是出现了相同的错误。 如果有人遇到相同情况并且有解决方案,请提前感谢!

@A.S. 是的,我用Postman试过了,它可以工作。当我用DefaultHttpClient和HttpGet尝试时,它也可以工作。我将尝试拦截我的网络流量,但我怀疑头部未设置。 - Alex
1
你可以尝试强制Volley记录输出 => http://blog.zitec.com/2014/volley-an-android-http-library-from-google/ "调试和跟踪" - A.S.
是的,我将我的APIKEY添加到参数中。它是与用户相关的APIKEY作为标识符(用于安全性),并用于所有请求。这也是为了防止任何人调用我的Web服务。 - Alex
@A.S. 对不起,我错了,getParams() 没有被我的 GET 请求调用 :( 所以我的 Web 服务返回空数据。 - Alex
1
这个回答解决了你的问题吗?在Volley请求中添加自定义头部 - volodya7292
显示剩余5条评论
2个回答

3
这是一个基本概念,如何在标准VolleyRequest中覆盖头文件。
VolleyRequest networkRequest = new VolleyRequest(request.getHttpMethod(), mUrlBase + request.getUrlSuffix(), responseListener, errorListener) {
        public String getBodyContentType() {
            return "application/json; charset=" + getParamsEncoding();
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {               
             HashMap<String, String> map = new HashMap<String, String>();
            map.put("X-Device-Info","Android FOO BAR");

            map.put("Accept-Language", acceptLanguage);
            map.put("Content-Type", "application/json; charset=UTF-8");         

            return map;             
        }

        public byte[] getBody() throws AuthFailureError {

            try {
                String json = request.toJson().toString();
                if (json.length() < 3)
                    return ("{}").getBytes();
                // log(json);
                return json.getBytes(getParamsEncoding());
            } catch (UnsupportedEncodingException e) {
                Log.e(TAG, "getBody(): request has no json");
                e.printStackTrace();
            }
            return new byte[0];
        }
    };

1
Alex,我也遇到了同样的问题。你最终解决了吗? - JDOaktown

0
public class CustomJsonObjectRequest  extends JsonObjectRequest
{
    public CustomJsonObjectRequest(int method, String url, JSONObject jsonRequest,Response.Listener listener, Response.ErrorListener errorListener)
    {
        super(method, url, jsonRequest, listener, errorListener);
    }


@Override
public Map getHeaders() throws AuthFailureError {
    Map headers = new HashMap();
    headers.put(Constants.accesstoken, Globals.getInstance().getAccessToken());
    Logger.debugE(Constants.accesstoken, headers.toString());
    return headers;
    }

}

虽然这段代码片段可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议原因。同时,请尽量不要在代码中添加过多的解释性注释,这会降低代码和解释的可读性! - Rizier123
请花点时间阅读帮助中心中的编辑帮助。在Stack Overflow上,格式与其他网站不同。 - Rizier123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接