2015-11-06 6 views
18

Я разрабатываю приложение для Android, которое общается с веб-службой RESTful, которую я написал. Использование Volley для GET методов является удивительным и легким, но я не могу поместить свой палец в методы POST.Как отправить запрос POST, используя залп со строкой?

Я хочу, чтобы отправить запрос POST с String в теле запроса, и получить необработанный ответ веб-службы (как 200 ok, 500 server error).

Все, что я мог найти, это StringRequest, который не позволяет отправлять данные (тело), ​​а также он ограничивает меня получением разобранного ответа String. Я также наткнулся на JsonObjectRequest, который принимает данные (тело), ​​но получает разобранный ответ JSONObject.

Я решил написать свою собственную реализацию, но я не могу найти способ получить исходный ответ от веб-службы. Как мне это сделать?

ответ

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); 
} 
Смежные вопросы