请求上下文 #
什么是上下文 #
上下文是极限网关用来访问当前运行环境下相关信息的入口,如请求的来源和配置信息等等,使用关键字 _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_length | int | 响应体长度 |