【问题标题】:Getting headers and status-code from Volley?从 Volley 获取标题和状态码?
【发布时间】:2016-09-17 10:25:22
【问题描述】:

给定任意 volley 请求,无论成功/失败,我如何捕获响应标头和 statusCode?​​p>

尝试/想法:

@Override
protected Response parseNetworkResponse(NetworkResponse response) {
    return Response.success(response.statusCode,
                            HttpHeaderParser.parseCacheHeaders(response));
}

编辑:澄清一下,我有一个简单的tuple 类:

public final class ErrResStatusHeaders<E, R> {
    public final E error;
    public final R result;
    public final int statusCode;
    public final Map<String, String> headers;

在我的Activity:

@Override
protected ErrResStatusHeaders<String,JSONObject> doInBackground(Void... params) {
    // futures instantiated and utility function(s) called here

[...]

@Override
protected void onPostExecute(final ErrResStatusHeaders<String,JSONObject> er_res)

实用函数签名示例:

public ErrResStatusHeaders<String, JSONObject> register_or_login(
                                 final HashMap<String, String> data,
                                 final RequestFuture<JSONObject> register_future,
                                 final RequestFuture<JSONObject> login_future) {

【问题讨论】:

  • 如果不管JSONObjectString 或没有正文(即:任何其他http 方法),它都能正常工作,并且允许与RequestFuture 一起使用:)

标签: java android inheritance http-headers android-volley


【解决方案1】:
String uri = "http://whatevergoeshere.com";
StringRequest stringRequest = new StringRequest("uri", responseListener, errorListener) {
    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        Log.d("TEST", "Headers size:" + response.headers.size());
        return super.parseNetworkResponse(response);
    }

    @Override
    protected VolleyError parseNetworkError(VolleyError volleyError) {
        if (volleyError.networkResponse != null && volleyError.networkResponse.headers != null)
            Log.d("TEST", "Headers size:" + volleyError.networkResponse.headers.size());
        return super.parseNetworkError(volleyError);
    }
};

好吧,看起来问题发生了很大变化,所以这是我编辑的答案:

您可以像这样使用自定义请求子类:

public class RawRequest extends Request<NetworkResponse> {
    private final Response.Listener<NetworkResponse> mListener;

    /**
     * Creates a new GET request.
     *
     * @param url URL to fetch the string at
     * @param listener Listener to receive the String response
     * @param errorListener Error listener, or null to ignore errors
     */
    public RawRequest(String url, Response.Listener<NetworkResponse> listener, Response.ErrorListener errorListener) {
        this(Method.GET, url, listener, errorListener);
    }

    /**
     * Creates a new request with the given method.
     *
     * @param method the request {@link Method} to use
     * @param url URL to fetch the string at
     * @param listener Listener to receive the String response
     * @param errorListener Error listener, or null to ignore errors
     */
    public RawRequest(int method, String url, Response.Listener<NetworkResponse> listener,
                         Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        mListener = listener;
    }

    @Override
    protected Response parseNetworkResponse(NetworkResponse response) {
        return Response.success(response, HttpHeaderParser.parseCacheHeaders(response));
    }

    @Override
    protected void deliverResponse(NetworkResponse response) {
        mListener.onResponse(response);
    }
}

然后在另一个类中使用它:

String uri = "http://whatevergoeshere.com";
RequestFuture<NetworkResponse> future = RequestFuture.newFuture();
RawRequest rawRequest = new RawRequest("uri", future, future);

但这里的缺点显然是现在您必须自己解析整个响应。您可以通过编写自定义侦听器接口来避免这种情况,该接口将解析的响应(无论是 JSON 或字符串,还是图像)以及标头作为第二个参数传递。然后你必须编写自己的 RequestFuture 类来支持这一点。

老实说,尽管我建议为此尝试 AsyncTask 之外的另一种方法。 Volley 已经可以异步处理请求了。

【讨论】:

  • 谢谢,但有没有办法做到这一点,以便它在我的活动中的 onPostExecute 回调中工作? - Volley 的东西在doInBackground 中运行,特别是在一个在return 中调用的实用程序类中。所以我需要某种方式来获取所有请求的网络响应。无论是正常展开还是通过未来展开。
  • 更新了答案,但我真的建议改变整个方法,而不是在 AsyncTask 中使用 volley。
  • 通过电话但看起来像'ServerStatusRequestObject'。但是,您编写新的“ RequestFuture”等的想法。似乎是健全的。我回来后会测试一下。
  • 嗯,看起来一大堆相关文件无法扩展到文件本身之外。所以我可能最终会分叉com.android.volley 并为谷歌准备公关。可能会在其他时间这样做,同时将停止使用 Volley。
  • 如果我的回答回答了你的问题,请采纳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2017-05-21
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多