• 操作值
    • 内联多行操作值
    • 模板字符串

    操作值

    whistle的操作值可以分两类,字符串和JSON对象。

    1. 如果字符串不包含空格,可以直接写到配置里面:

      1. pattern opProtocol://(strValue)
      2. # 有些操作值不能放到本地文件,则可以不用括号,如:proxy、referer等等,具体参见协议列表
      3. pattern opProtocol://strValue
    2. 如果字符串里面包含空格,则可以把操作值先放到whistle界面的Values或本地文件:

      1. # 在Values里面创建一个key为 test.txt 的 key-value 对
      2. pattern opProtocol://{test.txt}
      3. # 或者放到本地文件 /User/docs/test.txt
      4. pattern opProtocol:///User/docs/test.txt
      5. # windows
      6. pattern opProtocol://E:\docs\test.txt

      注意:不是所有操作值都可以从本地文件加载,具体使用时参考:协议列表

    3. 如果操作值为JSON对象,则可以用以下几种格式:

      正常的JSON格式:

      1. {
      2. "key1": value1,
      3. "key2": value2,
      4. "keyN": valueN
      5. }

      行格式:

      1. # 以 `冒号+空格` 分隔
      2. key1: value1
      3. key2: value2
      4. keyN: valueN
      5. # 如果没有 `冒号+空格` ,则以第一个冒号分隔,如果没有冒号,则value为空字符串
      6. key1: value1
      7. key2:value2
      8. key3
      9. keyN: valueN

      内联格式(请求参数格式):

      1. # key和value最好都encodeURIComponent
      2. key1=value1&key2=value2&keyN=valueN

    注意:最后一种内联格式可以把JSON对象直接转化为字符串,这样可以用第一种方式直接写到配置里面,如果key或value里面出现 空格&%=,则需要把它们 encodeURIComponent,whistle会对每个key和value尝试 decodeURIComponent

    内联多行操作值

    在v1.12.12之前的版本,操作值有三种存储方式:

    1. 内联到规则里面(pattern protocol://(value)),value 不能有空格
    2. 直接存放到 Values(pattern protocol://{key})
    3. 存放到本地文件或目录(pattern protocol:///User/xxx)

    whistle v1.12.12开始支持在Rules内联多行的Value,如:

    1. www.test.com/index.html file://{test.html}
    2. ``` test.html
    3. Hello world.
    4. Hello world1.
    5. Hello world2.
    6. ```
    7. www.test.com/index2.html reqScript://{test.rules}
    8. ```` test.rules
    9. * file://{test.html} # 表示下面的test.html,无法获取上面的test.html
    10. ``` test.html
    11. reqScrip,
    12. reqScript,
    13. ```
    14. ````

    这种内联值位置可以在Rules里面任意放置,格式如下:

    1. ``` keyName
    2. content
    3. ```

    这样可以在Rules里面的任意位置引用该内容:

    1. pattern protocol://{keyName}

    这种方式设置的Value只对当前阶段的规则生效,且优先级高于Values设置的Key-Value,所以如果是插件里面的规则最好能加个前缀如:

    1. ```whistle.helloworld/test.html
    2. Hello world.
    3. Hello world1.
    4. Hello world2.
    5. ```
    6. www.test.com/index.html file://{whistle.helloworld/test.html}

    模板字符串

    v1.12.9 版本开始,whistle支持类似es6的模板字符串,通过模板字符串可以读取请求的一些信息并设置到规则中:

    1. pattern1 protocol://`xxx${reqCookie.cookieName}yyy`
    2. www.test.com/api http://`${clientIp}:8080`
    3. pattern3 protocol://`{test.json}`

    test.json:

    1. {
    2. "url": "${url}",
    3. "port": "${port}",
    4. "version": "${version}",
    5. "search": "${url.search}",
    6. "query": "${url.query}",
    7. "queryValue": "${url.query.name}",
    8. "host": "${url.host}",
    9. "hostname": "${url.hostname}",
    10. "path": "${url.path}",
    11. "pathname": "${url.pathname}",
    12. "reqId": "${reqId}",
    13. "now": ${now},
    14. "method": "${method}",
    15. "xff": "${reqHeaders.x-test}",
    16. "other": "${reqHeaders.other}",
    17. "cookie": "${reqCookie}",
    18. "cookieValue": "${reqCookie.cookieName}",
    19. "clientIp": "${clientIp}"
    20. }

    这里 test.json 在规则中一定要用模板字符串引入:

    1. protocol://`{test.json}`

    如下配置:

    1. www.test.com/api http://`${clientIp}:8080`

    10.12.2.1 的请求 https://www.test.com/api/test 会转成 http://10.12.2.1:8080/test

    如果想获取响应阶段的状态码、服务端IP、响应头、响应cookie,可以通过以下两种方式设置规则:

    1. resScript
    2. 插件的resRulesServer

      通过这两种方式设置的响应规则,除了可以设置上述请求信息,还可以设置如下响应信息:

      1. pattern3 protocol://`{test2.json}`

      test2.json:

      1. {
      2. "url": "${url}",
      3. "search": "${url.search}",
      4. "query": "${url.query}",
      5. "queryValue": "${url.query.name}",
      6. "host": "${url.host}",
      7. "hostname": "${url.hostname}",
      8. "path": "${url.path}",
      9. "pathname": "${url.pathname}",
      10. "reqId": "${reqId}",
      11. "now": ${now},
      12. "method": "${method}",
      13. "xff": "${reqHeaders.x-forwarded-for}",
      14. "other": "${reqHeaders.other}",
      15. "cookie": "${reqCookie}",
      16. "cookieValue": "${reqCookie.cookieName}",
      17. "clientIp": "${clientIp}",
      18. "statusCode": "${statusCode}",
      19. "serverIp": "${serverIp}",
      20. "resHeaderValue": "${resHeaders.x-res-header-name}",
      21. "resCookieValue": "${resCookie.res_cookie_name}"
      22. }

    ${xxx} 里面如果对应的值不存在则返回空字符串;如果涉及到 query、cookie 会自动 decode,如果你不想自动对 keyvaluedecode,可以加多一个 $${xxx}

    v1.12.13 版本开始支持 replace(pattern,replacement)功能,如:

    1. protocol://`${search.replace(/course=([^&]+)/ig,name=$1)}`
    2. protocol://`${search.replace(a,b)}`