Informazioni sui modelli di percorso

In API Gateway, è possibile instradare le richieste in entrata in base ai modelli di percorso. Il modello di percorso ha tre componenti principali:

  • Corrispondenza esatta
  • Corrispondenza con un singolo carattere jolly
  • Corrispondenza con doppio carattere jolly

Le sezioni seguenti descrivono ciascuno di questi componenti e il loro funzionamento nel contesto di API Gateway.

Corrispondenza esatta

Un percorso basato su un modello senza segmenti con caratteri jolly singoli o doppi (* o **) viene convertito in una corrispondenza esatta del percorso. Ad esempio, la specifica OpenAPI per la configurazione API del gateway potrebbe contenere una sezione come la seguente:

...
paths:
  /shelves:
    get:
      summary: List shelves
...

In questo esempio, il gateway accetterà solo le richieste a /shelves e nessun altro percorso.

Corrispondenza con un solo carattere jolly

Se un percorso basato su un modello contiene una variabile, un segmento jolly singolare ({var}) o, solo in OpenAPI 2.0, un segmento jolly singolare ({var=*}), il gateway consentirà le richieste in entrata conformi a quanto segue:

  • Le richieste non contengono una barra (/), il che significa che la variabile corrisponderà a un solo segmento di percorso.
  • Le richieste contengono almeno un carattere.
  • Le richieste potrebbero contenere una barra finale aggiuntiva se presente alla fine del percorso.

Ad esempio, la specifica OpenAPI per la configurazione API del gateway potrebbe contenere una sezione come la seguente:

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

In questo esempio, il gateway accetterà le richieste che corrispondono alla seguente espressione regolare:

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

Corrispondenza con doppio carattere jolly

Se un percorso basato su un modello contiene una variabile indicata da un segmento con doppio carattere jolly (ad es.{var=**}), il gateway consentirà le richieste in entrata conformi a quanto segue:

  • Le richieste possono contenere tutti i caratteri, incluse le barre (/).
  • Le richieste possono contenere 0 o più caratteri.
  • Le richieste potrebbero contenere una barra finale aggiuntiva se presente alla fine del percorso.

Ad esempio, la specifica OpenAPI per la configurazione API del gateway potrebbe contenere una sezione come la seguente:

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: '**'
...

In questo esempio, il gateway accetterà le richieste in cui il parametro book corrisponde a qualsiasi carattere, incluse le barre. Ciò corrisponde alla seguente espressione regolare:

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

Barre non rovesciate con codifica URL

API Gateway segue lo standard RFC 3986, che non considera le barre oblique codificate nell'URL (%2F) come barre oblique effettive quando abbina i percorsi URL per il routing o le decisioni di sicurezza. Se sono previste barre codificate nell'URL, il backend deve gestire queste richieste di conseguenza.

Ad esempio, considera la seguente specifica 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: []

In questo esempio, l'operazione /shelves/{shelf}/books/{book} richiede una chiave API, mentre l'operazione /shelves/{shelf} non è soggetta a restrizioni.

Nel caso in cui un utente invii una richiesta a /shelves/shelf_1%2Fbooks%2Fbook_2:

  • Il gateway elaborerà la richiesta come operazione GetShelf per l'ID scaffale shelf_1%2Fbooks%2Fbook_2. In questo caso, il controllo della chiave API non viene applicato.
  • Se %2F viene normalizzato prima della gestione delle richieste da parte del backend, la richiesta potrebbe invece essere elaborata come operazione GetBook per l'ID libro book_2. In altre parole, il backend elabora /shelves/shelf_1%2Fbooks%2Fbook_2 come /shelves/shelf_1/books/book_2.

In questo esempio, il backend prevede che l'operazione GetBook esegua un controllo della chiave API sul gateway. Tuttavia, poiché il gateway ha letto la richiesta come operazione GetShelf, non è stato eseguito alcun controllo della chiave API.

Normalizzazione di più barre oblique consecutive

API Gateway segue lo standard RFC 3986, che stabilisce che i percorsi con più barre oblique adiacenti verranno trattati come un percorso diverso da quelli con barre oblique singole.

Ad esempio, una richiesta contenente /shelves/// non verrà normalizzata dal gateway nel percorso della richiesta /shelves/ prima di corrispondere a un modello di percorso URI durante l'inoltro al backend specificato.