Platzi
Platzi

¡Invierte en ti y celebremos! Adquiere un plan Expert o Expert+ a precio especial.

Antes:$349
$259
Currency
Antes:$349
Ahorras:$90
COMIENZA AHORA
Curso de API REST

Clases del Curso de API REST

Instruido por:
Mauro Chojrin
Mauro Chojrin
Básico
2 horas de contenido
Ver la ruta de aprendizaje
Biblioteca Virtual
Proyecto del curso
Biblioteca Virtual

El estudiante desarrollará una base de datos para una biblioteca a la cual puedan hacérsele consultas a través de una API REST

Curso de API REST

Curso de API REST

Progreso del curso:0/19contenidos(0%)

Contenido del Curso
Tutoriales de estudiantes
Preguntas de estudiantes

Progreso del curso:0/19contenidos(0%)

Comprender los objetivos y pre-requisitos del curso

Material Thumbnail

Introducción y bienvenida

01:03 min

Material Thumbnail

Qué es una API y para qué sirve

02:55 min

Conocer los conceptos principales de REST

Material Thumbnail

Qué es y cómo funciona el protocolo HTTP

06:02 min

Material Thumbnail

¿Qué significa REST? y ¿qué es una API RESTful?

05:10 min

Aprender a consumir servicios REST

Material Thumbnail

Cómo realizar una petición REST e interpretar sus resultados

09:38 min

Aprender a producir servicios REST

Material Thumbnail

Exponer datos a través de HTTP GET

12:51 min

Material Thumbnail

Exponer un recurso en particular a través de HTTP GET

07:36 min

Material Thumbnail

Incorporar datos a través de HTTP POST

05:40 min

Material Thumbnail

Modificar datos a través de HTTP PUT

04:06 min

Material Thumbnail

Eliminar datos a través de HTTP DELETE

03:03 min

Conocer diferentes modos de restringir el acceso a las API Rest

Material Thumbnail

Autenticación vía HTTP

04:58 min

Material Thumbnail

Autenticación vía HMAC

07:16 min

Material Thumbnail

Autenticación vía Access Tokens

08:59 min

Aprender a tratar errores en la comunicación vía REST

Material Thumbnail

Manejo de errores de un servicio REST

08:20 min

Aprender a utilizar una API Rest para la comunicación FrontEnd/BackEnd

Material Thumbnail

Introducción a Ajax

08:23 min

Conocer buenas prácticas del diseño de APIs REST

Material Thumbnail

7 Buenas prácticas del diseño de APIs RESTful

02:32 min

nuevosmás votadossin responder
Julian Pineda
Julian Pineda
Estudiante

En Ruby se puede utilizar la gema httparty
instalación

gem install httparty

Luego desde el interprete de Ruby “irb” ejecuta lo siguiente para obtener la url de la imagen en la pagina https://xkcd.com

require'HTTParty'url = 'https://xkcd.com/info.0.json'
response = HTTParty.get(url)

puts response.parsed_response['img']
1
Carlos Alfonso Garcia Rivera
Carlos Alfonso Garcia Rivera
Estudiante

No entendi ¿por que se tenia que cambiar el router, por el now.json?

1
Carlos Alfonso Garcia Rivera
Carlos Alfonso Garcia Rivera
Estudiante

que tan buena idea es que renombre el archivo router.php a index.php para que sea el primero en ser servido?

1
Carlos Alfonso Garcia Rivera
Carlos Alfonso Garcia Rivera
Estudiante

Si PUT no puede modificar parcialmente un elemento, como logramos en tal caso que se puede hacer eso, por ejemplo cambiar el nombre del libro pero no el genero.

0
Pablo Nicolás Alonso
Pablo Nicolás Alonso
Estudiante

Tengo una pregunta, si la API me devuelve un objeto y al navegar una de las propiedades tiene un guion medio (generation-iii).
|
Al querer navegar dentro (ej: version.generation-iii.foo) Javascript toma este guion medio y piensa que estoy restando.
|
Entonces ¿Cómo hago para que me lo tome como uno solo y no como si fuera que estoy restando generation con iii?

API Ejemplo: https://pokeapi.co/api/v2/pokemon/ditto/

