Información sobre las plantillas de ruta
En API Gateway, es posible enrutar las solicitudes entrantes según las plantillas de rutas. Las plantillas de rutas de acceso tienen tres componentes principales:
- Coincidencia exacta
- Coincidencia de comodines únicos
- Coincidencia de comodines dobles
En las siguientes secciones, se describe cada uno de estos componentes y cómo funcionan dentro del contexto de API Gateway.
Coincidencia exacta
Una ruta de acceso con plantilla sin ningún segmento de comodín único o doble (* o **) se convierte en una coincidencia de ruta de acceso exacta.
Por ejemplo, la especificación de OpenAPI para la configuración de la API de tu puerta de enlace puede contener una sección como la siguiente:
...
paths:
/shelves:
get:
summary: List shelves
...
En este ejemplo, la puerta de enlace solo aceptará solicitudes a /shelves y a ninguna otra ruta.
Coincidencia de comodín único
Si una ruta de acceso con plantilla contiene una variable, un segmento de comodín único ({var}) o, solo en OpenAPI 2.0, un segmento de comodín único ({var=*}), la puerta de enlace permitirá las solicitudes entrantes que cumplan con lo siguiente:
- Las solicitudes no contienen una barra adicional (
/), lo que significa que la variable solo coincidirá con un segmento de ruta de acceso. - Las solicitudes contienen al menos un carácter.
- Las solicitudes pueden contener una barra final adicional si está presente al final de la ruta.
Por ejemplo, la especificación de OpenAPI para la configuración de la API de tu puerta de enlace puede contener una sección como la siguiente:
...
paths:
/shelves/{shelf}/books/{book}:
get:
summary: Retrieve a book
...
En este ejemplo, la puerta de enlace aceptará solicitudes que coincidan con la siguiente expresión regular:
^/shelves/[^/]+/books/[^/]+/?$
Coincidencia de comodines dobles
Si una ruta de acceso con plantilla contiene una variable denotada por un segmento de comodín doble (p. ej. {var=**}), la puerta de enlace permitirá las solicitudes entrantes que cumplan con lo siguiente:
- Las solicitudes pueden contener todos los caracteres, incluidas las barras diagonales (/).
- Las solicitudes pueden contener 0 o más caracteres.
- Las solicitudes pueden contener una barra final adicional si está presente al final de la ruta.
Por ejemplo, la especificación de OpenAPI para la configuración de la API de tu puerta de enlace puede contener una sección como la siguiente:
OpenAPI 2.0
... paths: /shelves/{shelf=*}/books/{book=**}: get: summary: Retrieve a book ...
OpenAPI 3.x
... paths: /shelves/{shelf}/books/{book}: get: summary: Retrieve a book parameters: - name: shelf in: path schema: type: string - name: book in: path schema: type: string x-google-parameter: pattern: '**' ...
En este ejemplo, la puerta de enlace aceptará solicitudes en las que el parámetro book coincida con cualquier carácter, incluidas las barras diagonales. Esto corresponde a la siguiente expresión regular:
^/shelves/[^/]+/books/.*/?$
Barras diagonales codificadas para URL
API Gateway sigue la RFC 3986, que no trata las barras diagonales codificadas en URL (%2F) como barras reales cuando se comparan las rutas de acceso de URL para tomar decisiones de enrutamiento o seguridad. Si se esperan barras diagonales codificadas en URL, tu backend debe controlar estas solicitudes de manera adecuada.
Por ejemplo, considera la siguiente especificación de OpenAPI:
securityDefinitions:
api_key:
type: "apiKey"
name: "key"
in: "query"
paths:
/shelves/{shelf}:
get:
parameters:
- in: path
name: shelf
type: string
required: true
description: Shelf ID.
summary: List shelves
operationId: GetShelf
responses:
'200':
description: A successful response
schema:
type: string
/shelves/{shelf}/books/{book}:
get:
parameters:
- in: path
name: shelf
type: string
required: true
description: Shelf ID.
- in: path
name: book
type: string
required: true
description: Book ID
summary: Retrieve a book
operationId: GetBook
responses:
'200':
description: A successful response
schema:
type: string
security:
- api_key: []
En este ejemplo, la operación /shelves/{shelf}/books/{book} requiere una clave de API, pero la operación /shelves/{shelf} no está restringida.
En el caso de que un usuario envíe una solicitud a /shelves/shelf_1%2Fbooks%2Fbook_2, ocurrirá lo siguiente:
- La puerta de enlace procesará la solicitud como una operación
GetShelfpara el ID de la bibliotecashelf_1%2Fbooks%2Fbook_2. En este caso, no se aplica la verificación de la clave de API. - Si el backend normaliza el
%2Fantes de procesar cualquier solicitud, es posible que la solicitud se procese como la operaciónGetBookpara el ID de librobook_2. En otras palabras, el backend procesa/shelves/shelf_1%2Fbooks%2Fbook_2como/shelves/shelf_1/books/book_2.
En este ejemplo, el backend espera que la operación GetBook realice una verificación de la clave de API en la puerta de enlace. Sin embargo, debido a que la puerta de enlace leyó la solicitud como una operación GetShelf, no se realizó ninguna verificación de la clave de API.
Normalización de varias barras diagonales adyacentes
API Gateway sigue la RFC 3986, que indica que las rutas con varias barras diagonales adyacentes se tratarán como una ruta de acceso diferente de las que tienen barras diagonales únicas.
Por ejemplo, una solicitud que contiene /shelves/// no será normalizada por la puerta de enlace a la ruta de la solicitud /shelves/ antes de hacer coincidir una plantilla de ruta del URI ni cuando se reenvía al backend especificado.