2015-11-06 168 views
18

我正在开发一个与我写的REST风格的Web服务进行通信的Android应用程序。使用VolleyGET方法是真棒和容易的,但我不能把我的手指放在POST方法。如何使用volley与字符串正文发送POST请求?

我想送一个POST请求与请求的身体String和检索Web服务的原始响应(如200 ok500 server error)。

我所能找到的是StringRequest,它不允许使用数据(主体)发送,并且它也使我得到解析的String响应。 我也遇到JsonObjectRequest它接受数据(正文),但检索解析的JSONObject响应。

我决定编写自己的实现,但是我找不到从Web服务接收原始响应的方法。我该怎么做?

回答

58

你可以参考下面的代码(当然你也可以自定义,以获得网络响应的更多细节):

try { 
    RequestQueue requestQueue = Volley.newRequestQueue(this); 
    String URL = "http://..."; 
    JSONObject jsonBody = new JSONObject(); 
    jsonBody.put("Title", "Android Volley Demo"); 
    jsonBody.put("Author", "BNK"); 
    final String requestBody = jsonBody.toString(); 

    StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      Log.i("VOLLEY", response); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.e("VOLLEY", error.toString()); 
     } 
    }) { 
     @Override 
     public String getBodyContentType() { 
      return "application/json; charset=utf-8"; 
     } 

     @Override 
     public byte[] getBody() throws AuthFailureError { 
      try { 
       return requestBody == null ? null : requestBody.getBytes("utf-8"); 
      } catch (UnsupportedEncodingException uee) { 
       VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8"); 
       return null; 
      } 
     } 

     @Override 
     protected Response<String> parseNetworkResponse(NetworkResponse response) { 
      String responseString = ""; 
      if (response != null) { 
       responseString = String.valueOf(response.statusCode); 
       // can get more details such as response.headers 
      } 
      return Response.success(responseString, HttpHeaderParser.parseCacheHeaders(response)); 
     } 
    }; 

    requestQueue.add(stringRequest); 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 
+1

冷酷的男人......你救了我的一天:) –

+1

工作对我很好。真棒分享! –

+1

它的工作,但不得不删除bodyContentType和parseNetworkResponse方法 – kondal

7

我喜欢this之一,但它是sending JSON not string作为问题的要求,重新发布这里的代码,以防原始的github被删除或更改,并且这个被发现对某人有用。

public static void postNewComment(Context context,final UserAccount userAccount,final String comment,final int blogId,final int postId){ 
    mPostCommentResponse.requestStarted(); 
    RequestQueue queue = Volley.newRequestQueue(context); 
    StringRequest sr = new StringRequest(Request.Method.POST,"http://api.someservice.com/post/comment", new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      mPostCommentResponse.requestCompleted(); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      mPostCommentResponse.requestEndedWithError(error); 
     } 
    }){ 
     @Override 
     protected Map<String,String> getParams(){ 
      Map<String,String> params = new HashMap<String, String>(); 
      params.put("user",userAccount.getUsername()); 
      params.put("pass",userAccount.getPassword()); 
      params.put("comment", Uri.encode(comment)); 
      params.put("comment_post_ID",String.valueOf(postId)); 
      params.put("blogId",String.valueOf(blogId)); 

      return params; 
     } 

     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      Map<String,String> params = new HashMap<String, String>(); 
      params.put("Content-Type","application/x-www-form-urlencoded"); 
      return params; 
     } 
    }; 
    queue.add(sr); 
} 

public interface PostCommentResponseListener { 
    public void requestStarted(); 
    public void requestCompleted(); 
    public void requestEndedWithError(VolleyError error); 
}