查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
HTTP 標頭是名稱/值組合,可讓用戶端應用程式與後端服務 分別傳遞關於要求和回應的其他資訊。以下是一些簡單的範例:
- Authorization 要求標頭會將使用者憑證傳遞至伺服器:
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
Content-Type標頭代表傳送的要求/回應內容類型:Content-Type: application/json
HTTP 標頭可以有一或多個值,取決於 標頭欄位定義。 多值標頭會以半形逗號分隔值。以下列舉幾個包含多個值的標頭範例:
Cache-Control: no-cache, no-store, must-revalidateAccept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8X-Forwarded-For: 10.125.5.30, 10.125.9.125
Apigee Edge 可讓開發人員透過 流程變數 套用任何邊緣政策或條件式流程以下是您可以使用的變數清單 存取 Edge 中的特定要求或回應標頭:
流程變數:
message.header.header-namerequest.header.header-nameresponse.header.header-namemessage.header.header-name.Nrequest.header.header-name.Nresponse.header.header-name.N
JavaScript 物件:
context.proxyRequest.headers.header-namecontext.targetRequest.headers.header-namecontext.proxyResponse.headers.header-namecontext.targetResponse.headers.header-name
以下 AssignMessage 政策範例說明如何讀取要求標頭的值,並將其儲存至變數中:
<AssignMessage continueOnError="false" enabled="true" name="assign-message-default"> <AssignVariable> <Name>reqUserAgent</Name> <Ref>request.header.User-Agent</Ref> </AssignVariable> </AssignMessage>
反模式
以僅傳回第一個值的方式存取 Edge 政策中的 HTTP 標頭值 是不正確的,如果特定的 HTTP 標頭含有多個值,就會發生問題。
以下各節提供標頭存取範例。
示例 1:使用 JavaScript 程式碼讀取多重值的 Accept 標頭
假設 Accept 標頭包含多個值,如下所示:
Accept: text/html, application/xhtml+xml, application/xml
以下是讀取 Accept 標頭值的 JavaScript 程式碼:
// Read the values from Accept header var acceptHeaderValues = context.getVariable("request.header.Accept");
上述 JavaScript 程式碼只會傳回 Accept 標頭中的第一個值,
例如 text/html
範例 2:讀取 AssignMessage 或 PromoteFault 政策中的多值 Access-Control-Allow-Headers 標頭
假設 Access-Control-Allow-Headers 標頭包含多個值,如下所示:
Access-Control-Allow-Headers: content-type, authorization
以下是 AssignMessage 或 PromoteFault 政策設定 Access-Control-Allow-Headers 標頭的程式碼部分:
<Set>
<Headers>
<Header name="Access-Control-Allow-Headers">{request.header.Access-Control-Request-Headers}</Header>
</Headers>
</Set>上述程式碼只將標頭 Access-Control-Allow-Headers 設為只有
要求標頭 Access-Control-Allow-Headers,在本範例中為 content-type。
影響
- 請注意,在上述兩個範例中,系統只會傳回多重值標頭中的第一個值。 如果這些值之後供 API Proxy 流程中的其他政策或後端服務使用 執行某些函式或邏輯,可能會產生非預期的結果或結果。
- 存取要求標頭值並傳遞至目標伺服器時,API 要求可以是 導致後端未正確處理,因此可能會傳回不正確的結果。
- 如果用戶端應用程式依賴的是 Edge 回應的特定標頭值,則 也可能會以錯誤的方式處理,並提供不正確的結果。
最佳做法
使用適當的內建流程變數:
request.header.header_name.values.count、request.header.header_name.N、response.header.header_name.values.count、response.header.header_name.N。接著請反覆執行 JavaScript 或 Java 呼叫政策,從特定標頭擷取所有值。
示例:用於讀取多值標頭的 JavaScript 程式碼範例
敬上for (var i = 1; i <=context.getVariable('request.header.Accept.values.count'); i++) { print(context.getVariable('request.header.Accept.' + i)); }
舉例來說,
application/xml;q=0.9, */*;q=0.8會顯示為一個值,且包含上述的程式碼。如果要以半形分號做為分隔符號分割標頭值,請使用
string.split(";")來分隔成值在流程變數
request.header.header_name.values上使用substring()函式 ,以讀取特定標頭的所有值。範例:PromoteFault 或 AssignMessage 政策以讀取多值標頭的範例
<Set> <Headers> <Header name="Access-Control-Allow-Headers">{substring(request.header.Access-Control-Request-Headers.values,1,-1)}</Header> </Headers> </Set>