¿Cómo permitir que otros incorporen datos a tu servidor a través de HTTP POST?
Añadir datos a un servidor mediante HTTP POST es una habilidad esencial para cualquier desarrollador web. A través de este método, posibilitamos que otros usuarios o aplicaciones integren nuevos datos en nuestro sistema. Empecemos por entender cómo hacerlo de manera eficaz utilizando el lenguaje de programación PHP.
¿Qué es HTTP POST y por qué es importante?
HTTP POST es uno de los métodos de petición más utilizados en la web. Se emplea principalmente para enviar datos al servidor, generalmente para crear o actualizar recursos. A diferencia de GET, que solicita datos, POST permite enviar datos más complejos y extensos, ya que no hay restricciones en el tamaño de la URL.
¿Cómo interpretar los datos en formato JSON?
Al establecer una API, decidimos que los datos se recibirán en formato JSON, una práctica común debido a su simplicidad y amplio soporte en diversos lenguajes. Este formato permite estructurar la información de manera más comprensible y fácil de manipular. Al recibir un POST, la información se captura y maneja en PHP a través de la variable php://input, que nos proporciona el contenido completo del cuerpo de la petición.
Aquí un ejemplo de cómo podríamos procesar estos datos:
Imaginemos que gestionamos una colección de libros. Queremos permitir añadir un nuevo libro a través de la API. Una vez decodificados los datos JSON recibidos, podemos integrarlos en nuestra estructura existente y devolver información útil como el ID del nuevo libro añadido.
functionaddNewBook($books,$newBookData){$books[]=$newBookData;end($books);returnkey($books);// Devuelve el ID del nuevo libro creado.}// Asumiendo que $books es nuestra colección existente y $newBookData el nuevo libro.$newBookId=addNewBook($books,$data);
¿Cómo verificar la correcta inserción del nuevo libro?
Para comprobar que el nuevo libro se ha añadido correctamente, devolvemos el ID generado. Esto proporciona una indicación clara de que la operación fue exitosa. Posteriormente, podríamos verificar el contenido de toda la colección si fuera necesario:
echojson_encode($books);
¿Cómo realizar una petición POST con curl?
Para practicar, puedes simular peticiones POST utilizando curl, una herramienta de línea de comandos versátil y poderosa. La siguiente instrucción realiza una solicitud POST hacia nuestro servidor local:
Este comando utiliza el modificador -X POST para definir el tipo de solicitud y -d para incluir los datos JSON que se envían al servidor.
Con estas pautas, has aprendido a manejar incorporaciones de datos mediante HTTP POST, enriqueciendo y extendiendo las capacidades de tu servidor. Continúa explorando y experimentando con estos conceptos para fortalecer tus habilidades de desarrollo web. ¡Adelante!
El problema con CMD de Windows está en que no soporta comillas simples, por lo tanto, debemos sustituir su uso por comillas dobles.
Para incluir los datos en json tenemos dos opciones:
Podemos usar el caracter de escape backslash ( \ ) antes de cada comilla dentro de los datos JSON:
Para los que usan Windows, pueden usar el la consola de Ubuntu TLS para windows, que esta disponible en la store, asi se facilitan 10 años la vida y no tienen que hacer inventos raros para que funcione.
pd: pasense a linux, el mundo de programador es mas bonito desde este lado jaja
Gracias por la recomendación.
x2 tengo 8 meses usando linux, en general tengo menos problemas con el software que con windows
Apuntes:
Para el caso de POST, debemos validar dentro de la sentencia switch en el caso de que el verbo en la petición sea POST. Debemos asumir que los datos enviados, vengan en formato JSON, tipo de datos que definiríamos en primera instancia al crear nuestro web service.
Al momento de hacer la consulta mediante CURL, usamos a diferencia de GET, el modificador X luego del curl, seguido de esto, especificamos con ‘POST’, seguido escribimos la URL, el puerto y el identificador al que queremos agregar el elemento (en este caso books). Finalmente escribimos el modificador -d y escribimos la cadena JSON con los datos que vamos a almacenar.
IMPORTANTE
Para los que no les funcionó con el CMD de Windows, prueben de esta manera:
curl -H "Content-Type: application/json" -X POST -d "{ \"titulo\":\"Nuevo Libro\",\"id_autor\": 1,\"genero\": 2}" http://localhost:8000/books
Muchas gracias!!
Muy importante Kike, gracias.
Lo que va de la clase:
<?php
// CLASE 06 - Exponer datos a traves de HTTP GET// definimos los recursos disponibles $allowedResourceTypes =['books','authors','genres'];$resourceType = $_GET['resource_type'];if(!in_array($resourceType, $allowedResourceTypes)){ die;}// Defino los recursos$books =[1=>['titulo'=>'Lo que el viento se llevo','id_autor'=>2,'id_genero'=>2,],2=>['titulo'=>'La Iliada','id_autor'=>1,'id_genero'=>1,],3=>['titulo'=>'La Odisea','id_autor'=>1,'id_genero'=>1,],];// Se indica al cliente que lo que recibirá es un jsonheader('Content-Type: application/json');// Levantamos el id del recurso buscado$resourceId =array_key_exists('resource_id', $_GET)? $_GET['resource_id']:'';// Generamos la respuesta asumiendo que el pedido es correcto y devilvemos en formafo jsonswitch(strtoupper($_SERVER['REQUEST_METHOD'])){case'GET':// en caso de que no pidan ningun recursoif(empty( $resourceId )){ echo json_encode( $books );}else{// si llegan a pedir un recurso en especificoif(array_key_exists( $resourceId, $books)){ echo json_encode( $books[ $resourceId ]);}}break;case'POST': $json =file_get_contents('php://input'); $books[]=json_decode($json,true);// echo array_keys( $books )[count($books) -1]; echo json_encode($books);break;case'PUT':break;case'DELETE':break;}// Inicio el servidor en la terminal 1, aqui le asignamos el puerto 8000// php -S localhost:8000 server.php// Terminal 2 ejecutar // curl http://localhost:8000 -v// curl http://localhost:8000/\?resource_type\=books// curl http://localhost:8000/\?resource_type\=books | jq// ver la comunicacion a través de los encabezados:// $ curl http://localhost:8000/\?resource_type\=books -v > /dev/null// consulta//$curl "http://localhost:8000?resource_type=books&resource_id=1"//curl -X 'POST' http://localhost:8000/books -d '{"titulo":"Nuevo Libro","id_autor":1,"id_genero":2}'?>
Muchas gracias por este aporte, incluso los comentarios al final me ayudaron mucho.
este aporte es de lo mejor, los comandos hasta funcionan en Windows! muchas gracias
Para enviar un Json por CMD de Windows, sustituimos lo que debe llegar con comillas dobles, con doble comillas dobles:
const express =require('express');const app =express();const bodyParser =require('body-parser');// Middlewares para recibir JSON a traves del API en expressapp.use(bodyParser.urlencoded({extended:false}));app.use(bodyParser.json());// Parametros permitidos para "resource_type"const allowedResources =['books','authors','genres'];// Array de objetos que contienen los librosconst books =[{title:'Lo que el viento se llevo',id_author:2,id_genre:2},{title:'La Iliada',id_author:1,id_genre:1},{title:'La odisea',id_author:1,id_genre:1}];app.get('/',(req, res)=>{// Obtiene "resource_type" de los parámetros del URLconst resourceType = req.query.resource_type;// Verifica si existe este parámetro en nuestro arreglo de permitidosif(allowedResources.indexOf(resourceType)===-1){// Devuelve error si no se encuentrareturn res.json({status:'Failed',error:'missing or invalid param: resource_type'});}// Si sale todo bien, devuelve un ok junto a los libros res.json({status:'ok', books });});app.post('/books',(req, res)=>{// Verifica si se envian datos por formularioif(req.body){// Verifica si falta "title", "id_author" o "id_genre"if(!req.body.title||!req.body.id_author||!req.body.id_genre){// Devuelve error si falta algunoreturn res.json({status:'failed',error:'missing or invalid: data'});}// Inserta un nuevo objeto al array, y devuelve el id insertado // (característica javascript)const insertCount = books.push({title: req.body.title,id_author: req.body.id_author,id_genre: req.body.id_genre})// Devuelve ok y el id insertado si todo salió bien res.json({status:'ok',insert_id: insertCount -1, books })}else{// Devuelve un error si no se envian datos por formularioreturn res.json({status:'Failed',error:'error no data'});}})// Iniciador del servidor, en el puerto 5000app.listen(5000,()=>{console.log('server on port 5000');});
O si usan POSTMAN, insertarlos con "x-www-form-urlencoded"
Gran aporte a la comunidad de Javascript! Gracias!
Mi primer post con php :v
Estamos igual, mis primeros pasos de frontend a backend 😭
Para que me funcionara tuve que reemplazar
$books[] = json_decode($json, true);
por
array_push($books, json_decode($json, true));
:P
¿Alguien sabe por qué casi al final cuando prueba la línea de código que imprime el json con todos los libros, no aparece un quinto elemento? Porque tengo entendido que vuelve a ejecutar la petición POST por ende se debería de insertar nuevamente, no? :(
a mi no me funcionó insertar desde consola por método post
Es porque no esta usando una base de datos en donde se almacenen los datos.
Si en Windows no les funciono los aportes anteriores, aqui dejo el mio que me funciono correctamente desde una terminal de Powershell…
$datos ="{\"titulo\": \"El nuevo libro\",\"id_autor\":\"1\",\"id_genero\":\"2\"}"
Para poder ingresar el nuevo libro, tuve que crearlo así;
A muchos les puede ayudar, esta creado en la terminal bash.
Usen Git Bash, la solución a todos los problemas con CMD 😄
lo hice con una base de datos, pues asi es como necesito ahora aprender :b
case'POST'://Declaramos la variable $query ='';//Obtenemos el json que se envia a la api $json =file_get_contents('php://input');//Lo convertimos a un array de php $dataPostBlog[]=json_decode($json,true);//lo recorremos con un for eachforeach($dataPostBlog as $row){//Creamos el query para cada json $query .= "INSERTINTOposts(title,status,content,user_id)VALUES('".$row["title"]."','".$row["status"]."','".$row["content"]."','".$row["user_id"]."')";//Hacemos el insert $result =mysqli_multi_query($connect,$query);}break;
Me encontre que como no cambie la ruta, osea que todavia tengo que mandar la url completa especificando los parametros no me mostraba nada, me di cuenta de esto a la mitad de del ejeercicio, les cuento esto para que aprendan a debugear y asi se daran cuenta que tanto han aprendido y lo que pueden reforzar es unexcelente ejercicio para comprender un poco mas el tema que estan viendo
a mi no me funcionaba el comando de curl hasta que lo usea así curl -H "Content-Type: application/json" -X POST -d "{ "titulo":"Nuevo Libro","id_autor": 1,"genero": 2}" http://localhost:8000/books