Crear un servidor REST (Representational State Transfer) en PHP te permitirá ofrecer servicios web que pueden ser consumidos por otras aplicaciones. Esto se realiza mediante el uso de peticiones y respuestas HTTP, un protocolo de texto que te brinda flexibilidad para intercambiar información en diversos formatos como JSON o XML.
¿Cómo estructurar un servidor REST básico?
La construcción de un servidor REST comienza con la capacidad de procesar peticiones HTTP. Para eso, debes crear una estructura básica que interprete los métodos HTTP principales: GET, POST, PUT y DELETE. A continuación, te muestro cómo hacerlo:
<?php$method=$_SERVER['REQUEST_METHOD'];switch($method){case'GET':// Lógica para método GETbreak;case'POST':// Lógica para método POSTbreak;case'PUT':// Lógica para método PUTbreak;case'DELETE':// Lógica para método DELETEbreak;default:// Método HTTP no permitidohttp_response_code(405);break;}?>
Esta estructura permite al servidor responder adecuadamente a cada método HTTP y puede ser ampliada para manejar otros métodos según tus necesidades.
¿Cuál es la importancia de los recursos en REST?
En el contexto REST, un recurso es cualquier objeto, dato o colección de información que puedes exponer a través de tu servicio. En este ejemplo, consideremos que tienes un servidor con una base de datos de libros. Los posibles recursos podrían incluir:
Libros
Autores
Géneros
Para identificar estos recursos en tu servidor, puedes definir un arreglo que contenga los tipos de recursos disponibles:
$resources=['libros','autores','generos'];
Luego, verifica que el recurso solicitado sea válido al comparar con este arreglo.
¿Cómo validar los recursos solicitados?
La validación es esencial para manejar correctamente las peticiones entrantes. Asegúrate de que el recurso solicitado por el cliente esté dentro de los recursos definidos:
$resourceRequested=$_GET['resource'];// Supuesto recurso solicitado desde la URLif(!in_array($resourceRequested,$resources)){http_response_code(404);exit('Recurso no encontrado');}
Si el recurso solicitado no es válido, se devolverá un error 404, indicando que el recurso no fue encontrado.
¿Cómo proporcionar respuestas en formato JSON?
Una vez validado el recurso, puedes proceder a devolver una respuesta. Aquí se genera un ejemplo en que devuelves una colección de libros en formato JSON:
$libros=[['titulo'=>'Lo que el viento se llevó','autor'=>'Margaret Mitchell','genero'=>'Ficción'],['titulo'=>'La Ilíada','autor'=>'Homero','genero'=>'Épica'],['titulo'=>'La Odisea','autor'=>'Homero','genero'=>'Épica']];if($method==='GET'){header('Content-Type: application/json');echojson_encode($libros);}
Con esto, le informas al cliente que el contenido de la respuesta es de tipo JSON usando header() y luego utilizas json_encode() para convertir el arreglo PHP a JSON.
¿Cómo probar el servidor REST?
Para probar tu servidor, usa el servidor incorporado de PHP y realiza una prueba desde otra terminal. Primero, inicia el servidor:
php -S localhost:8000 -t .
Luego, realiza una petición al servidor mediante curl:
curl http://localhost:8000?resource=libros
Esta petición debería retornar el listado de libros en formato JSON. Para un formato más legible, puedes usar jq, una herramienta para trabajar con JSON desde la línea de comandos:
curl http://localhost:8000?resource=libros | jq
A través de este enfoque, proporcionas una forma robusta y eficiente para que las aplicaciones interactúen con tus servicios, y estableces un marco fundamental para el desarrollo de APIs REST en PHP. Con estos fundamentos, podrás expandir tus servicios web a medida que tus necesidades crezcan, y te animo a seguir explorando y desarrollando tus habilidades en esta área.
Hola, como estan?
Por si tuvieron algun problema, dejo abajo el código de ejemplo con los comandos para ejecutar en la terminal.
Espero que les sea de ayuda.
Saludos,
<?php
// CLASE 06 - Exponer datos a traves de HTTP GET// Definimos los recursos disponibles$allowedResourceType =['books','authors','genres',];// Validamos que el recurso este disponible$resourceType = $_GET['resource_type'];if(!in_array($resourceType, $allowedResourceType)){ 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');// Generamos la respuesta asumiendo que el pedido es correctoswitch(strtoupper($_SERVER['REQUEST_METHOD'])){case'GET': echo json_encode($books);break;case'POST':break;case'PUT':break;case'DELETE':break;}// Inicio el servidor en la terminal 1// 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
Te anexo el comando para ver la información a través de los encabezados:
y también gracias por compartir el código del profe.
Muchas gracias @MarlaCpp !!!
Mi codigo en js
const express =require("express");const bodyParser =require("body-parser");const router = express.Router();var app =express();app.use(bodyParser.json());app.use(router);const books =[{titulo:'Lo que el viento se llevo',id_autor:'2',id_genero:'2'},{titulo:'La Iliada',id_autor:'1',id_genero:'1'},{titulo:'La Odisea',id_autor:'1',id_genero:'1'}]router.get("/",function(req, res){console.log(req.query);console.log(req.body); res.json(books)});app.listen(3000);console.log("La aplicacion esta escuchando en http://localhost:3000");```
Que linda la simplicidad y legibilidad que maneja Javascript. O será que de tanto usarlo y verlo se me hace facil jajajaj.
Pero hay que tener en cuenta tambien que esta usando express, porque manejar el resto de eventos con node nativo es mas extenso
El curso esta interesante, sin embargo lo que no me gusta es que es con PHP y al comienzo dice que no es indispensable pero cuando ya llevas 3 videos que es con codigo de PHP, te das cuenta que si es indispensable PHP, pero no estoy interesado en aprender PHP. Se debería crear un curso así para Python.
Gracias.
Totalmente. Me pasó lo mismo.
Bajo esa lógica, vendrá otro pidiendo que se haga así para JS, y otro pidiendo que se haga así, pero con Java, etc. No tienes que sentarte a estudiar PHP. Con lo que ves entiendes perfectamente.
Hice el ejemplo de esta clase con Python y Flask.
api =Api(app)books =[{'isbn':'744586','title':'Cien años de soledad','description':'Lorem insup lol.','autor':'Gabriel Garcia Marquez'},{'isbn':'7894546','title':'De animales a dioses','description':'Lorem insup lol.','autor':'Yuval Noah Harari'}]classBooks(Resource): def get(self):returnmake_response(jsonify({'books': books}),200)classAuthors(Resource): pass
classGeneres(Resource): pass
api.add_resource(Books,'/books')api.add_resource(Authors,'/authors')api.add_resource(Generes,'/generes')if __name__ =='__main__': app.run(debug=True)
Te quedó muy bien
Hasta php estoy aprendiendo en este curso :O
Levantar el servidor en php:
$ php -S localhost:8000 server.php
Realizar la consulta:
$ curl http://localhost:8000 -v$ curl http://localhost:8000?resource_type=books
6 - Exponer datos a traves de HTTP GET
Desarrollar un servidor capaz de recibir peticiones por medio de http y devolver respuestas por medio http, el protocolo de http puede trabajar con cualquier formato de texto, puede ser json, xml. La idea es exponer los recursos disponible en servidor para que sean solicitado. Un recurso puede ser una colección o un elemento único.
Se indica al cliente que lo que recibirá una respuesta es un json
header('Content-Type: application/json');
Se define una estructura básica que interpreta que verbo se está usando en la petición para ello se utiliza un switch y se utilizará la siguiente variable para saber que método se está usando:
Luego se inicia el servidor web para hacer la prueba Se realiza la consulta por medio de curl, se debe posicionar en la carpeta donde se encuentra el archivo server.php
# Se importa la clase Flask para poder iniciar el sevidor
# Se importa el modulo jsonify para dar el formato JSON a nuestras estructuras de datos
# Se importa el modulo request para poder tener acceso a los verbos HTTPfrom flask importFlask, jsonify, request
# Creamos una instancia de la clase Flaskapp =Flask(__name__)# Creamos una lista de diccionarios, que nos servira como BDDlibros =[{"titulo":"Cien años de soledad","autor":"Gabriel Garzia Marquez","genero":"Novela"},{"titulo":"Harry Potter: La piedra filosofal","autor":"J.K. Rowling","genero":"Fantasia"}]# Creamos una ruta con la que cual se podra acceder al servidor a traves del metodo GET@app.route("/libros", methods=["GET"])def mostrar_libros(): # Retornamos nuestra lista, con el formato JSONreturnjsonify({"libros": libros})# Este es el punto de entrada de nuestra aplicacion, es buena practica colocarlo
if __name__ =="__main__": # Inciamos nuestro servidor, el parametro DEBUG permite que los cambios en nuestro codigo se actualicen en tiempo real
# Con el parametro PORT establecemos el puerto de escucha de nuestro servidor
app.run(debug=True, port=8000)```
tqm no queria usar PHP
¿qué es más recomendable? ¿establecer una conexión permanente con el servidor, o en cada petición, efectuar la conexión?
No se si sirva para después pero por si acaso aquí les dejo los arrays que construí con amor para jugar con las peticiones
<?php
//definimos los recursos disponibles$allowedResourceTypes =['books','authors','genders'];//validamos que el recurso este disponible$resourceType = $_GET['resource_type'];if(!in_array($resourceType, $allowedResourceTypes)){ die;}//definos los recursos$books =[0=>['title'=>'Lo que el viento se llevo','id_author'=>1,'id_gender'=>1],1=>['title'=>'La iliada','id_author'=>0,'id_gender'=>0,],2=>['title'=>'La riqueza de las naciones','id_author'=>2,'id_gender'=>2,],3=>['title'=>'El diario de Ana Frank','id_author'=>3,'id_gender'=>3,],4=>['title'=>'La odisea','id_author'=>0,'id_gender'=>0,],5=>['title'=>'Teoría de los sentimientos morales','id_autor'=>2,'id_gender'=>2,]]; $genders =[0=>['id_genders'=>0,'genero'=>'poeseia/epopeya',],1=>['id_genders'=>1,'genero'=>'novela',],2=>['id_genders'=>2,'genero'=>'politica/naturaleza humana',],3=>['id_genders'=>3,'genero'=>'autobiografia',]]; $authors =[0=>['id_authors'=>0,'athors'=>'Homero',],1=>['id_authors'=>1,'athors'=>'Margaret Mitchell',],2=>['id_authors'=>2,'athors'=>'Adam Smith',],3=>['id_authors'=>3,'athors'=>'Ana frank',],];header('Content-Type:application/json');// Generamos la respuesta asumiendo que el pedido es correctoswitch(strtoupper($_SERVER['REQUEST_METHOD'])){case'GET': echo json_encode($books);break;case'POST':break;case'PUT':break;case'DELETE':break;}```
¿Cual es la diferencia entre PUT y PATCH?
Este vídeo puede ayudarte con tu duda. 👇️
++Cuales son las diferencias entre PUT y PATCH?++
PUT: permite actualizar todos los datos un objeto.
PATCH: actualiza algunos datos de un objeto json.
**Apuntes: **
Para los que usan IIS y tienen algunas dudas:
Levantar un servidor: php -S tudominio.local.com:8000 nombreArchivo.formato
Para hacer consulta CURL: curl http://tudominio.local.com:80
Para hacer consulta CURL con más detalles: curl http://tudominio.local.com:80 -v
Consecuentemente, Definimos los recursos disponibles, declarando los parametros que van a pasar por el Query string, luego validamos que el recurso esté disponible, en caso de no estarlo podemos detener la ejecución del script, luego de esto definimos los recursos (En la vida real, los libros estarían disponibles en una DB) y finalmente validamos la respuesta asumiendo que el pedido es correcto.
Gracias Kike por la info.
Por si alguno le pasa que no hace match, si tienes zsh es probable que tu URL necesite (" ") si no, no funcionara.
Todo estuvo muy bien menos que haya utilizado PHP para este curso.. La mayoría de gente se esta enfocando en Python, Go, Angular, .Net, javascript. etc. El instructor seleccionó el menos indicado. Estoy buscando mas cursos de Rest API en Platzi pero no hay mas. Eso si estuvo muy mal.
Totalmente de acuerdo. Estoy aprendiendo y hasta los momentos, sé de Python y Javascript, se me hace complejo entender ahora PHP.
Les comparto el código que hice, me inspiré en las novelas de Julio Verne
Estructuré un poquito author y genre en arreglos para agregarles un id y name
Agregué los comentarios en inglés (para aquellos que no les gusta mesclar ambos idiomas)
<?php
// Defining allowed type resources$alloweResourceTypes =['books','authors','genres',];// Validating the availability of the resource$resourceType = $_GET['resource_type'];// in_array() funcion verifies that an element belongs to the arrayif(!in_array( $resourceType, $alloweResourceTypes )){ die;//end script }// Defining resources: book$books =[1=>['title'=>'A Journey to the Center of the Earth','author'=>['id_autor'=>210,'name_author'=>'Jules Verne'],'genre'=>['id_genre'=>1,'name_genre'=>'Science Fiction'],],2=>['title'=>'From the Earth to the Moon','author'=>['id_autor'=>210,'name_author'=>'Jules Verne'],'genre'=>['id_genre'=>1,'name_genre'=>'Science Fiction'],],3=>['title'=>'Twenty Thousand Leagues Under the Sea','author'=>['id_autor'=>210,'name_author'=>'Jules Verne'],'genre'=>['id_genre'=>1,'name_genre'=>'Science Fiction'],],4=>['title'=>'The Mysterious Island','author'=>['id_autor'=>210,'name_author'=>'Jules Verne'],'genre'=>['id_genre'=>1,'name_genre'=>'Science Fiction'],],];header('Content-Type: application/json');// Generating the response asumming that the request is correctswitch(strtoupper($_SERVER['REQUEST_METHOD'])){case'GET': echo json_encode($books);break;case'POST':break;case'PUT':break;case'DELETE':break;}
Que curiosa la sintaxis de PHP para declarar los diccionarios.