entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Error migrando de Http a Android Volley

Hola a todos, estuve realizando un tutorial de conexion con base de datos desde una aplicación android con HttpURLConnection donde todo me resulto bien, tengo las funciones basicas de una BD corriendo bien (SELECT,INSERT,UPDATE), encontré que con la libreria Volley todo era mas sencillo y ahora estoy migrando el codigo guiandome de la documentación oficial.

Los metodos GET me funcionan perfecto, he tenido problemas solo con los POST y es donde quisiera que por favor me ayudaran, aqui va el codigo.

Usando el http:

case "3"://insertar
                    try {
                        HttpURLConnection urlConn;

                        DataOutputStream printout;
                        DataInputStream input;
                        miurl = new URL(cadena);
                        urlConn = (HttpURLConnection) miurl.openConnection();
                        urlConn.setDoInput(true);
                        urlConn.setDoOutput(true);
                        urlConn.setUseCaches(false);
                        urlConn.setRequestProperty("Content-Type", "application/json");
                        urlConn.setRequestProperty("Accept", "application/json");
                        urlConn.connect();

                        JSONObject jsonParam = new JSONObject();
                        jsonParam.put("nombre", params[2]);
                        jsonParam.put("direccion",params[3]);

                        OutputStream os = urlConn.getOutputStream();
                        BufferedWriter writer = new BufferedWriter(
                                new OutputStreamWriter(os, "UTF-8"));
                        writer.write(jsonParam.toString());
                        writer.flush();
                        writer.close();

                        int respuesta = urlConn.getResponseCode();

                        StringBuilder result = new StringBuilder();

                        if (respuesta == HttpURLConnection.HTTP_OK) {

                            String line;
                            BufferedReader br=new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
                            while ((line=br.readLine()) != null) {
                                result.append(line);
                                //response+=line;
                            }

                            JSONObject respuestaJSON = new JSONObject(result.toString());   

                            String resultJSON = respuestaJSON.getString("estado");   

                            if (resultJSON == "1") {     
                                devuelve = "User insertado correctamente";

                            } else if (resultJSON == "2") {
                                devuelve = "No se puede insertar";
                            }

                        }

                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                    return devuelve;

Y tratando de usar el Volley este es el codigo:

            case R.id.btn_insertar:
                url = INSERT;
                JsonObjectRequest postRequest = new JsonObjectRequest
                        (Request.Method.POST, url,(String) null, new Response.Listener<JSONObject>() {

                            @Override
                            public void onResponse(JSONObject response) {
                                tv_respuesta.setText(response.toString());
                            }

                        },
                        new Response.ErrorListener()
                        {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                               // tv_respuesta.setText("That didn't work!");
                                tv_respuesta.setText(error.toString());
                            }
                        }
                ) {

                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        Map<String,String> headers = new HashMap<String, String>();
                        headers.put("Content-Type", "application/json");
                        headers.put("Accept", "application/json");
                        return headers;
                    }

                    @Override
                    protected Map<String, String> getParams()
                    {
                        Map<String, String>  params = new HashMap<String, String>();
                        params.put("user","hola1");
                        params.put("direccion", "hola2");

                        return params;
                    }

                };
                queue.add(postRequest);
                 break;

El error que estoy obteniendo viene del "onErrorResponse" y es este:

  • com.android.volley.ParseError.org.json.JSONException: value <br of type java.lang.string cannot be converted to jsonobject

En lo que he investigado quiere decir que no puede traducir la respuesta que estoy mandando desde el servicio web al json en el android, a lo que no le encuentro mucho sentido pues el servicio funciona muy bien con el http, de cualquier forma este es el codigo php:

    public static function insert(
        $nombre,
        $direccion
    )
    {
        // Sentencia INSERT
        $comando = "INSERT INTO users ( " .
            "nombre," .
            " direccion)" .
            " VALUES( ?,?)";

        // Preparar la sentencia
        $sentencia = Database::getInstance()->getDb()->prepare($comando);

        return $sentencia->execute(
            array(
                $nombre,
                $direccion
            )
        );

    }

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

    // Decodificando formato Json
    $body = json_decode(file_get_contents("php://input"), true);

    // Insertar user
    $retorno = users::insert(
        $body['nombre'],
        $body['direccion']); 

    if ($retorno) {
        $json_string = json_encode(array("estado" => 1,"mensaje" => "Creacion correcta"));
        echo $json_string;
    } else {
        $json_string = json_encode(array("estado" => 2,"mensaje" => "No se creo el registro"));
        echo $json_string;
    }
}

Intenté borrando el "echo $json_string;" pero obtengo el mismo error, quizas el error sea muy sencillo pero he podido dar con el, agradeceria mucho si me pudiesen ayudar, gracias!

1 Respuesta

2votos

zgluis Puntos1340

Solucionado: Por alguna razón el getParams en la clase del Volley en Android, no estaba asignando los valores, por lo que le asigné un JsonObject manualmente a la Request, asi.

JSONObject OBJETO = new JSONObject();
        try {
            obj.put("uno", "dato1");
            obj.put("dos", "dato2");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    ...
        JsonObjectRequest postRequest = new JsonObjectRequest
                (Request.Method.POST, url,OBJETO, new Response.Listener<JSONObject>() {...}

0voto

Peter comentado

Gracias por compartir la solución! :)

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta