本頁內容適用於 Apigee 和 Apigee Hybrid。
查看
Apigee Edge 說明文件。
結果
GraphQL 政策可將 GraphQL 酬載解析為訊息流程變數,並驗證 GraphQL 要求是否符合結構定義,或同時執行這兩項操作。
您可以使用 GraphQL 政策執行下列操作:
- 請確保 API 只處理符合您提供的結構定義要求。
- 設定允許的片段數量上限,對酬載限制加以限制。
- 將 GraphQL 與 API 產品建立關聯。
- 利用 Oauth2、VerifyAPIKey 和配額政策功能,就像在 REST 中一樣。
GraphQL 支援下列酬載類型:
- 使用
Content-Type : application/graphql
將 GraphQL 酬載 POST 到 - 使用
Content-Type: applcation/json
將 GraphQL 酬載 POST 到 - 取得 GraphQL 酬載 (酬載為查詢參數)
詳情請參閱下列資源:
這項政策屬於標準政策,可部署至任何環境類型。如要瞭解各環境類型適用的政策類型和可用性,請參閱「政策類型」。
如需使用這項政策的範例,請參閱「使用 GraphQL」。
<GraphQL>
元素
定義 <GraphQL>
政策。
預設值 | 請參閱下方的「預設政策」分頁 |
是否必要 | 必填 |
類型 | 類型 |
父項元素 | 不適用 |
子項元素 | <Action> <MaxDepth> <MaxCount> <MaxPayloadSizeInBytes> <OperationType> <Source> <ResourceURL> |
語法
<GraphQL>
元素使用下列語法:
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Source>request</Source> <OperationType>[query|mutuation|all]</OperationType> <MaxDepth>MAX_DEPTH</MaxDepth> <MaxCount>MAX_NUMBER_OF_QUERIES</MaxCount> // [Start maxpayloadsize] <MaxPayloadSizeInBytes>MAX_PAYLOAD_SIZE_IN_BYTES</MaxPayloadSizeInBytes> <Action>parse</Action> <ResourceURL>PATH/TO/SCHEMA.xsd</ResourceURL> </GraphQL>
預設政策
下列範例顯示在 Apigee UI 中將 <GraphQL>
政策新增至流程時的預設設定:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <GraphQL name="GraphQLParser"> <Source>request</Source> <OperationType>query</OperationType> <MaxDepth>10</MaxDepth> <MaxCount>10</MaxCount> <MaxPayloadSizeInBytes></MaxPayloadSizeInBytes> <Action>parse</Action> <ResourceURL></ResourceURL> </GraphQL>
這個元素包含下列所有政策都適用的屬性:
屬性 | 預設 | 是否必要? | 說明 |
---|---|---|---|
name |
不適用 | 必要 |
政策的內部名稱。 您可以選擇使用 |
continueOnError |
false | 選用 | 將其設為 false ,即可在政策失敗時傳回錯誤。這是大多數政策的預期行為。將其設為 true ,即使政策失敗,流程執行作業仍會繼續進行。另請參閱:
|
enabled |
是 | 選用 | 設為 true 即可強制執行政策。設為 false 即可關閉政策。即使政策仍附加至流程,系統也不會強制執行這項政策。 |
async |
false | 已淘汰 | 此屬性已淘汰。 |
下表提供 <GraphQL>
子元素的高階說明:
子元素 | 是否必要 | 說明 |
---|---|---|
常見作業 | ||
<Action> |
選用 | 指定對要求採取的動作:parse 、verify 或 parse_verify (兩者)。 |
<MaxCount> |
選用 | GraphQL 要求可產生的查詢或片段數量上限。預設值為 10。 |
<MaxDepth> |
選用 | 查詢的樹狀結構深度上限。預設值為 4。 |
<MaxPayloadSizeInBytes> |
選用 | 酬載大小上限 (以 KB 為單位)。 |
<OperationType> |
必填 | 指定可剖析的要求類型:query 、mutation 或 query_mutation (任一)。 |
<ResourceURL> |
選用 | 說明。GraphQL 結構定義檔案的位置。 |
<Source> |
必填 | request |
後續章節將說明這些子元素。
子元素參照
本節說明 <GraphQL>
的子元素。
<Action>
Action 代表下列其中一個 GraphQL 動作:
parse
:Apigee 會將 GraphQL 酬載剖析為訊息流程變數。 如要瞭解Action
設為parse
時設定的變數,請參閱訊息流程變數表示法範例。這可節省後端寶貴的 CPU 時間。請注意,verify
也會剖析酬載。verify
:Apigee 會驗證 GraphQL 酬載是否符合上傳至 Proxy 的結構定義。parse_verify
:Apigee 會剖析及驗證 GraphQL 要求。
預設值 | parse |
必填與否 | 選用 |
類型 | 字串 |
父項元素 | <GraphQL> |
子元素 | 無 |
<Action>
元素使用下列語法:
語法
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Action>parse</Action> </GraphQL>
<MaxCount>
酬載中可包含的片段數量上限。 您可以藉此防止客戶的 GraphQL 後端伺服器執行高度複雜的查詢,強制用戶端將邏輯分割為較小的酬載。
預設值 | 10 |
必填與否 | 選用 |
類型 | 字串 |
父項元素 | <GraphQL> |
子元素 | 無 |
<MaxCount>
元素使用下列語法:
語法
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <MaxCount>MAX_NUMBER_OF_QUERIES</MaxCount> </GraphQL>
<MaxDepth>
以樹狀結構表示時,查詢的最大深度。
MaxDepth
可讓您封鎖酬載中的深層查詢,這樣 Apigee 就不必建立非常大的流程變數來保留值。不過,無論 MaxDepth
的值為何,系統都會照常傳送酬載。
預設值為 10。
預設值 | 10 |
必填與否 | 選用 |
類型 | 整數 |
父項元素 | <GraphQL> |
子元素 | 無 |
<MaxDepth>
元素使用下列語法:
語法
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <MaxDepth>MAX_DEPTH</MaxDepth> </GraphQL>
<MaxPayloadSizeInBytes>
酬載大小上限 (以 KB 為單位)。您可以使用這項功能限制酬載大小,避免發生效能問題。
注意:如果政策中未提供 MaxPayloadSizeInByte
,系統就不會強制執行大小限制。
預設值 | request |
必填與否 | 選用 |
類型 | 字串 |
父項元素 | <GraphQL> |
子元素 | 無 |
<MaxPayloadSizeInBytes>
元素使用下列語法:
語法
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <MaxPayloadSizeInBytes>MAX_PAYLOAD_SIZE_IN_BYTES</MaxPayloadSizeInBytes> </GraphQL>
<OperationType>
指出可剖析的要求類型:
query
:GraphQL 查詢。mutation
:GraphQL 異動query_mutation
:GraphQL 查詢或異動。
如果範圍是 query
,且傳遞了變動要求,要求就會失敗並傳回 4xx
錯誤。
預設值 | query |
必填與否 | 選用 |
類型 | 字串 |
父項元素 | <GraphQL> |
子元素 | 無 |
<OperationType>
元素使用下列語法:
語法
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <OperationType>[query|mutation|query_mutation]</OperationType> </GraphQL>
<ResourceURL>
GraphQL 政策用來驗證要求的 GraphQL 結構定義檔路徑。如需將 GraphQL 結構定義上傳至 Apigee 的範例,請參閱「範例」。
如果上傳的結構定義檔案名稱為 my-schema.graphql
,則 <ResourceURL>
元素會是
<ResourceURL>graphql://my-schema.graphql</ResourceURL>
預設值 | 不適用 |
必填與否 | 選用 |
類型 | 字串 |
父項元素 | <GraphQL> |
子元素 | 無 |
ResourceURL
元素使用下列語法:
語法
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <ResourceURL>PATH/TO/SCHEMA.graphql</ResourceURL> </GraphQL>
<Source>
執行這項政策的來源。
預設值 | request |
必填與否 | 選用 |
類型 | 字串 |
父項元素 | <GraphQL> |
子元素 | 無 |
<Source>
元素使用下列語法:
語法
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Source>request</Source> </GraphQL>
GraphQL 剖析器
GraphQL 剖析器支援 GraphQL 查詢的所有功能,並以訊息流程虛線標記法表示為圖形。查詢可包含作業定義,以及 (選擇性) 識別為片段定義的片段。請參閱 GraphQL 規格。
GraphQL 要求的剖析
下圖顯示 GraphQL 要求的結構。

