ADC

使用 API 规范的高级策略表达式

您可以将统一的 API 规范导入到 Web App Firewall 导入页面,然后使用 API 规范创建高级策略表达式。您可以根据表达式为传入的 API 流量配置相应的操作。 API 规范包含端点、架构和参数。传入的 API 流量可以是 gRPC 或 REST 类型。

您可以使用 http.req.api 表达式来识别 API 规范中定义的传入请求中的端点。

语法:

http.req.api (“API_Spec_Name”)

示例:

set responder policy reject -rule !"http.req.api(\"myspec\").endpoint(\"POST"\",\"/v1/pet/\")

如果流量与 API 规范中指定的端点不匹配,则系统会拒绝所有流量。

API 架构的高级策略表达式

您可以使用以下操作为 API 创建高级策略表达式:

必备条件。

使用 Web App Firewall 中的导入选项导入 API 规范文件。

有关更多信息,请参阅 导入

通过 HTTP 方法匹配流量的表达式

使用 HTTP 字符串方法来限制匹配的 API。此字符串可以包含一个或多个 HTTP 方法,以”分隔|“或者可以包含通配符 (*)。当指定多个方法时,表达式的计算结果为方法间的 OR 条件。 例如,GET|PUT|DELETE 将传入的请求与 HTTP 方法 GET 或 PUT 或 DELETE 进行匹配。

示例:

  • 单个 HTTP 方法

    http.req.api("petstore").method("POST").text("id").eq("1")

  • 多种方法 http.req.api("petstore").method("GET|DELETE").exists

按 URL 匹配流量的表达式

PATH(URL 字符串)用于匹配包含通配符的端点。单星号 (*) 匹配单个分段,而双星号 (**) 匹配双星号前缀的所有可能分段。

示例:

  • http.api("petstore").path("/v1/pets/*/find") 它仅将传入流量与 /v1/pets/*/find 匹配
  • http.api("petstore").path("/v1/pets/**") 它匹配所有端点,开头为 /v1/pets

按 API 名称匹配流量的表达式

使用 APINAME(名称字符串)表达式按 API 名称限制匹配流量。您也可以通过运行 show 命令来使用 API 名称字符串,如以下示例所示:

    show api spec gspec
       Name: gspec
       File: gfile
       Type: OAS
<!--NeedCopy-->
  • 如果文件类型为 OAS,则 operation ID 用作端点名称。

    示例:针对来自以下 OAS 的端点验证传入流量:

    operationId: adexchangebuyer.accounts.list

    使用以下策略表达式: http.req.api("schema").apiname("adexchangebuyer.accounts.list").exists

  • 如果文件类型为 proto,则 service namerpc name 用作端点名称。

    在以下示例中,EchoService.Echo 是端点: service EchoService { rpc Echo(EchoReq) returns (EchoResp) { option (google.api.http) = { get: “/v1/{name=messages/*}” }; } }

访问 API 规范中的值

您可以按名称、路径、查询参数、JSON 正文或 gRPC 正文访问 API 规范中的字段。要定义参数的类型,请使用 PI 表达式。支持以下类型:

  • num-一个整数值。
  • ulong-一个长整数值。
  • bool-一个布尔值。
  • double - 双精度值。
  • text - 任意长度的字符串。

示例: 要使用与值 1 匹配的数字参数验证传入流量,请使用以下表达式:

http. req.api("petstore.proto"). APIName ("TestPet").NUM("test_num1").eq(1)

访问重复字段中的值

要访问 API 中的重复对象,请使用第二个参数作为重复索引。 访问数组 外部会产生未定义的值。

示例:

要检索“FindPets”端点中的第五个标签,请使用: http.req.api("petstore.proto", "FindPets').TEXT( "tags", 5 ).contains("mytag")

要检索重复标签字符串中的第五个标签,请使用: /v1/pets?tags=1&tags=2&tags=3&tags=4&tags=mytag&tags=6

访问嵌套对象中的值

对象可以嵌套在其他对象中。同一文档中的嵌套对象中可能会出现相同的字段名。但是,完整访问权限名称仍必须是唯一的。 要访问嵌套字段,请将字段名称与“.”(点)连接起来作为分隔符。

示例:使用 kennel.location.state 从以下 JSON 中检索加利福尼亚州。

{ “kennel” : { “location” : { “state” : “California” } } }

表达式

http. req.api("petstore.proto", "TestPet").text( "kennel.location.state" ).contains("California")

使用对象表达式访问值

Object () 表达式用于访问重复对象的子字段。如果有两个或更多使用不同值配置的对象,则可以创建表达式来验证特定于一个值的对象。 例如,在下面的 JSON 正文中,对象“foo”有两个值,分别为一和无。 { “foo” : [ { “bar” : “one” }, { “bar” : “none” } ] }

要将该值与零值进行比较,可以按如下方式配置表达式:

HTTP. req.api("schema").object("foo",1).text("bar").eq("none")

使用 API 规范的高级策略表达式