Android Volley POST cadena en el cuerpo
Estoy tratando de usar la biblioteca Volley para comunicarse con mi API RESTful.
Tengo que poner cadena en el cuerpo, cuando estoy pidiendo el portador Token. String debería tener este aspecto: grant_type = password & username = Alice & password = password123 Y encabezado: Content-Type: application / x-www-form-urlencoded
- Certificado SSL para los servicios web REST (utilizados por Android)?
- Jersey Client en Android - NullPointerException
- Enulador de Android CONNECT túnel que falta los encabezados esperados
- Retrofit con un servicio de la vieja escuela
- Cómo enviar una solicitud getForObject con parámetros Spring MVC
Más información acerca de las cuentas individuales de WebApi: http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api
Desafortunadamente no puedo imaginar cómo puedo solucionarlo ..
Estoy intentando algo como esto:
StringRequest req = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() { @Override public void onResponse(String response) { VolleyLog.v("Response:%n %s", response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.e("Error: ", error.getMessage()); } }){ @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); params.put("grant_type", "password"); params.put("username", "User0"); params.put("password", "Password0"); return params; } @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<String, String>(); headers.put("Content-Type", "application/x-www-form-urlencoded"); return headers; } };
Estoy recibiendo 400 Bad Request todo el tiempo. Creo que en realidad estoy enviando solicitud como esta:
grant_type:password, username:User0, password:Password0
en lugar de:
grant_type=password&username=Alice&password=password123
Estaría muy agradecido si alguien tiene alguna idea o un consejo ..
- RoboSpice y ORMLite - Acceso a los datos
- ¿Cómo pasar el enum personalizado en @Query a través de Retrofit?
- ¿Es el manejo de llamadas http de servicios de múltiples intenciones buen enfoque?
- Reducción del número de clases de eventos al utilizar EventBus o Otto
- ¿Aplicación de Android para la tienda Magento utilizando REST o SOAP?
- ¿Cómo mostrar la página siguiente de los resultados de búsqueda personalizados de Google?
- Codificación de caracteres por defecto Jersey / Rest
- ¿Cómo puedo enviar JSon como BODY en una solicitud POST al servidor desde una aplicación de Android?
En primer lugar, te aconsejo que veas exactamente lo que estás enviando, ya sea por la impresión en el registro o mediante un sniffer de red como wireshark o violinista.
¿Qué tal tratar de poner los params en el cuerpo? Si todavía desea una StringRequest
necesitará extenderla y anular el método getBody()
(similarmente a JsonObjectRequest
)
Para enviar una solicitud POST normal (sin JSON) con parámetros como nombre de usuario y contraseña, normalmente anulará getParams () y pasará un mapa de parámetros:
public void HttpPOSTRequestWithParameters() { RequestQueue queue = Volley.newRequestQueue(this); String url = "http://www.somewebsite.com/login.asp"; StringRequest postRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("Response", response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("ERROR","error => "+error.toString()); } } ) { // this is the relevant method @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); params.put("grant_type", "password"); // volley will escape this for you params.put("randomFieldFilledWithAwkwardCharacters", "{{%stuffToBe Escaped/"); params.put("username", "Alice"); params.put("password", "password123"); return params; } }; queue.add(postRequest); }
Y para enviar una cadena arbitraria como datos del cuerpo de POST en un StringRequest de Volley, anula getBody ()
public void HttpPOSTRequestWithArbitaryStringBody() { RequestQueue queue = Volley.newRequestQueue(this); String url = "http://www.somewebsite.com/login.asp"; StringRequest postRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("Response", response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("ERROR","error => "+error.toString()); } } ) { // this is the relevant method @Override public byte[] getBody() throws AuthFailureError { String httpPostBody="grant_type=password&username=Alice&password=password123"; // usually you'd have a field with some values you'd want to escape, you need to do it yourself if overriding getBody. here's how you do it try { httpPostBody=httpPostBody+"&randomFieldFilledWithAwkwardCharacters="+URLEncoder.encode("{{%stuffToBe Escaped/","UTF-8"); } catch (UnsupportedEncodingException exception) { Log.e("ERROR", "exception", exception); // return null and don't pass any POST string if you encounter encoding error return null; } return httpPostBody.getBytes(); } }; queue.add(postRequest); }
Como un aparte, la documentación Volley es inexistente y la calidad de StackOverflow respuestas es bastante malo. No puedo creer que una respuesta con un ejemplo como este no estuviera ya aquí.
Sé que esto es viejo, pero me encontré con este mismo problema y hay una solución mucho más limpia imo encontrado aquí: ¿Cómo enviar una solicitud de POST utilizando volley con cuerpo de cadena?
- ¿Se puede cambiar el contexto de la aplicación durante el ciclo de vida de la aplicación?
- Sala de Android: Cada variable de enlace en la consulta debe tener un método de coincidencia