Noções básicas sobre modelos de caminho

No gateway de API, é possível rotear solicitações recebidas com base na estimativa de caminho. As modelos de caminho têm 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 (por exemplo, {var} ou {var=*}) ou ambos, 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}: # Equivalent to /shelves/{shelf=*}/books/{book=*}
    get:
      summary: Retrieve a book
...

Neste exemplo, o gateway aceitará solicitações que correspondam ao seguinte regex:

^/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:

...
paths:
  /shelves/{shelf=*}/books/{book=**}:
    get:
      summary: Retrieve a book
...

Neste exemplo, o gateway aceitará solicitações que correspondam ao seguinte regex:

^/shelves/[^/]+/books/.*/?$

Barras de encaminhamento codificadas por URL

A API Gateway segue a RFC 3986 (em inglês), que não trata barras de barra de URL (%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 GetShelf para o ID da estante shelf_1%2Fbooks%2Fbook_2. Nesse caso, uma verificação de chave de API não é obrigatória.
  • Se o %2F for normalizado antes de qualquer solicitação ser processada pelo back-end, a solicitação poderá ser processada como a operação GetBook do ID do livro book_2. Em outras palavras, o back-end processa /shelves/shelf_1%2Fbooks%2Fbook_2 como /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

A API Gateway segue a RFC 3986 (em inglês), 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.