Condividi tramite


Invia la richiesta

SI APPLICA A: Tutti i livelli di Gestione API

Il criterio send-request invia la richiesta fornita all'URL specificato, attendendo non oltre il valore di timeout impostato.

Nota

Impostare gli elementi e gli elementi figlio del criterio nell'ordine specificato nell'istruzione del criterio. Altre informazioni su come impostare o modificare i criteri di API Management.

Istruzione del criterio

<send-request mode="new | copy" response-variable-name="" timeout="60 sec" ignore-error
="false | true">
  <set-url>request URL</set-url>
  <set-method>...</set-method>
  <set-header>...</set-header>
  <set-body>...</set-body>
  <authentication-certificate thumbprint="thumbprint" />
  <authentication-managed-identity resource="ResourceID"/>
  <proxy>...</proxy>
</send-request>

Attributi

Attributo Descrizione Richiesto Valore predefinito
modalità Determina se si tratta di una richiesta new o di copy delle intestazioni e del corpo nella richiesta corrente. Nella sezione criteri in uscita mode=copy non inizializza il corpo della richiesta. Le espressioni di criteri sono consentite. NO new
response-variable-name Il nome della variabile di contesto che riceverà un oggetto risposta. Se la variabile non esiste, verrà creata in caso di completamento dell'esecuzione del criterio e diventerà accessibile tramite la raccolta context.Variable. Le espressioni di criteri sono consentite. N/D
Timeout Intervallo di timeout in secondi prima che la chiamata all'URL abbia esito negativo. Le espressioni di criteri sono consentite. NO 60
ignore-error Se è true e la richiesta restituisce un errore, l'errore verrà ignorato e la variabile di risposta conterrà un valore null. Le espressioni di criteri non sono consentite. NO false

Elementi

Elemento Descrizione Richiesto
set-url URL della richiesta. Le espressioni di criteri sono consentite. No se mode=copy; in caso contrario, sì.
metodo di impostazione Imposta il metodo della richiesta. Le espressioni di criteri non sono consentite. No se mode=copy; in caso contrario, sì.
set-header Imposta un'intestazione nella richiesta. Usare più elementi set-header per più intestazioni di richiesta. NO
set-body Imposta il corpo della richiesta. NO
certificato di autenticazione Certificato da usare per l'autenticazione client, specificato in un attributo thumbprint. NO
authentication-managed-identity Autentica con l'identità gestita alla risorsa specificata nell'attributo resource . NO
procura Indirizza la richiesta tramite proxy HTTP. NO

Utilizzo

Note sull'utilizzo

Se l'istanza di API Management viene distribuita (inserita) in una rete virtuale in modalità interna e si usa questo criterio per inviare una richiesta API a un'API esposta nella stessa istanza di API Management, è possibile che si verifichi un timeout con un errore HTTP 500 BackendConnectionFailure. Questo è il risultato di una limitazione di Azure Load Balancer.

Per concatenare le richieste API al gateway in questo scenario, configurare set-url per usare l'URL di loopback localhost https://127.0.0.1. Impostare anche l'intestazione HOST per specificare l'host gateway dell'istanza di API Management. È possibile usare l'host di dominio predefinito azure-api.net o personalizzato. Ad esempio:

<send-request>
     <set-url>https://127.0.0.1/myapi/myoperation</set-url>
     <set-header name="Host">
         <value>myapim.azure-api.net</value>
     </set-header>
</send-request>

Per ulteriori informazioni, vedi questo post di blog.

Esempio

Questo esempio mostra un metodo per verificare un token di riferimento con un server di autorizzazione. Per altre informazioni relative a questo esempio, vedere Uso di servizi esterni dal servizio Gestione API di Azure.

<inbound>
  <!-- Extract token from Authorization header parameter -->
  <set-variable name="token" value="@(context.Request.Headers.GetValueOrDefault("Authorization","scheme param").Split(' ').Last())" />

  <!-- Send request to Token Server to validate token (see RFC 7662) -->
  <send-request mode="new" response-variable-name="tokenstate" timeout="20" ignore-error="true">
    <set-url>https://microsoft-apiappec990ad4c76641c6aea22f566efc5a4e.azurewebsites.net/introspection</set-url>
    <set-method>POST</set-method>
    <set-header name="Authorization" exists-action="override">
      <value>basic dXNlcm5hbWU6cGFzc3dvcmQ=</value>
    </set-header>
    <set-header name="Content-Type" exists-action="override">
      <value>application/x-www-form-urlencoded</value>
    </set-header>
    <set-body>@($"token={(string)context.Variables["token"]}")</set-body>
  </send-request>

  <choose>
        <!-- Check active property in response -->
        <when condition="@((bool)((IResponse)context.Variables["tokenstate"]).Body.As<JObject>()["active"] == false)">
            <!-- Return 401 Unauthorized with http-problem payload -->
            <return-response>
                <set-status code="401" reason="Unauthorized" />
                <set-header name="WWW-Authenticate" exists-action="override">
                    <value>Bearer error="invalid_token"</value>
                </set-header>
            </return-response>
        </when>
    </choose>
  <base />
</inbound>

Per ulteriori informazioni sull'utilizzo dei criteri, vedere: