
# 添加PerfTest请求信息（响应提取）
如果同一用例中存在多个报文，通过正则表达式或JSON提取把前一个报文的输出提取出来，作后一个报文的输入。
例如，在电商抢购场景中，您搜索对应的商品之后购买该产品，可使用响应提取功能，提取"搜索"报文得到的商品ID作为下一个"购买"报文的输入参数。
#### 约束与限制
- 响应提取不支持跨用例提取，即从用例A的报文的响应中提取值作为用例B报文的输入。
- 响应提取的变量为局部变量。
- 响应变量提取出数组后只能整体作为下个报文数组变量的输入，不能分开利用数组的每个字段。
 
#### 操作视频
本视频介绍响应提取，演示响应提取操作。
因不同版本操作界面可能存在差异，相关视频供参考，具体以实际环境为准。
<video controls="controls" preload="none" id="object547662645913" class="idp-external-video" src="https://res-video.hc-cdn.com/cloudbu-site/china/zh-cn/support/cpts-video/1689737211469806259.mp4" title="响应提取" poster="https://support.huaweicloud.com/usermanualnew-cpts/zh-cn_image_0000002349160289.jpg" height="335.0000" width="600.0000"></video>
#### 添加响应提取
1. [登录性能测试服务控制台](https://console.huaweicloud.com/cpts/#/home)。
2. 在左侧导航栏中选择"PerfTest测试工程"。
3. 在待编辑PerfTest测试工程所在行，单击工程名称进入测试工程详情页面。
4. 在"测试用例"页签左侧"用例列表"下，选择待添加请求信息的用例。
5. 在"用例步骤"页签中，单击"添加请求"。
6. 在"响应提取"页签，参照[表1]设置基本信息。
   
    表1响应提取参数 
   | 参数     | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                          |
   |:---|:---|
   | 启用响应提取 | 启用响应提取后，如果同一用例中存在多个报文，通过正则表达式或JSON提取把前一个报文的输出提取出来，作后一个报文的输入。                                                                                                                                                                                                                                                                                                                                                                  |
   | 变量名称   | 变量的名称，命名必须唯一，响应提取的值赋予此变量。                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 预期值    | 预期响应提取出的变量值。 开启后，会将响应提取到的值与预期值进行比对，如果不等则链接失败。                                                                                                                                                                                                                                                                                                                                                  |
   | 提取内容范围 | 响应提取内容的范围。 其中，"报文内容"、"头域"和"URL"可通过正则表达式进行内容提取。                                                                                                                                                                                                                                                                                                                                                 |
   | 正则表达式  | 正则表达式是对字符串操作的一种逻辑公式，就是用事先定义好的一些特定字符、及这些特定字符的组合，组成一个"规则字符串"，这个"规则字符串"用来表达对字符串的一种过滤逻辑。 "()"表示提取，对于您要提取的内容需要用小括号括起来，每个"()"之间的内容表示一个子表达式。 完整的正则表达式由两种字符构成：特殊字符（special characters）称为"元字符"（meta characters）；其他为"文字"（literal），或者是普通文本字符（normal text characters，如字母、数字、汉字、下划线）。元字符的说明请参见[正则表达式元字符](https://support.huaweicloud.com/usermanualnew-cpts/cpts_02_0036.html)。 |
   | 第几个匹配项 | 在正则表达式已提取的内容中，获取第几个匹配的内容，该参数值不可设置为0。 取值范围：正整数。                                                                                                                                                                                                                                                                                                                                                |
   | 表达式取值  | 表示解析到的第几个子表达式的值，取值范围为自然数。 - 取值为0：匹配整个正则表达式。  - 取值为1：匹配正则表达式的第一个子表达式，即第一个"()"提取的内容。   通过"正则表达式"和"第几个匹配项"提取出内容后，再通过"表达式取值"获得最终的提取内容。                                                                                                   |
   | 需获取的键名 | 输入需要获取的键名，仅在提取内容范围是json内的值时生效。 例：{"key":{"key1":"v1","key2":{"key3":"v3"},"key4":\[{"key41":"v41","key42":"v42"},{"key41":"v43","key42":"v44"}\]}}，如果想取出"v42"，则输入：key.key4\[0\].key42。                                                                                                                                                                                                         |
   | 缺省值    | 正则匹配或JSON提取失败时，取的值。                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 条件表达式  | 与"需获取的键名"配套使用。 例如：{"key":{"key1":"v1","key2":{"key3":"v3"},"key4":\[{"key41":"v41","key42":"v42"},{"key41":"v43","key42":"v44"}\]}}，如果需要表达：当key42=v42时，提取目标值v41；则在"条件表达式"框里输入：key.key4\[\].key42=v42，在"需获取的键名"框里输入：key.key4\[\].key41。                                                                                                                                                         |
      
   表2常用正则表达式介绍 
   | 正则表达式                                                | 说明                       | 示例                                                                                |
   |:---|:---|:---|
   | (\\d+)                                               | 匹配非负整数                   | 字符串： ``` bTivm2wu9jih1LBKR4osZGrjjl ```              |
   | (\\d+)                                               | 匹配非负整数                   | 匹配结果： ``` 2 9 1 4 ```                                |
   | (\[A-Za-z\]+)                                        | 匹配由26个英文字母组成的字符串         | 字符串： ``` bTivm2wu9jih1LBKR4osZGrjjl ```            |
   | (\[A-Za-z\]+)                                        | 匹配由26个英文字母组成的字符串         | 匹配结果： ``` bTivm wu jih LBKR osZGrjjl ```          |
   | (\[A-Za-z0-9\]+)                                     | 匹配由数字和26个英文字母组成的字符串      | 字符串： ``` bTivm2wu9jih1LBKR4osZGrjjl:asdasd22 ```   |
   | (\[A-Za-z0-9\]+)                                     | 匹配由数字和26个英文字母组成的字符串      | 匹配结果： ``` bTivm2wu9jih1LBKR4osZGrjjl asdasd22 ```  |
   | (\\w+)                                               | 匹配由数字、26个英文字母或者下划线组成的字符串 | 字符串： ``` bTivm2wu9jih1LBKR4osZGrjjl:asdasd22 ```     |
   | (\\w+)                                               | 匹配由数字、26个英文字母或者下划线组成的字符串 | 匹配结果： ``` bTivm2wu9jih1LBKR4osZGrjjl asdasd22 ```    |
   | (\[\\w-\]+(\\.\[\\w-\]+)\*@\[\\w-\]+(\\.\[\\w-\]+)+) | 匹配email地址                | 字符串： ``` bTivm2wu9jih1LBKR4osZGrjjl:abc@abc.com ``` |
   | (\[\\w-\]+(\\.\[\\w-\]+)\*@\[\\w-\]+(\\.\[\\w-\]+)+) | 匹配email地址                | 匹配结果： ``` abc@abc.com ```                            |
      
   
   
7. （可选）一个请求信息可包含1个或多个变量，如果您的请求信息需要添加多个变量，请单击"添加变量"，再设置变量的相关参数。
8. 配置完成后，单击"保存"。
 
#### 正则表达式响应提取示例
**示例一**
例如，前一个报文响应的报文内容如下所示：
```
"baseInfo" : {
"mobilephone":"xxxxxxxxxxx",
"Telephone":"xxxxxxxxxxx",
"unitGuid":"xx",
"unitName":null,
"address":"xxx",
"gender" : 0,
"imageUrl" :null
},
"UserNotices":null
},
"msgId" : "64xxxxxxxxxxxxxxxxxxxxxxxf5",
"isUsed" :"1"
"token":"eyxxxxxxxxxxxJ9.eyJzdW1101JYZMiLCJcUbdGUkIJezMT!!zz#z!20TxxxxxxxxxxxxxxxxxS1611dYQISHTFKifVOsImd1aWQi0ilOODkiLCJleHAiOjEiMzIizNzY1MjZ9.myU5idiASM-11@EP7YQTfTsR_8zsq7?sbYJYoxfRsuf6OZhGL-XWmjnvdaviGauhSdw16ImWOFEvbACSHMXGT1U0ijS5z6ezX@sZePruzFnvcIMgShF8xNPN6zVokQp-uwbyS3W6NpZpDuwsjuiZ7DZTNpKoqCkGHwvPJrHBOrWFR_u6-FBbTiFiqdhQb95U-1gLiLvoZHY_rguzwyrZ-leGRdCG_ZASreoWC-uH)HnqltpgItrChWQToHQyxOABdMSbBSHhNctBBZHgQPMESqQQQTbBiPGvbQDprB7ZBFMUB_ShynS_evtyfEladGEddhOBn-fxxxxxxxxxxx"
},
```
如果想要获取token值的，可通过正则表达式**"token"\\s\*:\\s\*"(.\*?)"**提取，响应提取的设置如下图所示。
![](https://support.huaweicloud.com/usermanualnew-cpts/zh-cn_image_0000002318303220.png "点击放大")
**示例二**
例如，前一个报文响应的报文内容为：
```
javawind:9javawind:12 
javawind:16javawind:17 
javawind:46javawind:22
```
如果想要提取数值16，响应提取的设置如下图所示。
![](https://support.huaweicloud.com/usermanualnew-cpts/zh-cn_image_0000002352342005.png "点击放大")
1. 通过正则表达式**javawind:(.\*)javawind:(.\*)** ，提取数据如下：
   ```
   9 12
   16 17
   46 22
   ```
   
2. 通过第2个匹配项，提取数据如下：
   ```
   16 17
   ```
   
3. 通过第1个表达式，提取数据如下：
   ```
   16
   ```
   
**示例三**
例如，报文内容为：ababdacac。
如果响应提取设置如下图所示：
![](https://support.huaweicloud.com/usermanualnew-cpts/zh-cn_image_0000002318463008.png "点击放大")
正则表达式**(ab\|ac)+**，表示由多个ab或者ac匹配。
第几个匹配项：1，表示由ab匹配到的，也可以输入2，表示由ac匹配到的。使用1可以得到abab及子串ab，使用2可以得到acac及子串ac。
表达式取值：0，表示使用最大匹配串abab或者acac，1表示使用子串ab或者ac。
**示例四**
例如，被提取内容为：HTTP响应头的Content-Type。
![](https://support.huaweicloud.com/usermanualnew-cpts/zh-cn_image_0000002352342029.png "点击放大")
正则表达式**Content-Type: (.\*)\\r\\n**，注意冒号后面有一个空格，结尾有\\r\\n，是HTTP规范产生的。
第几个匹配项：1，因为只有一个(.\*)。
表达式取值：1，取到希望得到的值。
#### JSON表达式响应提取示例
样例数据如下：
```
{
    "name": {
             "first": "Tom",
             "last": "Anderson"
    },
    "age": 37,
    "children": ["Sara","Alex","Jack"],
    "fav.movie": "Deer Hunter",
    "friends": [{
             "first": "Dale",
             "last": "Murphy",
             "age": 44,
             "nets": ["ig","fb","tw"]
    },
    {
             "first": "Roger",
             "last": "Craig",
             "age": 68,
             "nets": ["fb","tw"]
    },
    {
             "first": "Jane",
             "last": "Murphy",
             "age": 47,
             "nets": ["ig","tw"]
    }]
}
```
**示例一**
如果想要提取"英文的first name"，需获取的键名为**name.first**，响应提取的设置如下图所示。
![](https://support.huaweicloud.com/usermanualnew-cpts/zh-cn_image_0000002352341997.png "点击放大")
**示例二**
如果想要提取"Tom的孩子数量"，需获取的键名为**children.#**，响应提取的设置如下图所示。
![](https://support.huaweicloud.com/usermanualnew-cpts/zh-cn_image_0000002318463076.png "点击放大")
**示例三**
如果想要提取"Tom的第二个孩子的名字"，需获取的键名为**children.1**，注意序号从0开始，响应提取的设置如下图所示。
![](https://support.huaweicloud.com/usermanualnew-cpts/zh-cn_image_0000002352421817.png "点击放大")
**示例四**
如果想要提取"Tom的年龄大于45岁的朋友的last name"，需获取的键名为**friends.#(age\>45)#.last**，响应提取的设置如下图所示。
![](https://support.huaweicloud.com/usermanualnew-cpts/zh-cn_image_0000002318463084.png "点击放大")
**示例五**
如果想要提取"Tom的last name为Murphy的朋友的first name"，需获取的键名为**friends.#(last=="Murphy")#.first**，响应提取的设置如下图所示。
![](https://support.huaweicloud.com/usermanualnew-cpts/zh-cn_image_0000002352342009.png "点击放大")
**示例六**
如果想要提取"Tom的第一个朋友的第二个网名"，需获取的键名为**friends.0.nets.1**，注意序号从0开始，响应提取的设置如下图所示。
![](https://support.huaweicloud.com/usermanualnew-cpts/zh-cn_image_0000002352342049.png "点击放大")
**示例七**
如果想要提取"Tom的朋友中网名为fb的朋友的first name"，需获取的键名为**friends.#(nets.#(=="fb"))#.first**，响应提取的设置如下图所示。
![](https://support.huaweicloud.com/usermanualnew-cpts/zh-cn_image_0000002352421841.png "点击放大")
