¿Cómo enviar una solicitud POST utilizando volley con cuerpo de cuerda?
Estoy desarrollando una aplicación para Android que se comunica con un servicio web RESTful que escribí. El uso de Volley
para los métodos GET
es impresionante y fácil, pero no puedo poner mi dedo en los métodos POST
.
Quiero enviar una solicitud POST
con una String
en el cuerpo de la solicitud, y recuperar la respuesta en bruto del servicio web (como 200 ok
, 500 server error
).
- ¿Cómo puedo hacer que una aplicación de Android se comunique con un servidor web a través de Internet?
- Yii Framework y Aplicación para Android
- FileNotFoundException al llamar a webservice
- Conexión de dos teléfonos Android para transferir datos entre ellos a través de WIFI
- Aplicación de chat: qué tecnología es mejor para implementar aplicación de chat en Android
Todo lo que pude encontrar es el StringRequest
que no permite enviar con datos (body), y también me limita a recibir una respuesta de String
analizada. También encontré JsonObjectRequest
que acepta datos (body) pero recupero una respuesta JSONObject
analizada.
Decidí escribir mi propia implementación, pero no puedo encontrar una forma de recibir la respuesta en bruto del servicio web. ¿Cómo puedo hacerlo?
- Cómo pasar el valor al parámetro enum de la bandera en el servicio Soap (servicio ASMX) Desde la aplicación android
- Llamadas de servicio síncronas en Android
- Proveedor de contenido privado de Android?
- Ksoap2 en android no analizar la respuesta codificada por MOTM
- Cómo resolver org.apache.http.conn.ConnectTimeoutException en Android?
- Cómo generar clases java desde el archivo WSDL
- Cómo recuperar array de objetos como resultado del servicio web KSOAP en Android?
- Cómo proteger url webservice en el archivo android apk
Puede consultar el siguiente código (por supuesto, puede personalizar para obtener más detalles de la respuesta de la red):
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(); }
Me gustó éste , pero está sending JSON not string
como se solicitó en la pregunta, repostando el código aquí, en caso de que el github original haya sido eliminado o cambiado, y éste encontrado útil para alguien.
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); }
- Tratando de obtener la información de la versión del paquete para que aparezca en un mensaje "Acerca de"
- ¿Cómo puedo saber cuánta batería consume mi aplicación de Android en los dispositivos del usuario?