【问题标题】:Volley body 400 error凌空体400错误
【发布时间】:2014-09-04 09:32:38
【问题描述】:

我想将 POST 发送到服务器,其正文为真或假。我有这段代码,我使用 Volley 库

ShoozyHeader() 将 Content type 设置为 text/plain 并将 Accept 设置为 text/plain 和其他身份验证所需的标头。

如果我尝试http://requestmaker.com/ 并且服务器响应正确,但我运行此代码服务器响应:

错误请求 - 无效标头 HTTP 错误 400。请求的标头名称无效。

如果我删除 getBody(),服务器会响应正常。

    final String url = POSTS_URI + idPost + "/likes";

    StringRequest strReq = new StringRequest(Request.Method.POST,
            url, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            Log.d(TAG, response);
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
            Toast.makeText(act, "Network error", Toast.LENGTH_SHORT).show();
        }
    }
    ) {
        @Override
        public byte[] getBody() throws AuthFailureError {
            return "true".getBytes();
        }
    };

【问题讨论】:

    标签: http post text android-volley


    【解决方案1】:

    试试这个,对我来说效果很好:

    JSONObject params = new JSONObject();
    
    try {
        params.put("likes", "true");
    
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //
    
    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
            url, params,
            new Response.Listener<JSONObject>() {
    
                @Override
                public void onResponse(JSONObject response) {
                    Log.d(TAG, response.toString());
                }
            }, new Response.ErrorListener() {
    
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                }
            }) {
    
        /**
         * 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; charset=utf-8");
            return headers;
        }
    
    };
    jsonObjReq.setRetryPolicy(new DefaultRetryPolicy(60000,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    
    // Adding request to request queue
    getRequestQueue(jsonObjReq);
    

    【讨论】:

      【解决方案2】:

      您是否在类中覆盖了扩展请求的 getHeaders ?

      方法如下:

      @Override
      public Map<String, String> getHeaders() throws AuthFailureError {
          return headers != null ? headers : super.getHeaders();
      }
      

      以下是设置 Base64(用户名、密码)标头的示例:

      @Override
          private HashMap<String, String> getHeaders() {
              HashMap<String, String> headers = new HashMap<>();
              headers.put("Authorization", getAuthentication("usernameExample", "passwordExample"));
              headers.put("Content-Type", "application/json; charset=utf-8");
              Log.d(TAG + "");
              return headers;
          }
      
      private String getAuthentication(String username, String password) {
              String credentials = String.format("%s:%s", username, password);
              String auth = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.DEFAULT);
              return auth;
          }
      

      【讨论】:

        猜你喜欢
        • 2017-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多