7 jun
2017

error code 400 con Volley al enviar datos con basic Authorization

Estoy tratando de mandar datos a un servicio WepApi, en concreto a un método POST.

El método que uso para mandar los datos es:

 private void enviaDatos()
{
    EditText txtAsunto = (EditText) viewPrincipal.findViewById(R.id.asunto);
    // Store values at the time of the login attempt.
    String asunto= txtAsunto.getText().toString();
    EditText txtDescripcion = (EditText) viewPrincipal.findViewById(R.id.descripcion);
    // Store values at the time of the login attempt.
    String descripcion= txtDescripcion.getText().toString();

    String idArea =((Area) sAreas.getSelectedItem()).getId();

    String idTipoComunicacion = ((TipoComunicacion) sTipos.getSelectedItem()).getID();


    JSONObject jsonObject = new JSONObject();
    try {

        jsonObject.put("idArea", idArea );
        jsonObject.put("idTipoComunicacion", idTipoComunicacion);
        jsonObject.put("idCiudadano", Ciudadano.getId());
        jsonObject.put("idEstado",  "1");
        jsonObject.put("asunto", asunto);
        jsonObject.put("descripcion", descripcion);
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }
    String JsonURL = getString(R.string.servidor)+"/api/comunicaciones";
    JsonObjectRequest postRequest = new JsonObjectRequest(
            Request.Method.POST,
            JsonURL,
            jsonObject,
            new Response.Listener<JSONObject>()
            {
                @Override
                public void onResponse(JSONObject response) {

                    try {
                        showProgress(false);
                        Log.e("VOLLEY","OK");

                    } catch (Exception e) {
                        Log.e("VOLLEY", e.getMessage());
                        showProgress(false);
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("VOLLEY", "ERROR LISTENER:"+error.getMessage());
                    showProgress(false);
                }
            }

    )

    {
        @Override
        public Map getHeaders() throws AuthFailureError {
            Map headers = new HashMap<>();
            String credentials = Ciudadano.getEmail()+":"+Ciudadano.getPalabra();
            String auth = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
            headers.put("Content-Type", "application/json");
            headers.put("Authorization", auth);
            return headers;
        }

    };

    // Adds the JSON array request "arrayreq" to the request queue
    requestQueue.add(postRequest);
}

el Metodo en el WebApi es simplemente añadir un registro en la base de datos con los mismos campos:

 // POST: api/Comunicaciones
[BasicAuthenticationFilter]
[ResponseType(typeof(Comunicacion))]
public IHttpActionResult PostComunicacion(Comunicacion comunicacion)
  {
  comunicacion.Id = Guid.NewGuid().ToString();
  if (!ModelState.IsValid)
    {
    return BadRequest(ModelState);
    }
  db.Comunicaciones.Add(comunicacion);

  try
    {
    db.SaveChanges();
    }
  catch (DbUpdateException)
    {
    if (ComunicacionExists(comunicacion.Id))
      {
      return Conflict();
      }
    else
      {
      throw;
      }
    }

  return CreatedAtRoute("DefaultApi", new { id = comunicacion.Id }, comunicacion);
  }

y cuando lo ejecuto obtengo el error:

E/Volley: [388] BasicNetwork.performRequest: Unexpected response code 400 for http://192.168.10.199/ws/api/comunicaciones

E/VOLLEY: ERROR LISTENER:null

Si comento el método getHeaders y al método WebApi le comento [BasicAuthenticationFilter] que es donde hago la comprobación del usuario y contraseña, todo funciona genial, guarda el registro en la base de datos,etc, como debería de ser.

Si comento el método getHeaders y dejo [BasicAuthenticationFilter] sin comentar, obtengo el codigo 401 que es lo normal, sin autorización,

Pero si lo dejo los dos sin comentar, ni entra en el webapi,ni en la comprobación del usuario y contraseña, ni nada.

El webapi lo he probado desde otra aplicación y funciona correctamente y el mismo codigo del método getheader lo utilizo en la misma pantalla para traer datos y también funciona bien

Alguien puede echarme una mano.

Gracias

COMENTARIOS

DEJA TU COMENTARIO

© 2017 website by Rubit Corporation