Noções básicas sobre modelos de caminho
No gateway de API, é possível rotear solicitações recebidas com base no modelo de caminho. Um modelo de caminho tem três componentes principais:
- Correspondência exata
- Correspondência de caractere curinga único
- Correspondência de caractere curinga dupl
As seções a seguir descrevem cada um desses componentes e como eles funcionam no contexto do gateway de API.
Correspondência exata
Um caminho com modelo sem segmentos curinga únicos ou duplos (* ou **) é convertido em uma correspondência de caminho exata.
Por exemplo, a especificação OpenAPI da configuração da API do gateway pode conter uma seção como esta
...
paths:
/shelves:
get:
summary: List shelves
...
Neste exemplo, o gateway aceita apenas solicitações para /shelves e nenhum outro caminho.
Correspondência de caractere curinga único
Se um caminho com modelo tiver uma variável, um segmento de caractere curinga singular ({var}) ou, somente no OpenAPI 2.0, um segmento de caractere curinga singular ({var=*}), o gateway permitirá solicitações de entrada que estejam em conformidade com o seguinte:
- As solicitações não contêm uma barra (
/), o que significa que a variável corresponderá apenas a um único segmento de caminho. - As solicitações contêm pelo menos um caractere.
- As solicitações podem conter uma barra extra no final do caminho.
Por exemplo, a especificação OpenAPI da configuração da API do gateway pode conter uma seção como esta
...
paths:
/shelves/{shelf}/books/{book}:
get:
summary: Retrieve a book
...
Neste exemplo, o gateway aceitará solicitações que correspondam à seguinte expressão regular:
^/shelves/[^/]+/books/[^/]+/?$
Correspondência de caracteres curinga duplos
Se um caminho com modelo contiver uma variável indicada por um segmento de caractere curinga duplo (por exemplo, {var=**}), o gateway permitirá solicitações recebidas que estejam em conformidade com o seguinte:
- As solicitações podem conter todos caracteres, incluindo barras (/).
- As solicitações podem conter 0 ou mais caracteres.
- As solicitações podem conter uma barra extra no final do caminho.
Por exemplo, a especificação OpenAPI da configuração da API do gateway pode conter uma seção como esta
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: '**' ...
Neste exemplo, o gateway aceitará solicitações em que o parâmetro book corresponda a qualquer caractere, incluindo barras. Isso corresponde à seguinte expressão regular:
^/shelves/[^/]+/books/.*/?$
Barras codificadas por URL
O gateway de API segue RFC 3986, que não trata barras de URL codificadas (%2F) como barras reais ao corresponder caminhos de URL para roteamento ou decisões de segurança. Se forem esperadas barras codificadas de URL, o back-end deverá processar essas solicitações adequadamente.
Por exemplo, considere a seguinte especificação 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: []
Neste exemplo, a operação /shelves/{shelf}/books/{book} requer uma chave de API, mas a operação /shelves/{shelf} não é restrita.
Se um usuário enviar uma solicitação para /shelves/shelf_1%2Fbooks%2Fbook_2:
- O gateway processará a solicitação como uma operação
GetShelfpara o ID da estanteshelf_1%2Fbooks%2Fbook_2. Nesse caso, uma verificação de chave de API não é obrigatória. - Se o
%2Ffor normalizado antes de qualquer solicitação ser processada pelo back-end, a solicitação poderá ser processada como a operaçãoGetBookdo ID do livrobook_2. Em outras palavras, o back-end processa/shelves/shelf_1%2Fbooks%2Fbook_2como/shelves/shelf_1/books/book_2.
Neste exemplo, o back-end espera que a operação GetBook execute uma verificação de chave de API no gateway. No entanto, como o gateway leu a solicitação como uma operação GetShelf, nenhuma verificação de chave de API foi realizada.
Normalização de vários retângulos adjacentes
O gateway de API segue RFC 3986, que declara que os caminhos com várias barras adjacentes serão tratados como caminhos diferentes daqueles com barras no singular.
Por exemplo, uma solicitação que contém /shelves/// não será normalizada pelo gateway para o caminho da solicitação /shelves/ antes de corresponder a um modelo de caminho de URI nem ao encaminhar para o back-end especificado.
Regras de sintaxe
O gateway de API aplica várias regras de validação de sintaxe para modelos de caminho:
- Convenções de nomenclatura de variáveis:os nomes de variáveis precisam começar com uma letra (minúscula ou maiúscula) ou um sublinhado (
_) e só podem conter letras, números, sublinhados, pontos (.) e hifens (-).- Válido:
{my_var},{var-1},{var.name} - Inválido:
{1var},{my var}
- Válido:
- Sem mistura de parâmetros e literais:um único segmento de caminho não pode conter um parâmetro e caracteres literais.
- Válido:
/prefix/{var} - Inválido:
/prefix-{var},/{var}suffix
- Válido:
- Sufixo de método personalizado permitido:a única exceção à mistura de parâmetros e literais está no último segmento do caminho, em que um sufixo de método personalizado que começa com dois pontos (
:) é permitido.- Válido:
/{var}:customMethod - Inválido:
/{var}:customMethod/suffix
- Válido:
- Sem vários parâmetros por segmento:um único segmento de caminho não pode conter mais de um parâmetro.
- Válido:
/{var1}/{var2} - Inválido:
/{var1}{var2}
- Válido:
- Sem parâmetros aninhados:os parâmetros não podem ser aninhados uns nos outros.
- Válido:
/{var} - Inválido:
/{{var}}
- Válido:
- Caractere curinga duplo: os segmentos de caractere curinga duplo só podem estar no último segmento do caminho.
- Válido:
/prefix/{var=**},/prefix/** - Inválido:
/{var=**}/suffix,/**/suffix
- Válido:
Limites
| Limite | Valor |
|---|---|
| Número de parâmetros por caminho | 60 |
| Comprimento do nome da variável | 100 |
| Tamanho do caminho (com ou sem modelo) | 512 |