傳送要求

適用於:所有 APIM 層

send-request 原則會將所提供的要求傳送至指定的 URL,等候時間不會超過所設定的逾時值。

注意

請依照原則陳述式中提供的順序,來設定原則的元素和子元素。 深入了解如何設定或編輯 APIM 原則。

原則陳述式

<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>

屬性

屬性 描述 是必要欄位 預設
模式 判斷這是 new 要求,還是目前要求中標頭和本文的 copy。 在輸出原則區段中,mode=copy 不會將要求本文初始化。 允許使用原則運算式。 否 new
response-variable-name 將會收到回應物件之內容變數的名稱。 如果變數不存在,即會在原則成功執行時加以建立,並變成可透過 context.Variable 集合進行存取。 允許使用原則運算式。 是的 N/A
超時 以秒為單位的逾時間隔,URL 的呼叫在經過此間隔後便會失敗。 允許使用原則運算式。 否 六十
ignore-error 如果為 true 且要求導致錯誤,即會忽略錯誤,且回應變數將包含 Null 值。 不允許使用原則運算式。 否 false

元素

元素 描述 是必要欄位
設定網址 (set-url) 要求的 URL。 允許使用原則運算式。 如果 mode=copy 即為「否」,否則為「是」。
設定方法 設定要求的方法。 不允許使用原則運算式。 如果 mode=copy 即為「否」,否則為「是」。
set-header 在要求中設定標頭。 針對多個要求標頭使用多個 set-header 元素。 否
set-body 設定要求的本文。 否
認證證書 用於用戶端驗證的憑證,在 thumbprint 屬性中指定。 否
authentication-managed-identity 用管理身份驗證 屬性中 resource 指定的資源。 否
Proxy 透過 HTTP Proxy 路由傳送要求。 否

使用方式

使用注意事項

如果您的 APIM 執行個體是在「內部」模式的 VNet 中部署 (插入),而且您使用此原則來將 API 要求傳送至在相同 APIM 執行個體中公開的 API,則您可能會遇到逾時且發生 HTTP 500 BackendConnectionFailure 錯誤。 這是 Azure Load Balancer 限制的結果。

若要將此案例中的 API 要求鏈結至閘道,請將 set-url 設定為使用 localhost 回送 URL https://127.0.0.1。 此外,設定 HOST 標頭,以指定此 APIM 執行個體的閘道主機。 您可以使用預設的 azure-api.net 或您的自訂網域主機。 例如:

<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>

如需詳細資訊,請參閱這篇部落格文章。

範例

此範例會顯示向授權伺服器確認參考權杖的方法。 如需此範例的詳細資訊,請參閱使用來自 Azure API 管理服務的外部服務。

<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>

如需使用原則的詳細資訊,請參閱: