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

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 ..

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?

  • Publicar en Drupal usando la cuenta de Facebook a través de Rest Server
  • Biblioteca de clientes API de REST para Android
  • POST cuerpo JSON utilizando Retrofit
  • ¿Cómo realizar una solicitud de API en Kotlin?
  • ¿Cómo manejas los registros de antememoria de caché en la aplicación para móviles
  • Análisis de la cadena JSON de la URL (RESTful webservice) mediante las bibliotecas GSON. Androide
  • Consumir servicios REST en Android, la forma más fácil?
  • Biblioteca Java para consumir / manipular Sharepoint 2013 Resto OData Resultado XML
  • Ejemplo de programa para android Parche relajante usando xml API
  • Volley JSONException: Fin de la entrada en el carácter 0 de
  • Generar dirección desde Lat / Long en Android o REST
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.