【问题标题】:volley POST json object and receive json object from RESTful APIvolley POST json 对象并从 RESTful API 接收 json 对象
【发布时间】:2016-08-19 08:18:35
【问题描述】:

我想向 REST api 发送一个以 json 数据为主体的 POST 请求,以接收 JSON 响应。我正在使用 JsonObjectRequest 并且我知道在 JsonObjectRequest 构造函数中设置一个 jsonObject 将请求作为 POST 发送,否则作为 GET 发送。我尝试在邮递员上执行请求,它工作正常,但在 android 上,它给了我错误 405(不允许方法)。 REST API 还要求我发送 Content-Type: application/json 作为标头。这是我的代码:

JsonObjectRequest req = new JsonObjectRequest(LOGIN_ENDPOINT , payload,
        new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {                           
                    pDialog.dismiss();
                    new SweetAlertDialog(LoginActivity.this, SweetAlertDialog.SUCCESS_TYPE)
                            .setTitleText("Response")
                            .setContentText(response.toString())
                            .setConfirmText("Ok")
                            .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                                @Override
                                public void onClick(SweetAlertDialog sweetAlertDialog) {
                                    sweetAlertDialog.dismiss();

                                }

                            })
                            .show();

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {                
        pDialog.dismiss();
        new SweetAlertDialog(LoginActivity.this, SweetAlertDialog.ERROR_TYPE)
                .setTitleText("Error")
                .setContentText(VolleyErrors.getVolleyErrorMessages(error, LoginActivity.this))                        
                .setConfirmText("Ok")
                .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                    @Override
                    public void onClick(SweetAlertDialog sweetAlertDialog) {
                        sweetAlertDialog.dismiss();

                    }

                })
                .show();
    }
}){
    @Override
    public byte[] getBody() {
        return payload.toString().getBytes();

    }

    @Override
    public String getBodyContentType() {
        return "application/json; charset=utf-8";
    }

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


RequestQueue requestQueue = Volley.newRequestQueue(LoginActivity.this);

requestQueue.add(req);

【问题讨论】:

  • 尝试在您的构造函数中添加“Request.Method.POST”
  • 我之前尝试过。同样的错误

标签: android json rest http-headers android-volley


【解决方案1】:

尝试关注...

 Map<String, String> params = new HashMap<String, String>();   

     //Pass Payload as JSON object like this

       params.put("user_id", user_id);
       params.put("user_password", password);

 JSONObject payload= new JSONObject(params);


 JsonObjectRequest req = new JsonObjectRequest(Method.POST,LOGIN_ENDPOINT,payload,new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            try {                           
                pDialog.dismiss();
                new SweetAlertDialog(LoginActivity.this, SweetAlertDialog.SUCCESS_TYPE)
                        .setTitleText("Response")
                        .setContentText(response.toString())
                        .setConfirmText("Ok")
                        .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                            @Override
                            public void onClick(SweetAlertDialog sweetAlertDialog) {
                                sweetAlertDialog.dismiss();
                            }
                        })
                        .show();

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {                

          pDialog.dismiss();
          new SweetAlertDialog(LoginActivity.this, SweetAlertDialog.ERROR_TYPE)
            .setTitleText("Error")
            .setContentText(VolleyErrors.getVolleyErrorMessages(error, LoginActivity.this))                        
            .setConfirmText("Ok")
            .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {

            @Override
            public void onClick(SweetAlertDialog sweetAlertDialog) {
                      sweetAlertDialog.dismiss();
                  }
          })
            .show();
         }
       }) {

       @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;
      }

   };

   RequestQueue requestQueue = Volley.newRequestQueue(LoginActivity.this);

   requestQueue.add(req);

【讨论】:

    【解决方案2】:

    我发现问题出在 REST API 中,它返回了正确的预期响应,但错误代码为 405 而不是预期的 200,因此 volley 将其视为错误。我与负责 REST API 的组织进行了交谈,他们修复了。上面的代码运行良好,非常感谢所有试图提供帮助的人

    【讨论】:

      猜你喜欢
      • 2015-12-05
      • 2019-05-05
      • 2014-11-12
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多