内容
HTTPModifier 政策可以更改现有请求或响应消息。
该政策可让您对这些消息执行以下操作:
您可以使用 HTTPModifier 来添加、更改或移除任一请求或响应的属性。您也可以使用 HTTPModifier 来创建自定义请求或响应消息,并将其传递给替代目标,如创建自定义请求消息中所述。
HTTPModifier 政策可以使用以下子元素创建流变量:
组织 <Add>、<Set> 和 <Remove> 元素所按照的顺序很重要。该政策按照这些操作在政策配置中出现的顺序来执行这些操作。如果您需要移除所有标头,然后设置特定标头,则应该在 <Set> 元素之前添加 <Remove> 元素。
此政策为标准政策,可部署到任何环境类型。如需了解政策类型以及在每种环境类型中的可用性,请参阅政策类型。
<HTTPModifier> 元素
定义 HTTPModifier 政策。
| 默认值 | 请参阅下面的默认政策标签页 |
| 是否必需? | 必需 |
| 类型 | 复杂对象 |
| 父元素 | 不适用 |
| 子元素 |
<Add><AssignTo><DisplayName><IgnoreUnresolvedVariables><Remove><Set> |
<HTTPModifier> 元素使用以下语法:
语法
<HTTPModifier> 元素使用以下语法:
<HTTPModifier continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <!-- All HTTPModifier child elements are optional --> <Add> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> <Headers> <Header name="HEADER_NAME">HEADER_VALUE</Header> ... </Headers> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> </Add> <AssignTo createNew="[true|false]" transport="http" type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo> <DisplayName>POLICY_DISPLAY_NAME</DisplayName> <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables> <!-- Can also be empty to remove everything from the message (<Remove/>) --> <Remove> <!-- Can also be an empty array to remove all FormParams (<FormParams/>) --> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> <!-- Can also be an empty array to remove all Headers (<Headers/>) --> <Headers> <Header name="HEADER_NAME">HEADER_VALUE</Header> ... </Headers> <!-- Can also be an empty array to remove all QueryParams (<QueryParams/>) --> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> </Remove> <Set> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> <Headers> <Header name="HEADER_NAME">HEADER_VALUE</Header> ... </Headers> <Path>PATH</Path> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> <StatusCode>HTTP_STATUS_CODE or {variable}</StatusCode> <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb> <Version>[1.0|1.1|{variable}]</Verb> </Set> </HTTPModifier>
默认政策
以下示例展示了在 Apigee 界面中将 HTTPModifier 政策添加到流时的默认设置:
<HTTPModifier continueOnError="false" enabled="true" name="http-modifier-default"> <DisplayName>HTTP Modifier-1</DisplayName> <Properties/> <Remove> <Headers> <Header name="h1"/> </Headers> <QueryParams> <QueryParam name="q1"/> </QueryParams> <FormParams> <FormParam name="f1"/> </FormParams> </Remove> <Add> <Headers/> <QueryParams/> <FormParams/> </Add> <Set> <Headers/> <QueryParams/> <FormParams/> <!-- <Verb>GET</Verb> --> <Path/> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </HTTPModifier>
当您在 Apigee 界面中插入新的 HTTPModifier 政策时,模板包含所有可能操作的存根。您通常可以选择要对此政策执行的操作,并移除其余的子元素。例如,如果您要执行添加操作,则使用 <Add> 元素并从该政策中移除 <Remove> 和其他子元素,以提高可读性。
此元素具有所有政策中常见的以下属性:
| 属性 | 默认 | 是否必需? | 说明 |
|---|---|---|---|
name |
无 | 必需 |
政策的内部名称。 (可选)使用 |
continueOnError |
false | 可选 | 设置为 false 可在政策失败时返回错误。这是大多数政策的预期行为。设置为 true,即使在政策失败后,仍可以继续执行流。另请参阅:
|
enabled |
true | 可选 | 设置为 true 可实施政策。 设为 false 可关闭政策。即使政策仍附加到某个流,也不会强制执行该政策。 |
async |
false | 已弃用 | 此属性已弃用。 |
下表提供了 <HTTPModifier> 的子元素的简要说明:
| 子元素 | 是否必需? | 说明 |
|---|---|---|
| 常见操作 | ||
<Add> |
可选 | 将信息添加到由 <AssignTo> 元素指定的消息对象。
如需覆盖现有标头或参数,请使用 |
<Remove> |
可选 | 从在 <AssignTo> 元素中指定的消息变量中删除指定的元素。 |
<Set> |
可选 | 替换由 <AssignTo> 元素指定的请求或响应中的现有属性的值。
|
| 其他子元素 | ||
<AssignTo> |
可选 | 指定 HTTPModifier 政策处理的消息。这可以是标准请求或响应,也可以是新的自定义消息。 |
<IgnoreUnresolvedVariables> |
可选 | 确定在遇到无法解析的变量时处理是否停止。 |
后续各部分介绍了每个子元素。
示例
以下示例展示了使用 HTTPModifier 政策的一些方式:
1: 添加标头
以下示例使用 <Add> 元素将标头添加到请求。此示例中的 VerifyAPIKey 变量由 VerifyAPIKey 政策生成:
<HTTPModifier name="HM-add-headers-1">
<Add>
<Headers>
<Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
</Headers>
</Add>
<AssignTo>request</AssignTo>
</HTTPModifier>2:修改响应
以下示例通过将标头添加到现有响应对象来修改该对象:
<HTTPModifier name="HM-modify-response">
<Set>
<Headers>
<Header name="Cache-Hit">{lookupcache.LookupCache-1.cachehit}</Header>
</Headers>
</Set>
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
<AssignTo>response</AssignTo>
</HTTPModifier>此示例不会创建新消息。而是通过添加 HTTP 标头修改现有的响应消息。
因为此示例在 <AssignTo> 元素中指定 response 作为变量名称,所以此政策会修改最初由目标服务器返回的数据设置的响应对象。
此政策添加到响应消息中的 HTTP 标头派生自通过 LookupCache 政策填充的变量。因此,由 HTTPModifier 政策修改的响应消息包含一个 HTTP 标头,用于指示是否已从缓存中拉取结果。在响应中设置标头可以方便进行调试和问题排查。
5:移除查询参数
以下示例从请求中移除 apikey 查询参数:
<HTTPModifier name="HM-remove-query-param">
<Remove>
<QueryParams>
<QueryParam name="apikey"/>
</QueryParams>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>使用 VerifyAPIKey 政策进行用户身份验证时,最佳做法是从请求消息中删除 apikey 查询参数。这样做可以防止将敏感密钥信息传递到后端目标。
子元素参考
本部分介绍 <HTTPModifier> 的子元素。
<Add>
将信息添加到由 <AssignTo> 元素指定的请求或响应。
<Add> 元素会在消息中添加在原始消息中不存在的新属性。请注意,<Set> 也提供此功能。如需更改现有属性的值,请使用 <Set> 元素。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | 复杂类型 |
| 父元素 |
<HTTPModifier>
|
| 子元素 |
<FormParams><Headers><QueryParams> |
<Add> 元素使用以下语法:
语法
<HTTPModifier
continueOnError="[false|true]"
enabled="[true|false]"
name="POLICY_NAME" >
<Add>
<FormParams>
<FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
...
</FormParams>
<Headers>
<Header name="HEADER_NAME">HEADER_VALUE</Header>
...
</Headers>
<QueryParams>
<QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
...
</QueryParams>
</Add>
</HTTPModifier>示例 1
以下示例使用 <FormParams> 元素获取初始请求中三个查询字符串参数的值,并将它们设置为目标端点请求中的表单参数:
<HTTPModifier name="HM-add-formparams-3">
<Add>
<FormParams>
<FormParam name="username">{request.queryparam.name}</FormParam>
<FormParam name="zip_code">{request.queryparam.zipCode}</FormParam>
<FormParam name="default_language">{request.queryparam.lang}</FormParam>
</FormParams>
</Add>
<Remove>
<QueryParams/>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>示例 2
以下示例使用 <Headers> 元素将 partner-id 标头添加到将发送到目标端点的请求:
<HTTPModifier name="HM-add-headers-1">
<Add>
<Headers>
<Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
</Headers>
</Add>
<AssignTo>request</AssignTo>
</HTTPModifier>示例 3
以下示例使用 <QueryParams> 元素将带有静态值的单个查询参数添加到请求:
<HTTPModifier name="HM-add-queryparams-1">
<Add>
<QueryParams>
<QueryParam name="myParam">42</QueryParam>
</QueryParams>
</Add>
<AssignTo>request</AssignTo>
</HTTPModifier>此示例在请求 PreFlow 中使用 <Add>。如果您在调试工具等工具中查看结果,则对 https://example-target.com/get 的请求将变为 https://example-target.com/get?myParam=42。
<Add> 的子元素支持名为消息模板的动态字符串替换。
<FormParams>(<Add> 的子元素)
将新的表单参数添加到请求消息。此元素对响应消息没有任何影响。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | <FormParam> 元素的数组 |
| 父元素 |
<Add>
|
| 子元素 |
<FormParam> |
<FormParams> 元素使用以下语法:
语法
<HTTPModifier continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Add> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> <AssignTo createNew="[true|false]" transport="http" type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo> </Add> </HTTPModifier>
示例 1
以下示例向请求添加了一个表单参数 (answer) 和一个静态值 (42):
<HTTPModifier name="HM-add-formparams-1">
<Add>
<FormParams>
<FormParam name="answer">42</FormParam>
</FormParams>
</Add>
<AssignTo>request</AssignTo>
</HTTPModifier>示例 2
以下示例获取 name 查询参数的值,并将其作为表单参数添加到请求中,然后移除该查询参数:
<HTTPModifier name="HM-Swap-QueryParam-to-FormParams">
<Add>
<FormParam name="name">{request.queryparam.name}
</Add>
<Remove>
<QueryParam name="name"/>
</Remove>
</HTTPModifier>请注意,此示例没有使用 <AssignTo> 指定目标。此政策仅将参数添加到请求。
示例 3
以下示例将多个表单参数添加到请求:
<HTTPModifier name="HM-add-formparams-3">
<Add>
<FormParams>
<FormParam name="username">{request.queryparam.name}</FormParam>
<FormParam name="zip_code">{request.queryparam.zipCode}</FormParam>
<FormParam name="default_language">{request.queryparam.lang}</FormParam>
</FormParams>
</Add>
<Remove>
<QueryParams/>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>此示例从起源请求获取查询字符串参数,并将它们添加为具有不同名称的表单参数。然后移除原始查询参数。 Apigee 会将修改后的请求发送到目标端点。
您可以使用调试工具来查看流。您将看到请求的正文包含网址编码的表单数据,这些数据最初是作为查询字符串参数传递的:
username=nick&zip_code=90210&default_language=en
仅在满足以下条件时才能使用 <FormParams>:
- HTTP 动词:
GET、POST - 消息类型:请求
- 以下其中一项或全部两项:
- 表单数据:设置为某个值或
""(空字符串)。例如,使用curl将-d ""添加到请求。 Content-Length标头:设置为 0(如果原始请求中没有数据,否则设置为当前长度,以字节为单位)。例如,使用curl将-H "Content-Length: 0"添加到请求。
- 表单数据:设置为某个值或
例如:
curl -vL -X POST -d "" -H "Content-Type: application/x-www-form-urlencoded" https://ahamilton-eval-test.apigee.net/am-test
添加 <FormParams> 时,Apigee 会将请求的 Content-Type 标头设置为 application/x-www-form-urlencoded,然后再将消息发送到目标服务。
<Headers>(<Add> 的子元素)
将新的标头添加到由 <AssignTo> 元素指定的请求或响应。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | <Header> 元素的数组 |
| 父元素 |
<Add>
|
| 子元素 |
<Header> |
<Headers> 元素使用以下语法:
语法
<HTTPModifier
continueOnError="[false|true]"
enabled="[true|false]"
name="POLICY_NAME" >
<Add>
<Headers>
<Header name="HEADER_NAME">HEADER_VALUE</Header>
...
</Headers>
</Add>
</HTTPModifier>示例 1
以下示例将 partner-id 标头添加到请求消息,并将 verifyapikey.VAK-1.developer.app.partner-id 流变量的值分配给该标头。
<HTTPModifier name="HM-add-headers-1">
<Add>
<Headers>
<Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
</Headers>
</Add>
<AssignTo>request</AssignTo>
</HTTPModifier><QueryParams>(<Add> 的子元素)
将新的查询参数添加到请求。此元素对响应没有任何影响。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | <QueryParam> 元素的数组 |
| 父元素 |
<Add>
|
| 子元素 |
<QueryParam> |
<QueryParams> 元素使用以下语法:
语法
<HTTPModifier
continueOnError="[false|true]"
enabled="[true|false]"
name="POLICY_NAME" >
<Add>
<QueryParams>
<QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
...
</QueryParams>
</Add>
</HTTPModifier>示例 1
以下示例将查询参数 myParam 添加到请求中,并将值 42 分配给该参数:
<HTTPModifier name="HM-add-queryparams-1">
<Add>
<QueryParams>
<QueryParam name="myParam">42</QueryParam>
</QueryParams>
</Add>
<AssignTo>request</AssignTo>
</HTTPModifier>仅在满足以下条件时才能使用 <QueryParams>:
- HTTP 动词:
GET、POST - 消息类型:请求
此外,仅当 <AssignTo> 元素的 type 属性是请求消息时,才能设置查询参数。在响应中设置它们没有任何影响。
如果您在政策 (<Add><QueryParams/></Add>) 中定义空的查询参数数组,则该政策不会添加任何查询参数。这与省略 <QueryParams> 相同。
<AssignTo>
确定 HTTPModifier 政策处理的对象。以下是各个选项:
请注意,在某些情况下,无法更改 HTTPModifier 政策作用于的对象。例如,您不能使用 <Add> 或 <Set> 来添加或更改响应中的查询参数 (<QueryParams>) 或表单参数 (<FormParams>)。您只能操作请求中的查询参数和表单参数。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | 字符串 |
| 父元素 |
<HTTPModifier>
|
| 子元素 | 无 |
如果未指定 <AssignTo>,或者如果指定了 <AssignTo> 元素,但没有为该元素指定文本值,则该政策会作用于默认请求或响应,具体取决于该政策的执行位置。如果该政策在请求流中执行,则它会影响请求消息。如果该政策在响应流中执行,则默认情况下它会影响响应。
<AssignTo> 元素使用以下语法:
语法
<HTTPModifier continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <AssignTo createNew="[true|false]" transport="http" type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo> </HTTPModifier>
示例 1
以下示例指定了 <AssignTo> 文本中没有消息。这意味着政策将应用于 request 或 response 消息,具体取决于政策执行的位置。
<HTTPModifier name="assignto-1"> <AssignTo createNew="false" transport="http" type="request"/>-- no-op --> ... </HTTPModifier>
如果您指定了 createNew="false",并且未明确提供消息名称,则 <AssignTo> 的其他特性无关。在这种情况下,您可能希望完全省略 <AssignTo> 元素。
示例 2
以下示例会创建一个新的请求对象,并覆盖现有对象:
<HTTPModifier name="assignto-2"> <AssignTo createNew="true" transport="http" type="request"/> ... </HTTPModifier>
创建新的请求或响应对象时,HTTPModifier 政策的其他元素(例如 <Add> 和 <Set>)会作用于这个新的请求对象。
您可以稍后访问流中其他政策中的新请求对象,也可以使用 ServiceCallout 政策将新请求对象发送到外部服务。
示例 3
以下示例会创建一个名称为 MyRequestObject 的新请求对象:
<HTTPModifier name="assignto-3"> <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo> ... </HTTPModifier>
创建新的请求或响应对象时,HTTPModifier 政策的其他元素(例如 <Add> 和 <Set>)会作用于这个新的请求对象。
您可以稍后访问流中其他政策中的按名称所列的新请求对象,也可以使用 ServiceCallout 政策将新请求对象发送到外部服务。
下表介绍 <AssignTo> 的特性:
| 属性 | 说明 | 是否必需? | 类型 |
|---|---|---|---|
createNew |
确定在分配值时,该政策是否创建新的消息。 如果为 如果为
如果未指定
|
可选 | 布尔值 |
transport |
指定请求或响应消息类型的传输类型。 默认值为 |
可选 | 字符串 |
type |
当 createNew 为 true 时,指定新消息的类型。有效值为 request 或 response。默认值为 |
可选 | 字符串 |
<DisplayName>
除了用于 name 属性之外,还可用于在管理界面代理编辑器中使用其他更加自然的名称标记政策。
<DisplayName> 元素适用于所有政策。
| 默认值 | 不适用 |
| 是否必需? | 可选。如果省略 <DisplayName>,则会使用政策的 name 属性的值 |
| 类型 | 字符串 |
| 父元素 | <PolicyElement> |
| 子元素 | 无 |
<DisplayName> 元素使用以下语法:
语法
<PolicyElement> <DisplayName>POLICY_DISPLAY_NAME</DisplayName> ... </PolicyElement>
示例
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
<DisplayName> 元素没有属性或子元素。
<IgnoreUnresolvedVariables>
确定在遇到无法解析的变量时处理是否停止。
| 默认值 | False |
| 是否必需? | 可选 |
| 类型 | 布尔值 |
| 父元素 |
<HTTPModifier>
|
| 子元素 | 无 |
设置为 true 可忽略无法解析的变量并继续处理;否则设置为 false。默认值为 false。
将 <IgnoreUnresolvedVariables> 设置为 true 不同于将 <HTTPModifier> 的 continueOnError 设置为 true,因为前者专用于设置和获取变量的值。如果将 continueOnError 设置为 true,则 Apigee 会忽略所有错误,而不仅仅是忽略使用变量时遇到的错误。
<IgnoreUnresolvedVariables> 元素使用以下语法:
语法
<HTTPModifier
continueOnError="[false|true]"
enabled="[true|false]"
name="POLICY_NAME" >
<IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables>
</HTTPModifier>示例 1
以下示例将 <IgnoreUnresolvedVariables> 设置为 true:
<HTTPModifier name="HM-Set-Headers"> <Set> <Headers> <Header name='new-header'>{possibly-defined-variable}<Header> </Headers> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </HTTPModifier>
由于 <IgnoreUnresolvedVariables> 设置为 true,如果未定义 possibly-defined-variable 变量,则此政策不会抛出故障。
<Remove>
从消息中移除标头、查询参数或表单参数。空标记会移除所有相应的参数,包括 headers、formparams 和 queryparams。
受影响的消息可以是请求消息,也可以是响应消息。您可以使用 <AssignTo> 元素指定 <Remove> 作用于的消息。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | 复杂类型 |
| 父元素 |
<HTTPModifier>
|
| 子元素 |
<FormParams><Headers><QueryParams> |
<Remove> 的一个常见用例是从传入请求对象中删除包含敏感信息的查询参数或标头,以避免将该其传递给后端服务器。
<Remove> 元素使用以下语法:
语法
<HTTPModifier continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <!-- Can also be empty to remove everything from the message (<Remove/>) --> <Remove> <!-- Can also be an empty array to remove all FormParams (<FormParams/>) --> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> <!-- Can also be an empty array to remove all Headers (<Headers/>) --> <Headers> <Header name="HEADER_NAME">HEADER_VALUE</Header> ... </Headers> <!-- Can also be an empty array to remove all QueryParams (<QueryParams/>) --> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> </Remove> </HTTPModifier>
示例 1
以下示例从 request 对象中移除所有表单参数和查询参数:
<HTTPModifier name="HM-remove-2">
<Remove>
<!-- Empty (<FormParams/>) removes all form parameters -->
<FormParams/>
<QueryParams>
<QueryParam name="qp1"/>
</QueryParams>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>示例 2
以下示例将移除消息对象中的所有内容:
<HTTPModifier name="HM-remove-3"> <Remove/> <AssignTo>request</AssignTo> </HTTPModifier>
通常,只有在您要使用 <Set> 元素在消息中设置一些替换值时,才会这样做。
<FormParams>(<Remove> 的子元素)
从请求中删除指定的表单参数。此元素对响应没有任何影响。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | <FormParam> 元素的数组或空数组 |
| 父元素 |
<Remove>
|
| 子元素 |
<FormParam> |
<FormParams> 元素使用以下语法:
语法
<HTTPModifier continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <!-- Can also be empty to remove everything from the message (<Remove/>) --> <Remove> <!-- Can also be an empty array to remove all FormParams (<FormParams/>) --> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> </Remove> </HTTPModifier>
示例 1
以下示例从请求中移除三个表单参数:
<HTTPModifier name="HM-remove-formparams-1">
<Remove>
<FormParams>
<FormParam name="form_param_1"/>
<FormParam name="form_param_2"/>
<FormParam name="form_param_3"/>
</FormParams>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>示例 2
以下示例从请求中移除所有表单参数:
<HTTPModifier name="HM-remove-formparams-2">
<Remove>
<FormParams/>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>示例 3
如果有多个具有相同名称的表单参数,请使用以下语法:
<HTTPModifier name="HM-remove-formparams-3">
<Remove>
<FormParams>
<FormParam name="f1"/>
<FormParam name="f2"/>
<FormParam name="f3.2"/>
</FormParams>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>以下示例移除 f1 和 f2,以及 f3 的第二个值。如果 f3 只有一个值,则不移除。
仅在满足以下条件时才能使用 <FormParams>:
- 消息类型:请求
Content-Type:application/x-www-form-urlencoded
<Headers>(<Remove> 的子元素)
从由 <AssignTo> 元素指定的请求或响应中移除指定的 HTTP 标头。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | <Header> 元素的数组或空数组 |
| 父元素 |
<Remove>
|
| 子元素 |
<Header> |
<Headers> 元素使用以下语法:
语法
<HTTPModifier continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <!-- Can also be empty to remove everything from the message (<Remove/>) --> <Remove> <!-- Can also be an empty array to remove all Headers (<Headers/>) --> <Headers> <Header name="HEADER_NAME">HEADER_VALUE</Header> ... </Headers> </Remove> </HTTPModifier>
示例 1
以下示例从请求中移除 user-agent 标头:
<HTTPModifier name="HM-remove-one-header">
<Remove>
<Headers>
<Header name="user-agent"/>
</Headers>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>示例 2
以下示例从请求中移除所有标头:
<HTTPModifier name="HM-remove-all-headers">
<Remove>
<Headers/>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>示例 3
如果多个标头同名,请使用以下语法:
<HTTPModifier name="HM-remove-headers-3">
<Remove>
<Headers>
<Header name="h1"/>
<Header name="h2"/>
<Header name="h3.2"/>
</Headers>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>以下示例从请求中移除 h1 和 h2,以及 h3 的第二个值。如果 h3 只有一个值,则不移除。
<QueryParams>(<Remove> 的子元素)
从请求中删除指定的查询参数。此元素对响应没有任何影响。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | <QueryParam> 元素的数组或空数组 |
| 父元素 |
<Remove>
|
| 子元素 |
<QueryParam> |
<QueryParams> 元素使用以下语法:
语法
<HTTPModifier continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <!-- Can also be empty to remove everything from the message (<Remove/>) --> <Remove> <!-- Can also be an empty array to remove all QueryParams (<QueryParams/>) --> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> </Remove> </HTTPModifier>
示例 1
以下示例从请求中移除单个查询参数:
<HTTPModifier name="HM-remove-queryparams-1">
<Remove>
<QueryParams>
<QueryParam name="qp1"/>
</QueryParams>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>示例 2
以下示例从请求中移除所有查询参数:
<HTTPModifier name="HM-remove-queryparams-2">
&tl;Remove>
<QueryParams/>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>示例 3
如果有多个具有相同名称的查询参数,请使用以下语法:
<HTTPModifier name="HM-remove-queryparams-3">
<Remove>
<QueryParams>
<QueryParam name="qp1"/>
<QueryParam name="qp2"/>
<QueryParam name="qp3.2"/>
</QueryParams>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>以下示例从请求中移除 qp1 和 qp2,以及 qp3 的第二个值。如果 qp3 只有一个值,则不移除。
示例 4
以下示例从请求中移除 apikey 查询参数:
<HTTPModifier name="HM-remove-query-param">
<Remove>
<QueryParams>
<QueryParam name="apikey"/>
</QueryParams>
</Remove>
<AssignTo>request</AssignTo>
</HTTPModifier>仅在满足以下条件时才能使用 <QueryParams>:
- HTTP 动词:
GET、POST - 消息类型:请求
<Set>
设置由 <AssignTo> 元素指定的请求或响应消息中的信息。<Set> 会覆盖原始消息中已存在的标头、查询或表单参数,如果不存在,则会添加新标头、查询或表单参数。
HTTP 消息中的标头、查询和表单参数可以包含多个值。如需为标头或参数添加其他值,请改用 <Add> 元素。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | 复杂类型 |
| 父元素 |
<HTTPModifier>
|
| 子元素 |
<FormParams><Headers><Path><QueryParams><StatusCode><Verb><Version> |
<Set> 元素使用以下语法:
语法
<HTTPModifier continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> <Headers> <Header name="HEADER_NAME">HEADER_VALUE</Header> ... </Headers> <Path>PATH</Path> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> <StatusCode>HTTP_STATUS_CODE or {variable}</StatusCode> <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb> <Version>[1.0|1.1|{variable}]</Verb> </Set> </HTTPModifier>
示例
以下示例设置特定标头。将此政策附加在请求流中后,将允许上游系统接收原始入站请求中未包含的额外标头。
<HTTPModifier name="HM-Set-Header">
<Set>
<Headers>
<Header name="authenticated-developer">{verifyapikey.VAK-1.developer.id}</Header>
</Headers>
</Set>
<AssignTo>request</AssignTo>
</HTTPModifier><FormParams>(<Set> 的子元素)
覆盖请求中的现有表单参数,并将其替换为您使用此元素指定的新值。此元素对响应没有任何影响。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | <FormParam> 元素的数组 |
| 父元素 |
<Set>
|
| 子元素 |
<FormParam> |
<FormParams> 元素使用以下语法:
语法
<HTTPModifier
continueOnError="[false|true]"
enabled="[true|false]"
name="POLICY_NAME" >
<Set>
<FormParams>
<FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
...
</FormParams>
</Set>
</HTTPModifier>示例 1
以下示例将表单参数 myparam 设置为新的自定义请求中的 request.header.myparam 变量的值:
<HTTPModifier name="HM-set-formparams-1"> <Set> <FormParams> <FormParam name="myparam">{request.header.myparam}</FormParam> </FormParams> </Set> <AssignTo createNew="true" transport="http" type="request>>MyCustomRequest</AssignTo> </HTTPModifier>
仅在满足以下条件时才能使用 <FormParams>:
- HTTP 动词:
POST - 消息类型:请求
如果您在政策 (<Add><FormParams/></Add>) 中定义了空的表单参数,则该政策不会添加任何表单参数。这与省略 <FormParams> 相同。
在将消息发送到目标端点之前,<Set> 会先将消息的 Content-Type 更改为 application/x-www-form-urlencoded。
<Headers>(<Set> 的子元素)
覆盖由 <AssignTo> 元素指定的请求或响应)中的现有 HTTP 标头。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | <Header> 元素的数组 |
| 父元素 |
<Set>
|
| 子元素 |
<Header> |
<Headers> 元素使用以下语法:
语法
<HTTPModifier
continueOnError="[false|true]"
enabled="[true|false]"
name="POLICY_NAME" >
<Set>
<Headers>
<Header name="HEADER_NAME">HEADER_VALUE</Header>
...
</Headers>
</Set>
</HTTPModifier>示例 1
以下示例将 x-ratelimit-remaining 标头设置为 ratelimit.Quota-1.available.count 变量的值:
<HTTPModifier name="HM-Set-RateLimit-Header">
<Set>
<Headers>
<Header name="X-RateLimit-Remaining">{ratelimit.Quota-1.available.count}</Header>
</Headers>
</Set>
<AssignTo>response</AssignTo>
</HTTPModifier>如果您在政策 (<Set><Headers/></Set>) 中定义了空的标头,则该政策不会设置任何标头。这将与省略 <Headers> 的效果相同。
<Path>(<Set> 的子元素)
<QueryParams>(<Set> 的子元素)
使用新值覆盖请求中的现有查询参数。此元素对响应没有任何影响。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | <QueryParam> 元素的数组 |
| 父元素 |
<Set>
|
| 子元素 |
<QueryParam> |
<QueryParams> 元素使用以下语法:
语法
<HTTPModifier
continueOnError="[false|true]"
enabled="[true|false]"
name="POLICY_NAME" >
<Set>
<QueryParams>
<QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
...
</QueryParams>
</Set>
</HTTPModifier>示例 1
以下示例将 address 查询参数设置为 request.header.address 变量的值:
<HTTPModifier name="HM-set-queryparams-1"> <Set> <QueryParams> <QueryParam name="address">{request.header.address}</QueryParam> </QueryParams> </Set> </HTTPModifier>
仅在满足以下条件时才能使用 <QueryParams>:
- HTTP 动词:
GET、POST - 消息类型:请求
如果您在政策 (<Set><QueryParams/></Set>) 中定义了空的查询参数,则该政策不会设置任何查询参数。这与省略 <QueryParams> 相同。
<StatusCode>(<Set> 的子元素)
设置响应的状态代码。此元素对请求没有任何影响。
| 默认值 | '200'(当 <AssignTo> 的 createNew 属性设置为 “true” 时) |
| 是否必需? | 可选 |
| 类型 | 字符串或 VARIABLE |
| 父元素 |
<Set>
|
| 子元素 | 无 |
<StatusCode> 元素使用以下语法:
语法
<HTTPModifier continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <StatusCode>HTTP_STATUS_CODE or {variable}</StatusCode> </Set> </HTTPModifier>
示例 1
以下示例设置一个简单的状态代码:
<HTTPModifier name="HM-set-statuscode-404">
<Set>
<StatusCode>404<<StatusCode>
</Set>
<AssignTo>response</AssignTo>
</HTTPModifier>示例 2
<StatusCode> 的内容被视为消息模板。这意味着将在运行时使用所引用变量的值替换用大括号括起来的变量名称,如以下示例所示:
<HTTPModifier name="set-statuscode-2">
<Set>
<StatusCode>{calloutresponse.status.code}</StatusCode>
</Set>
<AssignTo>response</AssignTo>
</HTTPModifier>仅在满足以下条件时才能使用 <StatusCode>:
- 消息类型:响应
<Verb>(<Set> 的子元素)
设置请求的 HTTP 谓词。此元素对响应没有任何影响。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | 字符串或 VARIABLE |
| 父元素 |
<Set>
|
| 子元素 | 无 |
<Verb> 元素使用以下语法:
语法
<HTTPModifier continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb> </Set> </HTTPModifier>
示例 1
以下示例设置请求的一个简单谓词:
<HTTPModifier name="HM-set-verb-1">
<Set>
<Verb>POST</Verb>
</Set>
<AssignTo>request</AssignTo>
</HTTPModifier>示例 2
<Verb> 的内容被视为消息模板。这意味着将在运行时使用所引用变量的值替换用大括号括起来的变量名称。
以下示例使用变量来填充谓词:
<HTTPModifier name="HM-set-verb-to-dynamic-value"> <Set> <Verb>{my_variable}</Verb> </Set> <AssignTo>request</AssignTo> </HTTPModifier>
仅在满足以下条件时才能使用 <Verb>:
- 消息类型:请求
<Version>(<Set> 的子元素)
设置请求的 HTTP 版本。此元素对响应没有任何影响。
| 默认值 | 不适用 |
| 是否必需? | 可选 |
| 类型 | 字符串或 VARIABLE |
| 父元素 |
<Set>
|
| 子元素 | 无 |
<Version> 元素使用以下语法:
语法
<HTTPModifier continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <Version>[1.0|1.1|{variable}]</Verb> </Set> </HTTPModifier>
示例 1
以下示例将版本号设置为 1.1:
<HTTPModifier name="HM-set-version-1">
<Set>
<Version>1.1</Version>
</Set>
</HTTPModifier>示例 2
以下变量使用用大括号括住的变量设置版本号:
<HTTPModifier name="HM-set-version-2">
<Set>
<Version>{my_version}</Version>
</Set>
<AssignTo>request</AssignTo>
</HTTPModifier><Version> 的内容被视为消息模板。这意味着将在运行时使用所引用变量的值替换用大括号括起来的变量名称。
仅在满足以下条件时才能使用 <Version>:
- 消息类型:请求
创建自定义请求消息
您可以使用 HTTPModifier 来创建自定义请求消息。创建自定义请求后,您可以通过以下方式使用它:
- 在其他政策中访问它的变量
- 将它传递到外部服务
如需创建自定义请求消息,请在 HTTPModifier 政策中使用 <AssignTo> 元素。将 createNew 设置为 true 并在元素正文中指定新消息的名称,如以下示例所示:
<HTTPModifier name="assignto-3"> <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo> ... </HTTPModifier>
默认情况下,Apigee 不会对自定义请求消息执行任何操作。创建之后,Apigee 将以原始请求继续执行流。如需使用自定义请求,请添加政策以使用请求消息,并在该政策的配置中明确引用新创建的请求消息。这样,您就可以将自定义请求传递给外部服务端点。
以下示例创建自定义请求消息:
示例 1
以下示例使用 HTTPModifier 创建自定义请求对象:
<HTTPModifier name="HTTPModifier-3"> <AssignTo createNew="true" type="request">MyCustomRequest</AssignTo> <Set> <QueryParams> <QueryParam name="address">{request.queryparam.addy}</QueryParam> </QueryParams> <Verb>GET</Verb> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </HTTPModifier>
以下示例:
- 创建名为
MyCustomRequest的新请求消息对象。 - 在 MyCustomRequest 中,此政策:
- 将自定义消息的
address查询参数设置为传入请求的addy查询参数的值。 - 将 HTTP 谓词设置为
GET。
- 将自定义消息的
- 将
<IgnoreUnresolvedVariables>设置为false。当<IgnoreUnresolvedVariables>为false时,如果政策配置中引用的其中一个变量不存在,则 Apigee 将在 API 流中输入故障状态。
示例 2
以下另一个示例演示了如何使用 HTTPModifier 创建自定义请求对象:
<HTTPModifier name="HTTPModifier-2"> <AssignTo createNew="true" type="request">partner.request</AssignTo> <Set> <Verb>POST</Verb> </Set> </HTTPModifier>
本示例会创建一个名为 partner.request 的新自定义请求。然后,该示例会对新请求设置 <Verb>。
您可以在流中后面部分出现的另一个 HTTPModifier 政策中访问自定义消息的各种属性。以下示例从已命名的自定义响应中获取标头的值,并将其置于请求消息的新标头中:
<HTTPModifier name="HM-Set-Header">
<AssignTo>request</AssignTo>
<Set>
<Headers>
<Header name="injected-approval-id">{MyCalloutResponse.header.approval-id}</Header>
</Headers>
</Set>
</HTTPModifier>错误代码
本部分介绍当此政策触发错误时返回的故障代码和错误消息,以及由 Apigee 设置的故障变量。在开发故障规则以处理故障时,请务必了解此信息。如需了解详情,请参阅您需要了解的有关政策错误的信息和处理故障。
运行时错误
政策执行时可能会发生这些错误。
| 故障代码 | HTTP 状态 | 原因 | 修复 |
|---|---|---|---|
entities.UnresolvedVariable |
500 |
消息模板变量在未定义范围内或超出范围。 | |
steps.httpmodifier.InvalidStatusCode |
500 |
状态代码的解析值无效。请参阅故障字符串以了解详情。 | build |
部署错误
在您部署包含此政策的代理时,可能会发生这些错误。
| 错误名称 | 原因 | 修复 |
|---|---|---|
InvalidIndex |
如果 HTTPModifier 政策的 <Remove> 元素中指定的索引为 0 或负数,则 API 代理的部署会失败。 |
build |
故障变量
当此政策在运行时触发错误时,将设置这些变量。如需了解详情,请参阅您需要了解的有关政策错误的信息。
| 变量 | 地点 | 示例 |
|---|---|---|
httpmodifier.POLICY_NAME.failed |
POLICY_NAME 是抛出故障的政策的用户指定名称。 | httpmodifier.HM-SetResponse.failed = true |
错误响应示例
{
"fault":{
"detail":{
"errorcode":"steps.httpmodifier.InvalidStatusCode"
},
"faultstring":"HTTPModifier[HM-SetResponse]: Invalid status code bad_request"
}
}故障规则示例
<FaultRule name="HTTPModifier Faults">
<Step>
<Name>HM-CustomNonMessageTypeErrorResponse</Name>
<Condition>(fault.name Matches "InvalidStatusCode")</Condition>
</Step>
<Condition>(httpmodifier.failed = true)</Condition>
</FaultRule>架构
每种政策类型均由 XML 架构 (.xsd) 定义。GitHub 提供了政策架构作为参考。