# 修改器

Lyrebird支持对请求进行修改的检查器,也称为修改器请求修改器,支持的修改请求时机如下:

  • 客户端发起请求后,mock和代理动作前。使用@on_request

  • 获得响应数据后,返回给客户端前。使用@on_response

# 环境准备

请求修改器的环境准备与检查器-环境准备相同。

# 编写

下面的例子中,将实现包含如下功能的修改器:

  • 在请求request的url中,加入一个参数

  • 在响应response的headers中,增加一个header

# 注册

将修改请求的方法注册至Lyrebird。

from lyrebird import on_request

# 使用装饰器on_request,当新的请求进入Lyrebird时,会调用add_request_param方法
@on_request()
def add_request_param(flow):
    pass

当请求被Lyrebird代理时,会自动调用修改请求的方法,传入的内容结构如下。

{
    "size": 4652,
    "duration": 0.28295302391052246,
    "start_time": 1615293597.4765,
    "request": {
        "headers": {
            // ...
        },
        "method": "GET",
        "timestamp": 1615293597.477,
        "url": "https://www.meituan.com",
    },
    "response": {
        "code": 200,
        "headers": {
            // ...
        },
        "data": ...
    }
}

注册回调时,支持指定过滤器rules,用于申明需要修改的请求具备的特征,能够更精准的进行请求修改。rules采用字典类型,其中:

  • key为JSONPath,用于描述目标字符的位置

  • value为正则表达式,用于匹配目标字符

from lyrebird import on_request

# 此处使用rules申明目标请求的特征为:请求的request.url中包含poi/detail
@on_request(rules={
    "request.url": "(?=.*poi/detail)"
})
def add_request_param(flow):
    pass

rules非必须指定的内容,当不传入rules时,默认修改全部请求。

# 修改请求

根据实际的需求进行请求修改。

from lyrebird import on_request

@on_request(rules={
    "request.url": "(?=.*poi/detail)"
})
def add_request_param(flow):
    # 直接修改flow中的内容
    if '?' in flow['request']['url']:
        flow['request']['url'] += '&param=1'
    else:
        flow['request']['url'] += '?param=1'
    # 请求修改完成后,无需返回任何内容

此时,我们已经使用@on_request实现了在请求request的url中加入参数。

接下来使用@on_response在响应response的headers中加入标示,@on_response的使用方法与@on_request相同,实现后的修改器如下。

from lyrebird import on_request
# 引入on_response
from lyrebird import on_response

@on_request(rules={
    "request.url": "(?=.*poi/detail)"
})
def add_request_param(flow):
    if '?' in flow['request']['url']:
        flow['request']['url'] += '&param=1'
    else:
        flow['request']['url'] += '?param=1'

@on_response(rules={
    "request.url": "(?=.*poi/detail)"
})
def add_tag_in_response_headers(flow):
    # 在response headers中增加Mock-Tag
    flow['response']['headers']['Mock-Tag'] = 'Lyrebird'

# 调试

请求修改器的调试与检查器-调试相同。


至此,我们共同完成了一个修改器的编写,期待和你一起共探索更多Lyrebird的功能!