【问题标题】:Volley library android - getHeaders() is never used & getParams() is never usedVolley library android - getHeaders() 从未使用过 & getParams() 从未使用过
【发布时间】:2017-01-07 21:49:46
【问题描述】:

在这里我想了解为什么getHeaders()getParams() 函数没有被使用和工作。?

            private String tag_json_obj = "jobj_req";

            ProgressDialog pDialog = new ProgressDialog(this);

            String tag_json_obj = "json_obj_req";

            String url = "https://api.abc.xyz.com:3021/login";


            pDialog.setMessage("Loading...");
            pDialog.show();



            JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
                    url, obj,
                    new Response.Listener<JSONObject>() {

                        @Override
                        public void onResponse(JSONObject response) {
                            Log.d(AbcLogin.class.getSimpleName(), response.toString());
                            pDialog.hide();
                        }
                    }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(AbcLogin.class.getSimpleName(), "Error: " + error.getMessage());
                    // hide the progress dialog
                    pDialog.hide();
                }
            });

            /**
             * Passing some request headers
             * */

           @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Content-Type", "application/json");
                return headers;
            }

            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("user", "abc12");
                params.put("password", "xyzan");

                return params;
            }

            // Adding request to request queue
            AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);

我必须在代码中同时传递标头和参数。

【问题讨论】:

  • 使用 StringRequest 代替 JsonObjectRequest
  • 我尝试使用 StringRequest 但它说无法解析构造函数。

标签: java android api httprequest android-volley


【解决方案1】:

请检查您的代码是否使用缓存。

如果使用缓存,它将允许 getHeaders() 方法仅在缓存过期时执行,否则 getHeaders() 将不会被执行。

请使用以下代码在 volley 中进行缓存。

 public static Cache.Entry parseIgnoreCacheHeaders(NetworkResponse response) {


        long now = System.currentTimeMillis();
        Map<String, String> headers = response.headers;
        long serverDate = 0;
        String serverEtag = null;
        String headerValue;
        headerValue = headers.get("Date");
        if (headerValue != null) {
            serverDate = HttpHeaderParser.parseDateAsEpoch(headerValue);
        }
        serverEtag = headers.get("ETag");

        final long cacheHitButRefreshed = 0; // in 0 millisecond cache will be hit, but also refreshed on background

        final long cacheExpired = 0; // in 0 millisecond this cache entry expires completely

        final long softExpire = now + cacheHitButRefreshed;
        final long ttl = now + cacheExpired;
        Cache.Entry entry = new Cache.Entry();
        entry.data = response.data;
        entry.etag = serverEtag;
        entry.softTtl = softExpire;
        entry.ttl = ttl;
        entry.serverDate = serverDate;
        entry.responseHeaders = headers;
        return entry;
    }

【讨论】:

    【解决方案2】:
    StringRequest stringObjectRequest = new StringRequest(httpMethod, url, new Listener<String>() {
               @Override
               public void onResponse(String response) {
    
               }
           }, new ErrorListener() {
    
               @Override
               public void onErrorResponse(VolleyError error) {
                   if(error != null && error.getMessage() != null)
                   {
                       Log.e("Response error", error.getMessage());
                   }
               }
           }
           )
           {
               @Override
               protected Map<String, String> getParams() throws AuthFailureError {
                   return params;
               }
               @Override
               public Map<String, String> getHeaders() throws AuthFailureError {
                   return super.getHeaders();
               }
           };
    

    【讨论】:

    • 我应该在哪里添加标题? "内容类型", "应用程序/json");
    • AppController.getInstance().addToRequestQueue(stringObjectRequest, tag_string_obj);不执行:错误:尝试在空对象引用上调用虚拟方法 'void com.android.abc.xyz.AppController.addToRequestQueue(com.android.volley.Request, java.lang.String)'
    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多