Skip to main content

Alternativa REST

Todas las APIs que están declaradas en gRPC tienen configurado un transcoder. El transcoder convierte las peticiones clásicas que utilizan JSON y HTTP/1.1 al protocolo binario de Protobuf y HTTP/2.0. Por ello recomendamos utilizar gRPC directamente para la integración que es más cómodo, tipado y con un rendimiento más elevado.

En algunos casos como los navegadores web, llamadas manuales o implementaciones puntuales puede convenir utilizar esta otra interfaz de acceso en lugar de la codificación binaria que puede resultar ligeramente más incómoda. En estos casos se puede utiliza la interfaz de acceso "REST", o resty que implementa un acceso más clásico.

Funcionamiento general

Cada endpoint de protobuf tiene documentado una opción HTTP, donde indica si es una llamada GET, PUT, POST o DELETE, la ruta, y los parámetros que necesita de entrada y de salida. Mandaríamos un JSON en el cuerpo de los métodos que requieren un mensaje de entrada y siempre vamos a recibir de vuelta un JSON con los campos documentados de retorno. En general se puede esperar que salvo error tipográfico esta API tiene la estructura típica y clásica de una aplicación orientada a recursos de las que se hacen en cualquier tutorial web que nos encontremos: GET para acceder, PUT para actualizar, POST para crear, etc.

Recursos

Ejemplo práctico

Si consultamos la definición de la API de procesos tenemos lo siguiente:

  rpc List(google.protobuf.Empty) returns (ListReply) {
option (google.api.http) = {
get: '/procesos'
};
}

Esto significa acceder por el método GET a la ruta de /procesos. No necesita ningún dato de entrada como es natural por el tipo de petición y va a devolver un JSON correspondiente a la estructura ListReply.

Podemos realizar la petición con cualquier herramienta o librería añadiendo la autorización necesaria para obtener los resultados que necesitamos:

 ✗ https -v webinterna.api.dlege.altipla.consulting/procesos 'Authorization: Bearer eyJhbG...'
GET /procesos HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Authorization: Bearer eyJhbG...
Connection: keep-alive
Host: webinterna.api.dlege.altipla.consulting
User-Agent: HTTPie/2.4.0



HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 18 Oct 2021 11:36:04 GMT
Server: Caddy
Server: Kestrel
Transfer-Encoding: chunked

{
"procesos": [
{
"actividades": [
"<h2>Actividades del proceso B</h2> <p><b>Negrita de prueba</b></p>",
"<h2>Actividades del proceso B-2</h2> <p><b>Negrita de prueba 2</b></p>"
],
"analista": "ce1b85a1-f73f-4b96-a799-12fbd334349b",
"codigo": "002",
"cuidador": "ce1b85a1-f73f-4b96-a799-12fbd334349b",
"denominacion": "Proceso B",
"gerentes": [
"ce1b85a1-f73f-4b96-a799-12fbd334349b"
],
"gestores": [
{
"contribuidor": "ce1b85a1-f73f-4b96-a799-12fbd334349b",
"rol": "Rol colaborador"
},
{
"contribuidor": "ce1b85a1-f73f-4b96-a799-12fbd334349b",
"rol": "Rol colaborador2"
}
],
"grupo": "f79220fb-001f-4714-bdaf-feb4123fee5b",
"kpis": [
"<h2>KPIs</h2> <p><b>Negrita de prueba</b></p>"
],
"name": "62b75477-5984-428e-b478-fd2edec8de15",
"proposito": "<h2>Propósito</h2> <p><b>Negrita de prueba</b></p>",
"sitioSharepoint": "https://www.example.com/"
},
{
"actividades": [
"<h2>Actividades del Proceso A</h2> <p><b>Negrita de prueba</b></p>"
],
"analista": "ce1b85a1-f73f-4b96-a799-12fbd334349b",
"codigo": "001",
"cuidador": "ce1b85a1-f73f-4b96-a799-12fbd334349b",
"denominacion": "Proceso A",
"gerentes": [
"ce1b85a1-f73f-4b96-a799-12fbd334349b"
],
"gestores": [
{
"contribuidor": "ce1b85a1-f73f-4b96-a799-12fbd334349b",
"rol": "Rol colaborador"
}
],
"grupo": "8ff9a3fd-c746-4626-99a3-bd5672f81a99",
"kpis": [
"<h2>KPIs</h2> <p><b>Negrita de prueba</b></p>"
],
"name": "7b63a1e0-e3b5-49d9-9bea-3c9a8aafb1fe",
"proposito": "<h2>Propósito</h2> <p><b>Negrita de prueba</b></p>",
"sitioSharepoint": "https://www.example.com/"
},
{
"codigo": "004",
"denominacion": "Proceso D",
"name": "aaeef358-8337-41da-8fa9-4bd8b7ee136c"
},
{
"actividades": [
"<p>Actividades del proceso C</p>"
],
"analista": "ce1b85a1-f73f-4b96-a799-12fbd334349b",
"codigo": "003",
"cuidador": "ce1b85a1-f73f-4b96-a799-12fbd334349b",
"denominacion": "Proceso C",
"gerentes": [
"ce1b85a1-f73f-4b96-a799-12fbd334349b"
],
"grupo": "f79220fb-001f-4714-bdaf-feb4123fee5b",
"kpis": [
"<h2>KPIs</h2> <p><b>Negrita de prueba</b></p>"
],
"name": "bc6eac9c-483d-47e9-b3dd-f91f73ad0ccb",
"proposito": "<p><b>Negrita de prueba</b></p>",
"sitioSharepoint": "https://www.example.com/"
}
]
}

Como es natural en una API de tipo REST tendríamos el campo name que identifica a cada entidad de la respuesta, lo que nos permite realizar una petición a la ruta /procesos/62b75477-5984-428e-b478-fd2edec8de15 para obtener solamente ese proceso y así sucesivamente con el resto de la implementación.