请求上下文 #
什么是上下文 #
上下文是极限网关用来访问当前运行环境下相关信息的入口,如请求的来源和配置信息等等,使用关键字 _ctx 即可访问相应的字段,如:_ctx.request.uri 表示请求的 URL 地址。
内置请求上下文 #
HTTP 请求内置的 _ctx 上下文对象主要包括如下:
| 名称 | 类型 | 说明 |
|---|---|---|
| id | uint64 | 请求的唯一 ID |
| tls | bool | 表示请求是否 TLS |
| remote_ip | string | 客户端来源 IP |
| remote_addr | string | 客户端来源地址,包含端口 |
| local_ip | string | 网关本地 IP |
| local_addr | string | 网关本地地址,包含端口 |
| elapsed | int64 | 请求已执行时间(毫秒) |
| request.* | object | 描述请求信息 |
| response.* | object | 描述响应信息 |
request #
request 对象包含以下属性:
| 名称 | 类型 | 说明 |
|---|---|---|
| to_string | string | 文本格式的 HTTP 完整请求信息 |
| host | string | 访问的目标主机名/域名 |
| method | string | 请求类型 |
| uri | string | 请求完整地址 |
| path | string | 请求路径 |
| query_args | map | Url 请求参数 |
| username | string | 发起请求的用户名 |
| password | string | 发起请求的密码信息 |
| header | map | Header 参数 |
| body | string | 请求体 |
| body_json | object | JSON 请求体对象 |
| body_length | int | 请求体长度 |
如果客户端提交的请求体数据类型是 JSON 格式,可以通过 body_json 来直接访问,举例如下:
curl -u tesla:password -XGET "http://localhost:8000/medcl/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query":{
"bool":{
"must":[{"match":{"name":"A"}},{"match":{"age":18}}]
}
},
"size":900,
"aggs": {
"total_num": {
"terms": {
"field": "name1",
"size": 1000000
}
}
}
}'
在 JSON 里面通过 . 来标识路径,如果是数组则使用 [下标] 来访问指定的元素,比如可以使用一个 dump 过滤器来进行调试,如下:
- name: cache_first
filter:
- dump:
context:
- _ctx.request.body_json.size
- _ctx.request.body_json.aggs.total_num.terms.field
- _ctx.request.body_json.query.bool.must.[1].match.age
输出结果如下:
_ctx.request.body_json.size : 900
_ctx.request.body_json.aggs.total_num.terms.field : name1
_ctx.request.body_json.query.bool.must.[1].match.age : 18
response #
response 对象包含以下属性:
| 名称 | 类型 | 说明 |
|---|---|---|
| to_string | string | 文本格式的 HTTP 完整响应信息 |
| status | int | 请求状态码 |
| header | map | Header 参数 |
| content_type | string | 响应请求体类型 |
| body | string | 响应体 |
| body_json | object | JSON 请求体对象 |
| body_length | int | 响应体长度 |
系统上下文 #
系统上下文对象 _sys.* 有如下属性:
| 名称 | 类型 | 说明 |
|---|---|---|
| hostname | string | 网关所在服务器主机名 |
| month_of_now | int | 当前时间的月份,范围 [1,12] |
| weekday_of_now | int | 当前时间的周几,范围 [0,6], 0 is Sunday |
| day_of_now | int | 当前时间的自然天值 |
| hour_of_now | int | 当前时间的小时值,范围 [0,23] |
| minute_of_now | int | 当前时间的分钟值,范围 [0,59] |
| second_of_now | int | 当前时间的秒值,范围 [0,59] |
| unix_timestamp_of_now | int | 当前时间的 Unix 时间戳 |
| unix_timestamp_milli_of_now | int64 | 当前时间的 Unix 时间戳,毫秒精度 |
其它 #
_util.* 主要用于获取一些特殊的变量:
| 名称 | 类型 | 说明 |
|---|---|---|
| generate_uuid | string | 生成一个随机 UUID |
| increment_id | string | 生成一个自增 ID,默认桶名 default, 支持自定义, e.g., _util.increment_id.mybucket |