volley POST json对象并从RESTful API接收json对象

问题描述:

我想发送带有json数据的POST请求作为正文到REST api的POST请求接收JSON响应。我使用JsonObjectRequest,我明白在JsonObjectRequest构造函数中设置jsonObject会将请求作为POST发送,否则作为GET发送。我试图在邮递员上执行请求,它工作正常,但在Android上,它给了我错误405(方法不允许)。 REST API还要求我发送Content-Type: application/json作为标题。这里是我的代码:volley POST json对象并从RESTful API接收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); 
+0

尝试在你的构造函数中添加“Request.Method.POST” – cuoka

+0

我曾尝试过。同样的错误 –

我想通了,这个问题是REST API中,它返回正确的预期反应,但错误代码405,而而不是预期的200,所以凌空常常把它当作错误。我与负责REST API的组织进行了交谈,并对其进行了修复。上面的代码工作正常,非常感谢所有你试图帮助

尝试以下...

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);