首页 > 解决方案 > Volley Kotlin 不会从 PHP 接收 JSON 对象

问题描述

我正在学习使用 volley,目前正在使用 MySQL 数据库和 PHP 文件进行登录和注册表单。我可以从发送包含数据的 JSON 对象的 POST 请求中获取数据,实际上数据已正确插入数据库中。我使用下一个 PHP 代码。

<?php

try {

    // Incluímos archivo de la conexión a base de datos
    include 'database.php';

    // Tomando los datos enviados por json
    $json = file_get_contents('php://input');
    // Pasando a php
    $data = json_decode($json, JSON_UNESCAPED_UNICODE);

    // Obtenemos los datos enviados por POST
    $nombre = $data['nombre'];
    $apellido = $data['apellido'];
    $correo = $data['correo'];
    $contrasenia = $data['contrasenia'];
    $telefono = $data['telefono'];

    // Código para buscar si el email está en uso
    $sqlCorreoEnUso = "SELECT id FROM usuarios WHERE correo = '{$correo}'";

    // Comprobando
    $consultaCorreo = mysqli_query($cn, $sqlCorreoEnUso);
    if (mysqli_num_rows($consultaCorreo)){
        echo json_encode([
            'respuesta' => 'error',
            'razon' => 'EmailEnUso'
        ]);
        exit;
    }
    
    // Código SQL para la consulta de inserción
    $sqlInsertarUsuario = "INSERT INTO usuarios(nombre, apellido, correo, contrasenia, telefono) VALUES ('{$nombre}','{$apellido}','{$correo}','{$contrasenia}','{$telefono}')";

    // Realizando
    if (mysqli_query($cn, $sqlInsertarUsuario)) {
        echo json_encode([
            'respuesta' => 'ok',
            'razon' => 'usuarioInsertado'
        ]);
    }

} catch (Exception $e) {

    // Visualizando el error si existe
    echo 'Error al procesar';
}

问题是,当我尝试处理使用 PHP 代码中的回显发送的 JSON 对象时,我想获取该 JSON 对象,以便始终根据代码执行时发生的情况获得反馈。当我尝试在 Kotlin 中读取此对象时,总是会收到此错误:

com.android.volley.ParseError: org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject

所以我认为这可能是在 PHP 中使用 echo 的问题,所以我尝试使用 POSTMAN 使用这个文件,它可以工作,我得到一个答案,要么字段 correo 是否已经取值。

使用已采用的 correo 值时:

{"respuesta":"error","razon":"EmailEnUso"}

当使用另一种从未使用过的:

{"respuesta":"ok","razon":"usuarioInsertado"}

这是 Kotlin 代码:

// Cola de peticiones
        val queue = Volley.newRequestQueue(this)

        // Tomamos los datos
        val nombre = etextNombreRegistro.text.toString()
        val apellido = etextApellidoRegistro.text.toString()
        val correo = etextCorreoRegistro.text.toString()
        val contrasenia = etextContraseniaRegistro.text.toString()

        // Guardando parámetros en hash para mandarlos como JSON en post
        val params = HashMap<String, String>()
        params["nombre"] = nombre
        params["apellido"] = apellido
        params["correo"] = correo
        params["contrasenia"] = contrasenia
        val jsonObject = JSONObject(params as Map<String, String>)

        // Petición con volley
        val request = JsonObjectRequest(Request.Method.POST, Urls.ServicioRegistro, jsonObject,
                { response ->
                    Toast.makeText(this, response.toString(), Toast.LENGTH_LONG).show()
                }, { error ->
                    Toast.makeText(this, "Error: " + error.toString(), Toast.LENGTH_LONG).show()
                    Log.d("MENSAJE", error.toString())
            }
        )

        // Procesandola
        queue.add(request)

为了在 Kotlin 中获取 JSON 对象作为答案,我必须使用另一种方法还是进行另一种解析?正如我所说,实际上 PHP 代码正在工作并且正在插入新记录,但是我如何才能接收 JSON 对象作为从 PHP 到 Kotlin 的答案而不会出现此错误?

标签: phpandroidjsonkotlinandroid-volley

解决方案


推荐阅读