Ir al contenido

Desarrollo de API

Desarrollo de API con Laravel

APIs contra las que otros equipos pueden construir - un contrato generado, autenticación con un solo dueño, política de versiones y paginación que sobrevive al crecimiento de los datos.

Una API es una promesa hecha a alguien que no está en la sala. Ahí está toda la diferencia entre construir una API y construir el resto de una aplicación: sus propias pantallas pueden cambiar a la vez que el código que hay detrás, y un consumidor no.

La mayoría de las APIs Laravel que nos piden arreglar se construyeron como si eso no fuera cierto.

El contrato se genera, no se describe

Una especificación escrita a mano en un wiki queda desactualizada en dos sprints, y la primera persona en descubrirlo es un consumidor que ya construyó contra ella.

Así que el contrato sale del código: recursos tipados, validación de peticiones de la que se deriva la especificación, y un documento OpenAPI generado y publicado como parte de la compilación. Un cambio en la forma de una respuesta cambia el documento en el mismo pull request. Solo puede estar mal si el código está mal.

Los recursos son explícitos, no un modelo entregado a toJson(). Devolver un modelo directamente significa que una columna añadida por un motivo interno pasa a formar parte del contrato público el día en que se añade - y quitarla después es un cambio incompatible que usted nunca quiso hacer.

Versiones, decididas antes de necesitarlas

La versión uno es gratis y la dos no, así que la decisión que conviene tomar pronto es dónde vive la versión y qué cuenta como ruptura.

Añadir un campo no rompe nada. Quitarlo, renombrarlo, cambiarle el tipo o endurecer la validación, sí. La forma de la paginación, la forma de los errores y el formato de las fechas son parte del contrato aunque nadie los escriba como tales - y cada uno de los tres ha roto a un consumidor al menos una vez en nuestra experiencia.

Lo que dejamos montado es una política: los cambios aditivos salen de forma continua, los incompatibles reciben una versión nueva, ambas versiones conviven durante una ventana acordada, y a los consumidores se les avisa en lugar de que se enteren.

Autenticación con un solo dueño

Sanctum para clientes propios, Passport donde OAuth2 haga falta de verdad, y en ambos casos un único sitio que decide qué puede hacer un token.

El fallo que encontramos es la duplicación: un permiso comprobado en una policy para las rutas web y vuelto a implementar en un middleware para las rutas de la API, separándose poco a poco hasta que uno de los dos está equivocado. La autorización vive en policies a las que llaman ambas entradas, y las pruebas de la API afirman los casos negativos - no que la persona correcta pueda leer el registro, sino que la incorrecta no pueda.

Límite de peticiones por consumidor y no por IP, porque por IP se castiga a una oficina y se deja pasar un script. Habilidades acotadas a aquello para lo que existe el token, de modo que un token móvil filtrado no sea un token de administrador.

Lo que se rompe con datos reales

Paginación. La paginación por desplazamiento va bien hasta la página cuatrocientos, momento en el que la base de datos lee y descarta cuatrocientas páginas para darle una. Paginación por cursor para todo lo que crezca, decidida en el diseño porque cambiarla después es un cambio incompatible.

Filtrado y ordenación. Cada filtro que un consumidor puede pasar es un plan de consulta que usted tiene que poder servir. Una lista de permitidos, con un índice detrás de cada entrada, o ha publicado un endpoint que cualquiera con un token puede volver arbitrariamente lento.

Inclusiones. Dejar que un consumidor pida relaciones anidadas es una buena función y un generador de N+1. Carga anticipada dirigida por las inclusiones pedidas, con un límite de profundidad, o la comodidad se convierte en una caída.

Errores. Una sola forma, documentada, con un código legible por máquina que no cambia cuando cambia el mensaje legible por personas. Un consumidor que analiza sus cadenas de error es un consumidor al que va a romper por mejorar sus textos.

Cómo transcurre un encargo

Empieza por los consumidores. Mándenos quién llama a esta API, qué hace con ella, y el endpoint que más tickets de soporte ha generado. Con eso suele bastar para dimensionarlo.

Lo que vuelve es un alcance escrito: la lista de endpoints, la decisión de autenticación, la política de versionado, y qué entra en la primera fase frente a lo que deliberadamente no entra. Lleva un precio y es el documento al que se refiere el contrato, de modo que lo que usted firma y lo que nosotros construimos son la misma cosa.

Después el trabajo, en su repositorio y su proceso de revisión. La especificación se genera y se publica desde la primera fase, así que sus consumidores la leen mientras la API todavía se está construyendo.

Qué recibe

La API, la especificación generada y publicada donde los consumidores puedan alcanzarla, una batería de pruebas que cubre los negativos de autorización y los límites de la paginación, el límite de peticiones configurado por consumidor, y una política de versiones escrita que dice qué va a cambiar y qué no sin avisar.

Cuando la API se añade a una aplicación existente, recibe además lo que ese trabajo suele sacar a la luz: una lista de reglas de negocio que vivían en los controladores, y dónde viven ahora para que las dos entradas coincidan.

Sanctum o Passport fija cómo se autentican los consumidores, y es mucho más fácil fijarlo que cambiarlo después. La pregunta más difícil que hay debajo es si Laravel es siquiera el runtime adecuado para esta API. Y si el trabajo de la API es sobre todo hablar con la de otro, integración encaja mejor.

Alcance y condiciones

Modelo de colaboración
Alcance cerrado, acordado por escrito antes de empezar. No es una tarifa por día contra una lista abierta.
Precio y plazo
Los dos se fijan por proyecto, una vez fijado el alcance. Se ofertan juntos, antes de construir nada.
Qué necesitamos de usted
Una persona que pueda aprobar decisiones, y acceso a su repositorio y a su gestor de incidencias.
No incluido
Todo lo que quede fuera del alcance acordado. Pasa a ser su propio alcance, no una modificación.
Costes de terceros
El alojamiento, las licencias, las tarifas de API y las suscripciones SaaS los contrata y paga usted.
Facturación
Codefacture Yazılım A.Ş., Türkiye. EUR, USD o GBP por transferencia, sin IVA turco en servicios exportados.

Preguntas frecuentes

¿Sanctum o Passport?
Sanctum para un frontend propio o una aplicación móvil que también es suya, que es la mayoría de los casos. Passport cuando de verdad necesita OAuth2: clientes ajenos que usted no controla, pantallas de consentimiento, tokens con ámbito emitidos a otras empresas. Elegir Passport para una SPA propia es un error frecuente y caro.
¿Escriben ustedes la especificación OpenAPI?
La generamos desde el código en lugar de escribirla al lado del código, porque una especificación escrita a mano está equivocada en dos sprints y nadie se entera hasta que un consumidor integra contra ella. Generada, solo puede estar mal si el código lo está.
¿REST o GraphQL?
REST salvo que algo concreto diga lo contrario. GraphQL resuelve un problema real - muchos clientes con necesidades de datos distintas - y trae los suyos, sobre todo el control del coste de las consultas y el almacenamiento en caché. Si tiene uno o dos consumidores y son suyos, suele ser complejidad comprada sin retorno.
¿Pueden añadir una API a una aplicación existente?
Sí, y es más habitual que una API desde cero. El trabajo va menos de rutas que de encontrar las reglas de negocio que hoy viven en los controladores y en las form requests, y llevarlas a un sitio al que puedan llamar tanto la web como la API.
Llamar+1 848 272 7583WhatsApp+90 850 308 5436Correoinfo@codefacture.comPágina de contacto