API de KnowNode

La API es una muestra de amabilidad y cooperación con los computines.

Contenidos

La API

La API solo permite el método http GET. Los otros métodos (POST, PUT y DELETE) no hacen nada.
La API fue publicada para integración con otros sistemas o para practicar. Ni idea.

Estándares

La API cuenta con el siguiente estándar de respuesta:

  • El único método que responde es GET.
  • Los datos consultados son devueltos en un JSON.
  • Dentro del JSON siempre vendrán los siguientes parámetros:
    1. status: ok | fail | auth
    2. data: el contenido JSON

Rutas disponibles

A continuación, se definieron las siguientes rutas:

Asignaturas/

Devuelve todas las asignaturas, ordenadas según la malla.

  • id: PrimaryKey asociada al objeto.
  • nombre: Nombre de la asignatura.
  • codigo: Abreviatura "slugificada" del nombre.
  • semestre_id: ForeignKey del semestre al que pertenece.
  • estado: Estado actual de sus contenidos.
    1. Esperando...: Cuando se esta en vacaciones, en espera de aceptar contenido.
    2. En planeación...: Se esta planeando el como se estructuraran los contenidos, aun no acepta contenido.
    3. En curso...: La asignatura acepta contenido.
    4. Finalizado: Los contenidos están terminados, solo mejoras se aceptan.

Contribuciones/

Devuelve todas las contribuciones, absolutamente todas. Ordenadas según fecha de publicación.

  • id: PrimaryKey asociada al objeto.
  • nombre: Nombre del contenido según su unidad.
  • archivo: Ruta del archivo relativo a root/recursos.
  • publicado: Fecha de aceptación y publicación.
  • actualizado: Fecha de actualización.
  • unidades_id: ForeignKey de la unidad.

Propuestas/

Devuelve todas las propuestas pendiente de revisión. Ordenadas por fecha de publicación.

  • id: PrimaryKey asociada al objeto.
  • nombre: Nombre del contenido según su unidad.
  • autor_id: ForeignKey del id del autor creador.
  • estado: Estado actual de la propuesta.
    1. En espera...: Cuando la propuesta es nueva y esta pendiente de su primera revisión.
    2. Revisión en espera...: La propuesta fue devuelta al autor para una mejora.
    3. Edición en espera...: La propuesta es una mejora de una contribución y esta en espera de revisión.
    4. Mejora en espera...: La propuesta de mejora fue devuelta al autor para una mejora.
  • publicado: Fecha de publicación.
  • unidades_id: ForeignKey de la unidad.

Unidades/

Devuelve todas las unidades, absolutamente todas. Ordenadas según creación.

  • id: PrimaryKey asociada al objeto.
  • asignatura_id: ForeignKey de la asignatura.
  • unidad_id: ForeignKey de la unidad.
  • nombre: Nombre de la unidad según la asignatura y su unidad.

Nombres/

Devuelve los nombres de cada unidad raíz. Son 4 unidades por defecto. Ordenadas por numero.

  • id: PrimaryKey asociada al objeto.
  • nombre: Nombre de la unidad.

Usuarios/

Requiere autenticación y ser parte del staff.
Devuelve todos los usuarios registrados. Ordenados por fecha de registro.

Los campos responden al modelo User, de Django. Para las definiciones de cada campo, se anima al lector a leer la documentación oficial de Django Users.

Se han censurado campos que obviamente deben ser censurados. Como correo, nombre real y contraseña.

Usando la API

A continuación se muestran distintos códigos que hacen lo mismo, para que entiendas la idea.

Python

Autor: Güillǝr

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import requests # pip install requests
import json

API = "https://knownode.crizacio.com/api/"

RUTAS = [
    "asignaturas/",
    "contribuciones/",
    "propuestas/",
    "unidades/",
        "nombres/",
    "usuarios/",
]


ASIGNATURA = 8

asignatura = json.loads(
    requests.get(
        str(f"{API}{RUTAS[0]}")).text
)['data'][ASIGNATURA]


# Informacion de la asignatura
print(str('[{}] {}'.format(asignatura['codigo'], asignatura['nombre'])))


# Mostrar las unidades de la asignatura y sus contribuciones
unidades = json.loads(
    requests.get(
        str(f"{API}{RUTAS[3]}")).text
)["data"]
contribuciones = json.loads(
    requests.get(
        str(f"{API}{RUTAS[1]}")).text
)["data"]
for unidad in unidades:
    if unidad['asignatura_id'] == ASIGNATURA+1:
        print("    {}) {}".format(unidad["unidad_id"], unidad["nombre"]))
        # Mostrar solo las contribuciones de la asignatura en la unidad actual
        for contribucion in contribuciones:
            if contribucion['unidades_id'] == unidad['id']:
                print(str('        {}'.format(contribucion['nombre'])))

El output:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[Back-End] Programación Back-End
    1) Tecnologías del lado del Servidor
        The Django Framework
        Templates y archivos estáticos
        Archivos estáticos
        Contextos de templates
    2) Framework Back-End
        Integración con bases de datos
        Modelo Django
        Aplicación de modelos Django
        Formularios Django
        Contextos de vista Django
        Manejo de formularios
        La aplicación messages
        La U y la D en CRUD
        Django Admin
    3) API RESTful con Integración de Base de Datos

PHP

Autor: Crizacio (basado en el script de arriba)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

define("API", "https://knownode.crizacio.com/api/");

define("RUTAS", [
    "asignaturas/",
    "contribuciones/",
    "propuestas/",
    "unidades/",
        "nombres/",
    "usuarios/",
]);

define("ASIGNATURA", 8);

$asignatura = json_decode(file_get_contents(API.RUTAS[0]), true)["data"][ASIGNATURA];

# Informacion de la asignatura
print("[".$asignatura["codigo"]."] ".$asignatura["nombre"]."\n");


# Mostrar las unidades de la asignatura y sus contribuciones
$unidades = json_decode(file_get_contents(API.RUTAS[3]), true)["data"];
$contribuciones = json_decode(file_get_contents(API.RUTAS[1]), true)["data"];
foreach ($unidades as $unidad) {
    if ($unidad["asignatura_id"] == ASIGNATURA+1) {
        print("    ".$unidad["unidad_id"].") ".$unidad["nombre"]."\n");
        # Mostrar solo las contribuciones de la asignatura en la unidad actual
        foreach ($contribuciones as $contribucion) {
            if ($contribucion["unidades_id"] == $unidad["id"]) {
                print("        ".$contribucion["nombre"]."\n");
            }
        }
    }
}
?>

El output:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[Back-End] Programación Back-End
    1) Tecnologías del lado del Servidor
        The Django Framework
        Templates y archivos estáticos
        Archivos estáticos
        Contextos de templates
    2) Framework Back-End
        Integración con bases de datos
        Modelo Django
        Aplicación de modelos Django
        Formularios Django
        Contextos de vista Django
        Manejo de formularios
        La aplicación messages
        La U y la D en CRUD
        Django Admin
    3) API RESTful con Integración de Base de Datos

Como puedes observar, es muy simple.