Loadrunner发送json串请求

本文讲述了在LoadRunner中发送包含JSON串的POST请求时遇到的问题及解决方案。首先,介绍了web_custom_request的使用方式,但在执行时出现500错误,服务器未收到请求。尝试将POST更改为PUT并未解决问题,因为与接口文档不符。最终发现错误源于LR参数化大括号与JSON体的大括号冲突,并通过修改Vugen参数化设置解决了该问题。然而,当JSON串包含中文时仍然报500错误,目前尚未找到解决办法。
1、LR访问含有json串的请求格式如下:
web_custom_request("getActivityListForClient",
"Method=Post", //使用Post方法
"Resource=1",
"URL=http://yy.moodoo.com.cn:8081/mddddd/djn/directprovider",
"RecContentType=application/json", //指定响应头(接收)的Content-Type
"EncType=application/json", //指定请求头的Content-Type
//将所有的参数拼接到一起放到Body体里面,双引号要用斜杠转义,避免和lr里面的双引号冲突
"Body={"action":"ProjectActivityInterface","method":"getActivityListForClient","data":["0105.1505004",2],"type":"rpc","tid":36}",
"TargetFrame=",
LAST);

2、但是按照以上的格式写,检查格式、符号都没有错误,编译也没有错误。但是一执行就报500错误,后来查看服务器,发现根本就没有收到这个请求。即便是不带任何参数在浏览器访问:http://yy.mingdiao.com.cn:8081/mdoss/djn/directprovider,服务器也会收到这个错误的请求,但是我在lr这样执行,服务器完全没反应。后来,百度查找解决方法,有人说把Post换成Put,但是这不是鬼扯吗?现在开发几乎都不会用put请求。并且我们的接口文档也明确说明了是post请求,所以即便换成PUT不再报500,但是,http返回码也是400,且有警告信息。所以这不是一个好的解决办法。
最终找到此错误的原因是,body体的大括号和lr的参数化大括号冲突了,所以一直报错。
解方法是,在Vugen里面tool下面找到常规选项,将参数化的大括号改为尖括号,如下图:
3、Josn串含有中文报500错。此问题暂未解决,如果有哪位大神知道麻烦留言说一下,万分感谢。
"Body={\"action\":\"ProjectInterface\",\"method\":\"getContract\",\"data\":[\"0201.工程开工\"],\"type\":\"rpc\",\"tid\":36}",
<think>好的,我现在需要回答用户的问题:在LoadRunner中生成JSON字符的函数是什么。首先,我得回忆一下LoadRunner支持的函数,特别是与字符操作相关的部分。用户可能是在进行性能测试时需要动态生成JSON数据,比如模拟API请求。 根据已有的知识,LoadRunner本身并没有专门用于生成JSON的函数,但可以通过字符拼接或参数化来实现。常用的函数可能包括lr_eval_string、lr_save_string,以及一些格式化函数。比如,用户可以使用sprintf函数来格式化字符,或者结合参数替换来构造JSON结构。 接下来,我需要查阅相关的引用内容,看看是否有提到相关函数。例如,引用[3]提到lr_eval_string用于取出参数的值,这可能用于替换JSON中的变量部分。引用[4]和[5]讨论了参数化的方法,使用<>作为参数化符号,这可能帮助在JSON字符中动态插入值。虽然没有直接提到JSON生成函数,但结合这些函数和方法,用户可以手动构建JSON字符。 另外,可能需要考虑使用web_custom_request或其他HTTP函数来发送JSON数据,这时候需要正确设置请求体和Content-Type头。例如,使用sprintf将变量插入到JSON模板中,然后保存为参数,最后在请求中使用该参数。 需要确保回答中提到的步骤正确,并引用相关的参考资料。同时,用户可能还想知道如何转义特殊字符或处理复杂结构,这时候可能需要使用lr_convert_string_encoding或其他转义函数,但这些在现有引用中没有明确说明,可能需要进一步建议查看官方文档或示例。 总结步骤:1. 使用sprintf构造JSON字符;2. 参数化动态部分;3. 使用lr_eval_string替换参数;4. 保存并发送JSON数据。同时提醒注意转义和格式正确性。</think>在LoadRunner中生成JSON字符通常需要结合字符操作函数和参数化方法。以下是常用的实现方式及步骤: ### 1. **使用基础字符函数构造JSON** 通过`sprintf`函数直接拼接JSON格式字符: ```c char json_buffer[1000]; sprintf(json_buffer, "{ \"user\": \"%s\", \"age\": %d }", lr_eval_string("{username}"), atoi(lr_eval_string("{user_age}"))); lr_save_string(json_buffer, "jsonParam"); ``` - **说明**:`lr_eval_string`用于解析参数值(如`{username}`),`lr_save_string`将结果保存为新参数`jsonParam`[^3][^4]。 ### 2. **参数化嵌套与动态生成** 在Socket协议脚本中,可利用`<>`符号进行参数化(如动态插入时间戳): ```c // 在data.ws中定义 send buf0 5120 "{\"timestamp\": \"<timestamp>\"}" ``` - **说明**:`<timestamp>`会被替换为实际参数值,类似HTTP协议的`{}`参数化。 ### 3. **处理复杂结构(数组/嵌套对象)** 使用循环和追加函数构建复杂JSON: ```c lr_save_string("", "jsonArray"); // 初始化空数组 for (int i=0; i<3; i++) { lr_param_sprintf("item", "{ \"id\": %d }", i+1); lr_param_concat("jsonArray", lr_eval_string("{item},"), LAST); } lr_save_string(lr_eval_string("{jsonArray}"), "finalJson"); // 结果示例:[{ "id":1 },{ "id":2 },{ "id":3 }] ``` - **关键函数**: - `lr_param_sprintf`:格式化字符并保存为参数 - `lr_param_concat`:追加字符内容[^2] ### 4. **发送JSON数据** 在HTTP请求中使用生成的JSON参数: ```c web_custom_request("api_call", "Method=POST", "URL=http://example.com/api", "Body={jsonParam}", "HEADER=Content-Type: application/json", LAST); ``` ### 注意事项 - **转义引号**:JSON中的双引号需用`\"`转义 - **长度检查**:使用`strlen`验证缓冲区是否溢出 - **编码处理**:非ASCII字符需用`lr_convert_string_encoding`转换[^5]
<think>好的,用户想了解如何使用LoadRunner编写发送POST请求的性能测试脚本。我需要根据提供的引用内容来组织答案。 首先,引用[3]提到了web_submit_data()方法用于POST请求,这可能是一个关键点。需要详细说明这个函数的用法和参数设置。例如,需要设置Action、Method为POST,指定要提交的ItemData数据。 然后,引用[5]中的例子展示了如何处理响应,比如转码和打印响应报文。这部分可以作为脚本调试的步骤,告诉用户如何验证POST请求是否成功。 另外,引用[2]和引用[4]提到了如何保存和输出请求头信息,可能需要在脚本中添加相关代码来捕获请求头,帮助调试或验证请求是否正确发送。 用户可能还需要知道如何设置表单参数或JSON数据,所以在步骤中应该分点说明这两种常见的数据格式如何处理。比如,使用web_submit_data提交表单,或者使用web_custom_request发送JSON数据。 另外,性能测试脚本的常见步骤包括创建脚本、运行测试和分析结果,如引用[1]所述。需要将这些步骤融入回答中,让用户了解整个流程。 还需要注意用户可能遇到的常见问题,比如编码问题,引用[5]中的转码函数lr_convert_string_encoding就是一个例子,应该提醒用户处理响应编码。 最后,生成的相关问题要围绕POST请求脚本编写、参数化、性能分析等方面,确保覆盖用户可能进一步想了解的内容。 整理结构:先介绍POST请求的两种方法,然后分步骤说明如何编写脚本,包括参数设置、数据格式处理、结果验证,最后提到性能测试的整体流程和常见问题。确保引用正确的引用来源,比如引用[3]、[5]等。</think>在LoadRunner中编写发送POST请求的性能测试脚本,可通过以下步骤实现: ### 一、POST请求脚本编写方法 1. **使用`web_submit_data`函数**(推荐用于表单提交) ```c web_submit_data("api/login", "Action=https://example.com/api/login", "Method=POST", "EncType=application/x-www-form-urlencoded", ITEMDATA, "Name=username", "Value=testuser", ENDITEM, "Name=password", "Value=123456", ENDITEM, LAST); ``` 说明:该函数自动处理表单边界,适用于标准表单提交,需指定`Method=POST`和内容类型[^3][^5] 2. **使用`web_custom_request`函数**(适用于JSON/XML等复杂格式) ```c web_custom_request("create_order", "URL=https://example.com/orders", "Method=POST", "Body={\"productId\":1001,\"quantity\":2}", "Header=Content-Type: application/json", LAST); ``` 说明:可自由定义请求体和头部,适合非表单类型的POST请求[^3] ### 二、关键配置步骤 1. **参数化数据** ```c lr_save_string(lr_eval_string("{username_param}"), "username"); lr_save_string(lr_eval_string("{password_param}"), "password"); ``` 结合参数池使用可实现多用户测试 2. **响应验证** ```c web_reg_save_param("S_respond", "LB=", "RB=", "Search=Body", LAST); // 发送POST请求后 lr_convert_string_encoding(lr_eval_string("{S_respond}"), LR_ENC_UTF8, NULL, "respond"); lr_output_message("响应报文:%s", lr_eval_string("{respond}")); ``` 通过转码函数确保中文正常显示 3. **请求头捕获(调试用)** ```c web_save_header(REQUEST, "RequestHeader"); lr_output_message("请求头:%s", lr_eval_string("{RequestHeader}")); ``` 可用于验证Content-Type等头部设置[^4] ### 三、性能测试流程 1. 在VuGen中创建/编辑脚本 2. 通过Controller运行负载测试 3. 使用Analysis分析响应时间、TPS等指标[^1]
### 回答1: 你可以使用LoadRunner内置的lr_json_get_values函数来获取JSON数组中的值。以下是一个示例代码: ``` char* json = "{\"users\":[{\"name\":\"Alice\",\"age\":30},{\"name\":\"Bob\",\"age\":35}]}"; char* paramName = "userAge"; char* paramValue; lr_json_get_values(json, "users[*].age", paramName, &paramValue); lr_output_message("The age of the first user is %s", paramValue); ``` 在这个例子中,我们首先定义了一个包含JSON数组的字符。然后我们使用`lr_json_get_values`函数来获取所有用户的年龄,并将其保存在`paramName`参数中。最后,我们使用`lr_output_message`函数将第一个用户的年龄输出到LoadRunner日志中。 请注意,在`lr_json_get_values`函数中,`users[*].age`参数使用了通配符(`*`)来匹配所有用户的年龄。如果你只想获取数组中的一个特定元素,可以将通配符替换为该元素的索引号(例如,`users[0].age`表示获取第一个用户的年龄)。 ### 回答2: 在LoadRunner中获取JSON数组的值通常可以通过以下步骤实现: 1. 首先,使用web_custom_request函数发送一个HTTP请求,将返回的JSON字符保存在一个缓冲区中。 2. 接下来,使用web_convert_param函数将JSON字符转换为可操作的参数。 3. 使用web_reg_save_param函数定义一个参数提取规则,以从JSON数组中提取所需的值。 例如,假设我们有一个名为"response"的缓冲区,其中包含一个形如以下内容的JSON数组: [ { "name": "John", "age": 30 }, { "name": "Mike", "age": 25 }, { "name": "Lisa", "age": 35 } ] 要从这个数组中提取"name"字段的值,可以按照以下步骤进行设置: 1. 使用web_set_max_html_param_len函数设置可提取的最大参数长度。 2. 使用web_convert_param函数将缓冲区内容转换为可操作的参数,例如:web_convert_param("response", "SourceParam=response", "DestinationParam=responseParam", LAST); 3. 使用web_reg_save_param函数定义一个参数提取规则,以从数组中提取"name"字段的值,例如:web_reg_save_param("nameParam", "LB=\"name\":\"", "RB=\"", "Ord=All", "RelFrameId=1", LAST); 4. 使用web_save_param_regexp函数提取所有满足提取规则的值,并将结果保存在"nameParam"参数中,例如:web_save_param_regexp("nameParam", "RegExp\":\"(.*?)\"", "Ordinal=All", LAST); 5. 最后,在脚本或输出结果的其他地方使用"nameParam"参数来访问提取的值。 这样,你就可以从JSON数组中提取所需的值,并在LoadRunner脚本中进行进一步的处理和使用。 ### 回答3: 使用LoadRunner脚本获取JSON数组中的值,需要进行以下步骤: 1. 首先,使用web_custom_request函数发送HTTP请求并获取JSON响应。可以使用该函数指定请求方法、URL、请求头等。 2. 接下来,使用web_reg_save_param函数在JSON响应中提取数组。通过指定正则表达式,可以提取JSON数组的值并保存到参数中。 3. 为了提取数组中的所有值,使用web_reg_save_param_ex函数的Search方法为参数指定搜索类型为All。 4. 在脚本中使用lr_output_message函数打印出存储在参数中的JSON数组的值。可以通过调用参数的索引方式访问每个值。 例如,假设JSON响应如下: { "users": [ { "name": "Alice", "age": 25 }, { "name": "Bob", "age": 30 }, { "name": "Charlie", "age": 35 } ] } 脚本示例如下: web_custom_request("API Request", "URL=http://example.com/api", "Method=GET", "TargetFrame=", "Resource=0", "Referer=", LAST); web_reg_save_param_ex( "ParamName=userName", "LB=\"name\":\"", "RB=\"", SEARCH_FILTERS, "Scope=Body", "Search=All", LAST); web_reg_save_param_ex( "ParamName=userAge", "LB=\"age\":", "RB=", SEARCH_FILTERS, "Scope=Body", "Search=All", LAST); lr_output_message("User 1: %s, %s", lr_paramarr_idx("userName", 1), lr_paramarr_idx("userAge", 1)); lr_output_message("User 2: %s, %s", lr_paramarr_idx("userName", 2), lr_paramarr_idx("userAge", 2)); lr_output_message("User 3: %s, %s", lr_paramarr_idx("userName", 3), lr_paramarr_idx("userAge", 3)); 以上示例代码提取了JSON数组中的用户名和年龄,并使用lr_output_message函数打印出每个用户的值。使用lr_paramarr_idx函数可以通过索引方式访问参数数组中的值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值