Creación de una API RESTful con Laravel (sin autenticación)

  Tutorial: Creación de una API RESTful con Laravel (sin autenticación)

Aquí te muestro cómo crear una API básica en Laravel sin sistema de autenticación, ideal para prototipos rápidos o APIs públicas.

Paso 1: Crear el proyecto

bash
laravel nuevo api-simple
# O
composer create-project laravel/laravel api-simple
cd api-simple

Paso 2: Configurar la base de datos

Edita el archivo .env:

env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=api_simple
DB_USERNAME=root
DB_PASSWORD=

Paso 3: Crear modelo, migración y controlador

Vamos a crear un modelo Publicacion:

bash
php artisan make:model Publicacion -mcr

Paso 4: Definir la migración

Edita database/migrations/xxxx_create_publicacions_table.php:

php
public function up()
{
    Schema::create('publicacions', function (Blueprint $table) {
        $table->id();
        $table->string('titulo');
        $table->text('contenido');
        $table->string('autor')->default('Anónimo');
        $table->timestamps();
    });
}

Ejecuta la migración:

bash
php artisan migrate

Paso 5: Configurar el modelo

Edita app/Models/Publicacion.php:

php
protected $fillable = [
    'titulo',
    'contenido',
    'autor'
];

Paso 6: Crear el controlador API

Edita app/Http/Controllers/PublicacionController.php:

php
<?php

namespace App\Http\Controllers;

use App\Models\Publicacion;
use Illuminate\Http\Request;

class PublicacionController extends Controller
{
    // Obtener todas las publicaciones
    public function index()
    {
        return response()->json([
            'data' => Publicacion::all(),
            'message' => 'Publicaciones obtenidas correctamente'
        ], 200);
    }

    // Crear nueva publicación
    public function store(Request $request)
    {
        $request->validate([
            'titulo' => 'required|string|max:255',
            'contenido' => 'required|string',
            'autor' => 'nullable|string|max:100'
        ]);

        $publicacion = Publicacion::create($request->all());

        return response()->json([
            'data' => $publicacion,
            'message' => 'Publicación creada correctamente'
        ], 201);
    }

    // Obtener una publicación específica
    public function show($id)
    {
        $publicacion = Publicacion::find($id);
        
        if (!$publicacion) {
            return response()->json([
                'message' => 'Publicación no encontrada'
            ], 404);
        }

        return response()->json([
            'data' => $publicacion,
            'message' => 'Publicación obtenida correctamente'
        ], 200);
    }

    // Actualizar publicación
    public function update(Request $request, $id)
    {
        $publicacion = Publicacion::find($id);
        
        if (!$publicacion) {
            return response()->json([
                'message' => 'Publicación no encontrada'
            ], 404);
        }

        $request->validate([
            'titulo' => 'sometimes|string|max:255',
            'contenido' => 'sometimes|string',
            'autor' => 'nullable|string|max:100'
        ]);

        $publicacion->update($request->all());

        return response()->json([
            'data' => $publicacion,
            'message' => 'Publicación actualizada correctamente'
        ], 200);
    }

    // Eliminar publicación
    public function destroy($id)
    {
        $publicacion = Publicacion::find($id);
        
        if (!$publicacion) {
            return response()->json([
                'message' => 'Publicación no encontrada'
            ], 404);
        }

        $publicacion->delete();

        return response()->json([
            'message' => 'Publicación eliminada correctamente'
        ], 200);
    }
}

Paso 7: Definir las rutas

Edita routes/api.php:

php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PublicacionController;

// Rutas públicas para Publicaciones
Route::apiResource('publicaciones', PublicacionController::class);

// Ruta de ejemplo adicional
Route::get('/publicaciones/recientes', [PublicacionController::class, 'recientes']);

Paso 8: Añadir método adicional al controlador (opcional)

Si quieres usar la ruta /publicaciones/recientes, añade este método al controlador:

php
public function recientes()
{
    $publicaciones = Publicacion::orderBy('created_at', 'desc')
                               ->take(5)
                               ->get();

    return response()->json([
        'data' => $publicaciones,
        'message' => 'Últimas 5 publicaciones obtenidas'
    ], 200);
}

Paso 9: Probar la API

Puedes probar los endpoints con:

Obtener todas las publicaciones

text
GET http://localhost:8000/api/publicaciones

Crear nueva publicación

text
POST http://localhost:8000/api/publicaciones
Content-Type: application/json

{
    "titulo": "Mi primera publicación",
    "contenido": "Este es el contenido de mi publicación",
    "autor": "Juan Pérez"
}

Obtener publicación específica

text
GET http://localhost:8000/api/publicaciones/1

Actualizar publicación

text
PUT http://localhost:8000/api/publicaciones/1
Content-Type: application/json

{
    "titulo": "Título actualizado"
}

Eliminar publicación

text
DELETE http://localhost:8000/api/publicaciones/1

Obtener publicaciones recientes

text
GET http://localhost:8000/api/publicaciones/recientes

Paso 10: Habilitar CORS (si necesitas acceder desde frontend)

Instala el paquete CORS:

bash
composer require fruitcake/laravel-cors

Habilítalo en app/Http/Kernel.php añadiendo en el array $middleware:

php
\Fruitcake\Cors\HandleCors::class,

Conclusión

Ahora tienes una API RESTful básica sin autenticación con:

  • Operaciones CRUD completas

  • Validación de datos

  • Respuestas JSON estructuradas

  • Mensajes de estado claros

Comentarios

Entradas más populares de este blog

crear controladores separados para API y Web

Laravel tanto para web como para API al mismo tiempo.