作業定義在訊息流程中的表示方式
剖析器實作涵蓋 GraphQL 語法的所有層面,包括支援查詢和變異。請參閱「訊息流程變數」。
訊息流程變數遵循以下慣例:
graphql.(root-index).(root definition)[(sub-indices).(child-definitions)…]
其中:
graphql
:靜態前置字元,表示這是與 GraphQL 相關的訊息流程變數root-Index
:以 0 為準的索引,指出根層級查詢定義索引 (每個要求最多 4 個,預設為 1 個)root-definition
:根層級的 GraphQL 要求訊息主體、引數及其值sub-indices
:子項索引child-definitions
:與特定欄位及其值相關的葉層級定義
作業定義的訊息流程變數表示法
訊息中的欄位 | 類型 | 說明 |
---|---|---|
名稱 | 字串 | GraphQL 運算的名稱。請注意,這個名稱與訊息流程中的名稱無關。 |
定義 | 字串 - 作業 | 指出這包含查詢要求的主要訊息主體 |
operationType | 查詢或異動 | 執行的作業類型。 |
variableDefinition | 整數 | 這些定義的運作方式,與型別語言中函式的引數定義相同。其中列出所有變數,並以 $ 為前置字元,後面接著變數類型。 |
指令 | 整數 | 目前提供 @include 和 @skip 這兩項指令,可根據動態傳遞的值進行篩選。 |
selectionSet | 整數 | 與物件相關聯的所有屬性,在邏輯上會歸為同一層級。 |
訊息流程中的片段定義表示法
訊息流程變數名稱 | 類型 | 說明 |
---|---|---|
名稱 | 字串 | 片段名稱。 |
定義 | 字串片段 | 表示要求主體是主要要求的片段。 |
typeCondition | 字串 | 片段的叫用條件。 |
variableDefinition | 整數 | 以引數形式傳遞至片段的變數定義。 |
訊息流程變數表示法的範例
下列範例顯示範例要求酬載的訊息流程變數表示法。
查詢範例 1
這個範例顯示以引數做為輸入內容的查詢,可查詢員工的三項屬性。
{ employee(id: 123) { id firstName lastName } }
下表顯示對應的訊息流程變數表示法。
訊息流程變數 | 值 |
---|---|
graphql.operation.operationType |
QUERY |
graphql.fragment.count |
1 |
graphql.operation.selectionSet.count |
1 |
graphql.operation.variableDefinitions.count |
0 |
graphql.operation.selectionSet.1.name |
employee |
graphql.operation.selectionSet.1.argument.count |
1 |
graphql.operation.selectionSet.1.argument.1.name |
id |
graphql.operation.selectionSet.1.argument.1.value |
IntValue{value=123} |
graphql.operation.selectionSet.1.directive.count |
0 |
graphql.operation.selectionSet.1.selectionSet.count |
3 |
graphql.operation.selectionSet.1.selectionSet.1.name |
id |
graphql.operation.selectionSet.1.selectionSet.2.name |
firstName |
graphql.operation.selectionSet.1.selectionSet.3.name |
lastName |
查詢範例 2
這個範例顯示以引數做為輸入內容的查詢,用於查詢好友名稱。
query Characters($episode: Episode, $withFriends: Boolean!) { friends @include(if: $withFriends) { friendsName } }
下表顯示對應的訊息流程變數表示法。
訊息流程變數 | 值 |
---|---|
graphql.operation.operationType |
QUERY |
graphql.operation.selectionSet.count |
1 |
graphql.operation.name |
Characters |
graphql.fragment.count |
0 |
graphql.operation.selectionSet.1.name |
friends |
graphql.operation.variableDefinitions.count |
2 |
graphql.operation.variableDefinitions.1.name |
episode |
graphql.operation.variableDefinitions.1.type |
TypeName{name='Episode'} |
graphql.operation.variableDefinitions.2.name |
withFriends |
graphql.operation.variableDefinitions.2.type |
NonNullType{type=TypeName{name='Boolean'}} |
graphql.operation.selectionSet.1.argument.count |
0 |
graphql.operation.selectionSet.1.selectionSet.count |
1 |
graphql.operation.selectionSet.1.selectionSet.1.name |
friendsName |
graphql.operation.selectionSet.1.directive.count |
1 |
graphql.operation.selectionSet.1.directive.1.argument.1.name |
if |
graphql.operation.selectionSet.1.directive.1.argument.1.value |
VariableReference{name='withFriends'} |
查詢範例 3
這個範例含有別名變數定義。
query getUsers { admins: users(role: ADMIN) { lastName } accountants: users(role: ACCOUNTANT) { firstName } }
下表顯示對應的訊息流程變數表示法。
訊息流程變數 | 值 |
---|---|
graphql.operation.operationType |
QUERY |
graphql.operation.selectionSet.count |
2 |
graphql.operation.selectionSet.1.name |
users |
graphql.operation.selectionSet.1.alias |
admins |
graphql.operation.variableDefinitions.count |
0 |
graphql.operation.selectionSet.1.argument.count |
1 |
graphql.operation.selectionSet.1.argument.1.name |
role |
graphql.operation.selectionSet.1.argument.1.value |
EnumValue{name='ADMIN'} |
graphql.operation.selectionSet.1.argument.2.name |
null |
graphql.operation.selectionSet.1.argument.2.value |
null |
graphql.operation.selectionSet.1.selectionSet.count |
1 |
graphql.operation.selectionSet.1.selectionSet.count |
1 |
graphql.operation.selectionSet.1.selectionSet.1.name |
lastName |
graphql.operation.selectionSet.1.selectionSet.1.alias |
null |
graphql.operation.selectionSet.1.selectionSet.2.name |
null |
graphql.operation.selectionSet.1.selectionSet.2.alias |
null |
graphql.operation.selectionSet.1.directive.count |
0 |
graphql.operation.selectionSet.1.directive.1.argument.1.name |
null |
graphql.operation.selectionSet.1.directive.1.argument.1.value |
null |
graphql.operation.selectionSet.2.name |
users |
graphql.operation.selectionSet.2.alias |
accountants |
graphql.operation.selectionSet.2.argument.count |
1 |
graphql.operation.selectionSet.2.argument.1.name |
role |
graphql.operation.selectionSet.2.argument.1.value |
EnumValue{name='ACCOUNTANT'} |
graphql.operation.selectionSet.2.selectionSet.count |
1 |
graphql.operation.selectionSet.2.selectionSet.1.name |
firstName |
graphql.operation.selectionSet.2.directive.count |
0 |
graphql.operation.selectionSet.2.selectionSet.1.alias |
null |
graphql.operation.selectionSet.2.selectionSet.2.name |
null |
graphql.operation.selectionSet.2.selectionSet.2.alias |
null |
graphql.operation.selectionSet.2.directive.count |
0 |