1
Angel de Jesus Quintero Pereira
Angel de Jesus Quintero Pereira
Estudiante

Pregunta:
¿Cómo solucionar la respuesta de autenticación servidor auth_server.php ?
Tengo problema con esta clase y realmente llevo dos días trancado.

Problema:
Al realizar la petición php el servidor de validación muestra lo siguiente:
Invalid request (Unsupported SSL request)
![](Captura de pantalla de 2021-06-02 12-42-30.png

contexto del problema
En esta clase se intenta demostrar como es el uso de la autenticación de token con php. Para ellos el flujo del funcionamiento del código es el siguiente:

  • Se tiene un servidor de recursos llamado “server.php” este servidor se encarga de los recursos que se tiene.
  • Se tiene un servidor de rutas llamado “router.php” este servidor es el encargado de recibir las peticiones dársela al servidor de recursos llamado “server.php”
  • Se tiene un servidor para la autenticación llamado auth_server.php, este servidor tiene dos funciones.
    1. Crear un token cuando el usuario vaya a iniciar sesión
    2. Validar El token que el usuario le suministra al servidor de recursos llamado server.php

código del server.php

<?php

header('Content-Type: application/json');
// validación de que el servidor de recursos  recibió un tokenif (!array_key_exists('HTTP_X_TOKEN', $_SERVER)) {

    die;
}

// $url = 'https://' . $_SERVER['HTTP_HOST'] . '/auth';// Se debe validar el token recibido con el servidor,// de autenticación ejecutando una llamada a tráves//  de curl.$url = 'https://localhost:8001';

// iniciamos la llamada de curl$ch = curl_init($url);

// Se configura curl para enviar// el token y  validarlo con el serrvidor// de validación.
curl_setopt(
    $ch,
    CURLOPT_HTTPHEADER,
    [
        "X-Token: {$_SERVER['HTTP_X_TOKEN']}",
    ]
);

// Se configura  curl nuevamente para recibir la// respuesta sobre el token  que enviamos// del servidor de validación
curl_setopt(
    $ch,
    CURLOPT_RETURNTRANSFER,
    true
);

// Se obtine la respuesta del servidor// de validación$ret = curl_exec($ch);

// finalmente se compara la respuesta del servidor// de autenticación, si el resultado no es true// entonces el usuario no ha sido autenticado// correctamenteif ($ret !== 'true') {
    http_response_code(403);

    die;
}


$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,
    ],
];

$allowedResourceTypes = [
    'books',
    'authors',
    'genres',
];

$resourceType = $_GET['resource_type'];
if (!in_array($resourceType, $allowedResourceTypes)) {
    header('Status-Code: 400');
    echo json_encode(
        [
            'error' => "Resource type '$resourceType' is un unkown",
        ]
    );

    die;
}


$resourceId = array_key_exists('resource_id', $_GET) ? $_GET['resource_id'] : '';
$method = $_SERVER['REQUEST_METHOD'];

switch (strtoupper($method)) {
    case'GET':
        if ("books" !== $resourceType) {
            header('Status-Code: 404');

            echo json_encode(
                [
                    'error' => $resourceType . ' not yet implemented :(',
                ]
            );

            die;
        }

        if (!empty($resourceId)) {
            if (array_key_exists($resourceId, $books)) {
                echo json_encode(
                    $books[$resourceId]
                );
            } else {
                header('Status-Code: 404');

                echo json_encode(
                    [
                        'error' => 'Book ' . $resourceId . ' not found :(',
                    ]
                );
            }
        } else {
            echo json_encode(
                $books
            );
        }

        die;

        break;
    case'POST':
        $json = file_get_contents('php://input');

        $books[] = json_decode($json);

        echo array_keys($books)[count($books) - 1];
        break;
    case'PUT':
        if (!empty($resourceId) && array_key_exists($resourceId, $books)) {
            $json = file_get_contents('php://input');

            $books[$resourceId] = json_decode($json, true);

            echo$resourceId;
        }
        break;
    case'DELETE':
        if (!empty($resourceId) && array_key_exists($resourceId, $books)) {
            unset($books[$resourceId]);
        }
        break;
    default:
        header('Status-Code: 404');

        echo json_encode(
            [
                'error' => $method . ' not yet implemented :(',
            ]
        );

        break;
}

