php

Enviar y recibir JSON con encabezados usando PHP y cURL

En este post voy a explicar cómo enviar datos codificados como JSON y cómo recibir datos igualmente de tipo JSON usando PHP y las funciones de cURL.

Al final seremos capaces de enviar datos JSON con PHP así como encabezados HTTP.

Gracias a que veremos cómo hacer esta comunicación podríamos conectar dos servidores de PHP en distintos hosts, o unificar el consumo de APIs de terceros en un solo lugar.

Recomendados

Dentro del código vamos a codificar y decodificar con JSON así que recomiendo pasar por este post. De igual manera vamos a usar el contructor array pero existe una versión más corta.

Nota: en este tutorial vamos a programar el servidor y el cliente con PHP; normalmente solo se haría una cosa, o programar el cliente o el servidor; pero de esta manera vemos cómo recibir y enviar datos.

Enviar datos JSON con cURL y PHP: cliente

Basta de charlas, es hora de mostrar el código. Veamos un ejemplo para enviar datos JSON con el método POST usando cURL en PHP:

<?php
/**
 * Ejemplo de cómo usar PHP, JSON y cURL para enviar
 * datos codificados a otro servidor
 * 
 * @author parzibyte
 */
# Definimos los datos que vamos a enviar, estos pueden venir de cualquier lugar
# Los hacemos complejos y largos para demostrar cómo se pueden anidar
$persona = [
    "nombre" => "Luis Cabrera",
    "edad" => 21,
    "esEstudiante" => true,
    "nickname" => "parzibyte",
    "sitioWeb" => "parzibyte.me",
    "lenguajes" => ["PHP", "Kotlin", "Java", "Go", "JavaScript"],
    "gustos" => [
        "musica" => ["Rolling Stones", "David Bowie", "The Sweet", "Queen", "Elvis Presley"],
        "libros" => [
            [
                "autor" => "Thomas Harris",
                "nombre" => "Dragón Rojo",
            ],
            [
                "autor" => "¿Sueñan los Androides con ovejas eléctricas?",
                "nombre" => "Philip K. Dick",
            ],
            [
                "autor" => "James Patterson",
                "nombre" => "El gato y el ratón",
            ],
            [
                "autor" => "Isaac Asimov",
                "nombre" => "El hombre bicentenario",
            ],
            [
                "autor" => "Stephen King",
                "nombre" => "Cementerio de animales",
            ],
            [
                "autor" => "Stephen King",
                "nombre" => "La milla verde",
            ],
        ]
    ]
];

// Los codificamos
// recomendado: https://parzibyte.me/blog/2018/12/26/codificar-decodificar-json-php/
$datosCodificados = json_encode($persona);

// Comenzar a crear el objeto de curl
# A dónde se hace la petición...
$url = "http://localhost/curl_json/api.php";
$ch = curl_init($url);

# Ahora le ponemos todas las opciones
# Nota: podríamos usar la versión corta de arreglos: https://parzibyte.me/blog/2018/10/11/sintaxis-corta-array-php/
curl_setopt_array($ch, array(
    // Indicar que vamos a hacer una petición POST
    CURLOPT_CUSTOMREQUEST => "POST",
    // Justo aquí ponemos los datos dentro del cuerpo
    CURLOPT_POSTFIELDS => $datosCodificados,
    // Encabezados
    //CURLOPT_HEADER => true,
    CURLOPT_HTTPHEADER => array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($datosCodificados), // Abajo podríamos agregar más encabezados
        'Personalizado: ¡Hola mundo!', # Un encabezado personalizado
    ),
    # indicar que regrese los datos, no que los imprima directamente
    CURLOPT_RETURNTRANSFER => true,
));
# Hora de hacer la petición
$resultado = curl_exec($ch);
# Vemos si el código es 200, es decir, HTTP_OK
$codigoRespuesta = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($codigoRespuesta === 200){
    # Decodificar JSON porque esa es la respuesta
    $respuestaDecodificada = json_decode($resultado);
    # Simplemente los imprimimos
    echo "<strong>El servidor dice que la hora de petición fue: </strong>" . $respuestaDecodificada->fechaYHora;
    echo "<br><strong>El servidor dice que el primer lenguaje es: </strong>" . $respuestaDecodificada->primerLenguaje;
    echo "<br><strong>Los encabezados que el servidor recibió fueron: </strong><pre>" . var_export($respuestaDecodificada->encabezados, true) . "</pre>";
    echo "<br><strong>Los gustos musicales que el servidor recibió fueron: </strong><pre>" . var_export($respuestaDecodificada->gustosMusicales, true) . "</pre>";
    echo "<br><strong>Los libros que el servidor recibió fueron: </strong><pre>" . var_export($respuestaDecodificada->libros, true) . "</pre>";
    echo "<br><strong>Mensaje del servidor: </strong>" . $respuestaDecodificada->mensaje;
}else{
    # Error
    echo "Error consultando. Código de respuesta: $codigoRespuesta";
}
curl_close($ch);

