2016-08-19 109 views
0

我想發送帶有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

我曾嘗試過。同樣的錯誤 –

回答

0

我想通了,這個問題是REST API中,它返回正確的預期反應,但錯誤代碼405,而而不是預期的200,所以凌空常常把它當作錯誤。我與負責REST API的組織進行了交談,並對其進行了修復。上面的代碼工作正常,非常感謝所有你試圖幫助

0

嘗試以下...

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