Construye una API REST con Laravel

2019-12-06 Laravel
Tags   Laravel 6x

Crear una REST API es una tarea bastante sencilla y enriquecedora en Laravel. Es por esto que el día de hoy aprederás a crer un servicio web REST mediante una API creada con Laravel 6. Si aún tienes algunos vacíos conceptuales sobre los sistemas RESTful te recomandamos visitar nuestro anterior post API REST, después de esto serás todo un experto.

Crea el proyecto

Lo primero que debes hacer es realizar la instalación de un proyecto nuevo en laravel con el siguiente comando:

laravel new api-rest

Si aún no tienes habilitado el comando laravel en tu computadora te recomandamos visitar nuestro post Instalación Laravel para abarcar todo lo relacionado con la instalación y preparación de un etorno para laravel.

Crea el Controlador API

Para el controlador de la API vamos a hacer uso de un resource controller dado que ya contiene los métodos necesarios y verbos HTTP que necesitamos. Puedes obtener más información sobre este tipo de controladores en nuestor post Resource Controllers en Laravel.

php artisan make:controller ApiController --resource

Lo siguiente que debemos hacer es implementar las funcionalidades del CRUD en el controlador. Para este ejemplo específico vamos a omitir la capa de base de datos y vamos a realizar modificaciones sobre un archivo plano para simplificar el ejercicio. El objetivo de este controlador es mostrar la funcionalidad básica de una API REST, por lo tanto, se omiten muchas validaciones, refactorización y el estándar PSR. Nuestro controlador quedaría de la siguiente manera.

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class ApiController extends Controller
{
    public function __construct()
    {
        if (!Storage::disk('local')->exists('file.txt'))
            Storage::disk('local')->put('file.txt', '');
    }

    private function toArray($data)
    {
        $parsed = [];

        foreach ($data as $line) {
            $row = explode(',', $line);

            if (count($row) === 3)
                $parsed[$row[0]] = [
                    'code' => $row[0],
                    'language' => $row[1],
                    'developer' => $row[2],
                ];
        }

        return $parsed;
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $line = $request->input('code') . ',' .
            $request->input('language') . ',' .
            $request->input('developer');

        $response = Storage::disk('local')->prepend('file.txt', $line);

        return response()->json([
            'status' => ($response) ? 'created' : 'failed'
        ]);
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $data = explode(PHP_EOL, Storage::disk('local')->get('file.txt'));
        $languages = $this->toArray($data);

        $response = [
            'status' => 'not found'
        ];

        if (in_array(1, array_column($languages, 'code'))) {
            foreach ($languages as $key => $language) {
                if ($id == $key) {
                    $response = $language;
                    break;
                }
            }
        }

        return response()->json($response);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $data = explode(PHP_EOL, Storage::disk('local')->get('file.txt'));
        $languages = $this->toArray($data);

        foreach ($languages as $key => $language) {
            if ($id == $key) {
                $line = [
                    'code' => $language['code'],
                    'language' => $request->input('language'),
                    'developer' => $request->input('developer')
                ];

                $languages[$key] = $line;
                break;
            }
        }

        foreach ($languages as $key => $language) {
            $languages[$key] = implode(',', array_values($language));
        }

        $response = Storage::disk('local')->update('file.txt', implode(PHP_EOL, $languages));

        return response()->json([
            'status' => ($response) ? 'updated' : 'failed'
        ]);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $data = explode(PHP_EOL, Storage::disk('local')->get('file.txt'));
        $languages = $this->toArray($data);

        foreach ($languages as $key => $language) {
            if ($id == $key) {
                unset($languages[$key]);
                break;
            }
        }

        foreach ($languages as $key => $language) {
            $languages[$key] = implode(',', array_values($language));
        }

        $response = Storage::disk('local')->update('file.txt', implode(PHP_EOL, $languages));

        return response()->json([
            'status' => ($response) ? 'deleted' : 'failed'
        ]);
    }
}

Crea la ruta

Finalmente basta crear la ruta para acceder a la API en el archivo de rutas.

Route::resource('file', 'ApiController');

Con esto, ya podemos proceder a probar nuestra API. Por flexibilidad, hemos realizado las pruebas levantando el servidor desde artisan.

php artisan serve

Prueba la API

Para probar la API podemos hacer uso de Postman, o cualquier otro software para API development.

Crea un registro

Para crear un registro vamos a realizar la siguiente petición a la api.

POST http://127.0.0.1:8000/api/file

{
   "code": 1,
   "language": "PHP",
   "developer": "Dennis Ritchie"
}

El resultado debería ser el siguiente:

{
   "status": "created"
}

Actualiza un registro

Para actualizar el registro creado anteriormente vamos a realizar la siguiente petición a la api.

PUT/PATCH http://127.0.0.1:8000/api/file/1

{
   "language": "PHP",
   "developer": "Rasmus Lerdorf"
}

El resultado debería ser el siguiente:

{
   "status": "updated"
}

Consulta un registro

Para consultar un registro vamos a realizar la siguiente petición a la api.

GET http://127.0.0.1:8000/api/file/1

El resultado debería ser el siguiente:

{
   "code": 1,
   "language": "PHP",
   "developer": "Rasmus Lerdorf"
}

Elimina un registro

Para eliminar un registro vamos a realizar la siguiente petición a la api.

DELETE http://127.0.0.1:8000/api/file/1

El resultado debería ser el siguiente:

{
   "status": "deleted"
}

Acerca de Darío Rivera

Author

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.