【问题标题】:Using Volley's library to Parse Headers from HTTP Response (Android)使用 Volley 的库从 HTTP 响应中解析标头 (Android)
【发布时间】:2018-02-18 19:48:29
【问题描述】:

我希望使用 Volley 的库来包含来自 Android 响应的标头。我知道还有其他工具,如 OkHttp、Retrofit、Moshi、Picasso 有更多的文档(我认为 Volley 的缺点之一——文档很少)。然而我已经投入了很多时间。

我只想将 curl --include -X POST -d ... 请求翻译成 android。

到目前为止,我可以使用 POST,但不能使用 --include(https://www.itsalif.info/content/android-volley-tutorial-http-get-post-put 上的有用教程):

public class HTTPService {

public static void makeRequest(Context context) {
    RequestQueue queue = Volley.newRequestQueue(context);

    Response.Listener responseListener = new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            if (response!=null){
                Log.d("Response", response);
                Log.d("Response", Integer.toString(response.length()));
            }
        }
    };

    Response.ErrorListener errorListener = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // error
            String response = "Error";
            Log.d("Error.Response", error.toString());
        }
    };

    String url = "http://httpbin.org/post";


    StringRequest postRequest = new StringRequest(Request.Method.POST, url, responseListener, errorListener) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("name", "John");
            params.put("domain", "https://www.facebook.com");
            return params;
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            return super.getHeaders();
        }
        };
    queue.add(postRequest);
}
}

我已经展示了 getHeaders 函数来说明这不是我想要的。那就是将标题放在您的数据上。我想在我的响应对象中包含 HTTP 标头。

我发现的两个链接应该描述如何做到这一点:

1)https://developer.android.com/training/volley/request-custom.html

2)https://android.googlesource.com/platform/frameworks/volley/+/android-4.3_r0.9/src/com/android/volley/toolbox/JsonObjectRequest.java

但此时我感到非常困惑,并且......谁能提供一个可行的解决方案?或者告诉我他们如何处理 curl -i/--include 命令?

【问题讨论】:

    标签: android http header android-volley


    【解决方案1】:

    在 google 上搜索,我只看到访问标头信息的方法(如 --include)来自 Volley 的 Response parseNetworkResponse(NetworkResponse response) 函数。以下来自用户thedudeAndroid Volley read and store HTTP Header的回答。

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
            JSONObject jsonResponse = new JSONObject(jsonString);
    
            // set token after receiving from login response
            TokenHandler.setToken(response.headers.get("x-auth"));
    
            return Response.success(jsonResponse, HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException | JSONException e) {
            return Response.error(new ParseError(e));
        }
    }
    

    因为这是一个静态上下文,所以我发现存储信息的唯一方法是作为另一个类的公共变量。老兄的回答使用了 TokenHandler.java 类:

    public final class TokenHandler {
    private TokenHandler() {}
    
    private static String token = "";
    
    public static void setToken(String newToken) {
        if (newToken != null)
            token = newToken;
    }
    
    public static String getToken() {
        return token;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      相关资源
      最近更新 更多