1 – Definición de datos

Comenzamos definiendo los datos que se van a enviar. Estos datos podrían venir de un formulario o de cualquier otro lugar. Los he hecho complejos a propósito para demostrar cómo enviar un objeto con arreglos, cadenas, booleanos, enteros, y arreglos de objetos.

2 – Crear objeto con curl_init y establecer opciones

Después creamos un objeto de cURL con curl_init, pasando la url como argumento. En este caso la URL es en localhost, si tú consultas otro servidor pon la url del mismo.

Más tarde establecemos las opciones de cURL como el tipo de petición HTTP (sería POST), los encabezados (En donde indicamos que el contenido es JSON, además de agregar encabezados personalizados) y los datos,  así como CURLOPT_RETURNTRANSFER en true para que devuelva la petición en lugar de imprimirla.

3 – Realizar y procesar petición

Para hacer la petición llamamos a curl_exec y luego comprobamos el código de respuesta; si es 200 significa que todo fue bien pero si no, lo indicamos.

Casi al final leemos la respuesta (veremos más abajo cómo programamos el servidor) que igualmente es json, imprimimos los campos y al final se ve así:

PHP y cURL – petición con JSON

En realidad he cambiado un poco los colores pero el código es el mismo.

Recibir y procesar datos con PHP y JSON

Para recibir los datos no es necesario cURL, pues solamente leemos la petición. Leemos el cuerpo y lo decodificamos, al final tendremos el objeto que fue enviado desde el cliente.

<?php
/**
 * Ejemplo de cómo usar PHP y JSON para recibir datos
 * de un cliente
 * 
 * @author parzibyte
 */# Recibimos los datos leídos de php://input
$datosRecibidos = file_get_contents("php://input");
# No los hemos decodificado, así que lo hacemos de una vez:
$persona = json_decode($datosRecibidos);
# Ahora podemos acceder a los datos, accederemos a unos pocos para demostrar
$nombreDePersona = $persona->nombre;
$lenguajes = $persona->lenguajes;
$primerLenguaje = $lenguajes[0];
$gustosMusicales = $persona->gustos->musica;
$libros = $persona->gustos->libros;
# Finalmente armamos la respuesta, igualmente como JSON
# sería como un espejo pero en otras circunstancias podrías devolver
# datos de una base de datos u otro medio
$respuesta = [
    "mensaje" => "He recibido los datos",
    "nombre" => $nombreDePersona,
    "primerLenguaje" => $primerLenguaje,
    "gustosMusicales" => $gustosMusicales,
    "libros" => $libros,
    "encabezados" => getallheaders(),
    "fechaYHora" => date("Y-m-d H:i:s"),
];

# Codificarla e imprimirla
$respuestaCodificada = json_encode($respuesta);
echo $respuestaCodificada;
# A partir de aquí no se debe imprimir otra cosa porque "ensuciaría" la respuesta

Una vez que llamamos a json_decode podemos acceder al objeto tal y como estaba cuando fue enviado. Este JSON fue enviado desde PHP pero podría haber sido enviado desde otro lenguaje o lugar.

Armamos una respuesta agregando un mensaje personalizado, indicando los encabezados que encontramos para agregar más detalles y la imprimimos.

Una confusión al comenzar a programar es que queremos hacer un return, pero eso no debe hacerse, se debe hacer un echo o alguna forma de imprimir los resultados en el documento.

Conclusión

Este fue un ejemplo muy básico pero lo hice de esta manera para los programadores que apenas comienzan.

Cabe mencionar que cURL no es la única manera de hacer una petición, también existen métodos como file_get_contents, librerías de terceros y más; además de que para las peticiones podemos usar cualquier lenguaje que hable HTTP y no siempre nos comunicaremos con JSON.

Si quieres ver otros ejemplos de consumos de APIs haz click aquí.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.