将自定义标头设置为所有Volley请求

5

如果需要在请求中添加自定义标头,则覆盖getHeaders()函数即可。但是,如果总是需要设置X标头,例如静态认证令牌,该怎么办?


JsonObjectRequest req = new JsonObjectRequest(URL, new JSONObject(params),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    setFollowButton(item);
                }
            }, null){
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Authorization", "Token XXXXXXXXXXXX");
            return headers;
        }
};

Application.getInstance().addToRequestQueue(req);

我可以把请求头添加到 addToRequestQueue 方法中发送的请求吗,而不是每次写请求时都要覆盖它吗?


2
为什么不创建一个基本请求,然后针对每个新请求扩展该请求呢? - panini
2个回答

2

我认为最好的方法是扩展你选择使用的HttpStack子类,然后拦截performRequest()方法,在其中添加你的全局头部信息。

public class MyHurlStack extends HurlStack {
    @Override
    public HttpResponse performRequest(
            Request<?> request, Map<String, String> additionalHeaders)
            throws IOException, AuthFailureError {

        Map<String, String> headers = request.getHeaders();
        // put your global headers
        headers.put("Via", "netroid");
        headers.put("Accept-Charset", "UTF-8");
        headers.put("Origin", "http://netroid.cn/");

        return super.performRequest(request, additionalHeaders);
    }
}

public class MyHttpClientStack extends HttpClientStack {
    public MyHttpClientStack(HttpClient client) {
        super(client);
    }

    @Override
    protected void onPrepareRequest(HttpUriRequest request) throws IOException {
        // put your global headers
        request.setHeader("Via", "netroid");
        request.setHeader("Accept-Charset", "UTF-8");
        request.setHeader("Origin", "http://netroid.cn/");
        super.onPrepareRequest(request);
    }
}

在初始化RequestQueue时,使用定制的HttpStack而不是默认的。

if (stack == null) {
    if (Build.VERSION.SDK_INT >= 9) {
        stack = new HurlStack();
    } else {
        stack = new MyHttpClientStack(AndroidHttpClient.newInstance(userAgent));
    }
}

Network network = new BasicNetwork(stack);

要使用 HurlStack,只需调用 requestQueue = Volley.newRequestQueue(getApplicationContext(), stack); 简单而干净! - Roman
Map<String, String> headers 在 HurlStack 中既未被使用也未被返回,那么如何确保 headers 能正常工作呢? - Rafique Mohammed
@RafiqueMohammed 是正确的。这不适用于默认的Request#getHeaders()实现,因为默认情况下它返回一个不可变的空集合。试图向此集合添加内容将抛出com.android.volley.VolleyError: java.lang.UnsupportedOperationException异常。所以,显然这行不通。但是,如果您在自己的类中覆盖getHeaders()以返回一个可变的实例变量,则可以这样做,但这需要您为所有请求扩展此类。不确定为什么他们在Volley中这样做。 - Timo

0

在使用Volley Android库时,经过长时间的搜索如何在每个请求中添加自定义头,我使用了以下的HurlStack,希望能帮到其他的开发者。

private static class MyHurl extends HurlStack{

        @Override
        public HttpResponse executeRequest(Request<?> request, Map<String, String> additionalHeaders){

            Map<String, String> headers = new HashMap<>(additionalHeaders);
            headers.put("authKey","myauthkey");

            try {
                return super.executeRequest(request, headers);
            } catch (IOException e) {

            } catch (AuthFailureError authFailureError) {
            }

            return null;
        }
    }

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