código del router.php

<?php$matches = [];

if (preg_match('/\/([^\/]+)\/([^\/]+)/', $_SERVER["REQUEST_URI"], $matches)) {
    $_GET['resource_type'] = $matches[1];
    $_GET['resource_id'] = $matches[2];

    error_log( print_r($matches, 1) );
    require'server.php';
} elseif ( preg_match('/\/([^\/]+)\/?/', $_SERVER["REQUEST_URI"], $matches) ) {
    $_GET['resource_type'] = $matches[1];
    error_log( print_r($matches, 1) );

    require'server.php';
} else {

    error_log('No matches');
    http_response_code( 404 );
}

código del auth_server.php

<?php$method = strtoupper($_SERVER['REQUEST_METHOD']);

// $token = "5d0937455b6744.68357201";$token = sha1('Esto es secreto!!');

if ($method === 'POST') {
    if (!array_key_exists('HTTP_X_CLIENT_ID', $_SERVER) || !array_key_exists('HTTP_X_SECRET', $_SERVER)) {
        http_response_code(400);

        die('Faltan parametros');
    }

    $clientId = $_SERVER['HTTP_X_CLIENT_ID'];
    $secret = $_SERVER['HTTP_X_SECRET'];

    if ($clientId !== '1' || $secret !== 'SuperSecreto!') {
        http_response_code(403);

        die("No autorizado");
    }

    echo"$token";
} elseif ($method === 'GET') {
    if (!array_key_exists('HTTP_X_TOKEN', $_SERVER)) {
        http_response_code(400);

        die('Faltan parametros');
    }

    if ($_SERVER['HTTP_X_TOKEN'] == $token) {
        echo'true';
    } else {
        echo'false';
    }
} else {
    echo'false';
}

pasos para replicar el problema

  1. Los códigos anteriormente presentados, están metidos en una sola carpeta. Cada código presentado anteriormente está separado en archivos distintos:
  • server.php
  • router.php
  • auth_server.php
  1. En la terminal de linux se abre una pestaña para cada servidor y petición que se muestra a continuación
    a. Se inicia el servidor router

$ php -S localhost:8000 router.php

b. Se inicia el servidor de autenticación

$ php -S localhost:80001 auth_server.php

c. Se realiza la petición al servidor de autenticación para pedir un token, el servidor crea el token y lo devuelvo en la terminal. Es token se debe copiar y enviarlo con la petición GET que se muestra en el siguiente paso

$ curl http : //localhost : 8001 -X ‘POST’ -H ‘X-CLIENT-Id:1’ -H ‘X-Secret:SuperSecreto!’

d. Se realiza la petición GET y se indica en la cabezare el token generado por el servidor de autenticación

$ curl http : // localhost : 8000/books -H ‘X-Token:c4b02a1525349e7888d4140dcd524aff2d6296dd’

e. finalmente después de la anterior consulta no se muestra nada.

El comportamiento esperado:
Mostrar la lista de libros.
El Comportamiento actual:
No muestra la lista de libros y en la pestaña donde se ejeucta el servidor de autenticación muesta el mensaje de:
[Wed Jun 2 12:42:21 2021] ::1:48248 Invalid request (Unsupported SSL request)

La caracterisitcas de mi de mi sistema
version de php
Captura de pantalla de 2021-06-02 12-45-57.png
especificaciones de mi sistema operativo
Captura de pantalla de 2021-06-02 12-43-53.png

1
Eduardo Rafael Romero Bernal
Eduardo Rafael Romero Bernal
Estudiante

¿Cuál es la diferencia entre URI y URL?

1
Yohana Elizabeth Chavez Reyes
Yohana Elizabeth Chavez Reyes
Estudiante

¿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? 😦

1
Omar Villada
Omar Villada
Estudiante

En WIndows como hago para encender el servidor de php por consola?

1
Chavarria Salinas Blanca Estela
Chavarria Salinas Blanca Estela
Estudiante

en cual ubicación guardas el archivo php?

2