Share via


傳送要求

適用於:所有 API 管理 層

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" />
  <proxy>...</proxy>
</send-request>

屬性

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

元素

元素 描述 必要
set-url 要求的 URL。 允許使用原則運算式。 如果 mode=copy 即為「否」,否則為「是」。
set-method 設定要求的方法。 不允許使用原則運算式。 如果 mode=copy 即為「否」,否則為「是」。
set-header 在要求中設定標頭。 針對多個要求標頭使用多個 set-header 元素。 No
set-body 設定要求的本文。 No
authentication-certificate 用於用戶端驗證的憑證,在 thumbprint 屬性中指定。 No
Proxy 透過 HTTP Proxy 路由傳送要求。 No

使用方式

使用注意事項

如果您的 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>

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