云压测 HTTP

这篇档提供了在云压测脚本模式中使用 HTTP 协议进行压测的完整示例。所有示例均基于 pts/http 模块提供的 HTTP 请求方法。

相关产品
云压测 产品页,含版本规格、价格与购买入口。

一、前置条件

在使用 HTTP 请求功能前,请确保:

·导入模块:在脚本开头使用 import http from 'pts/http' 导入 HTTP 模块。

·脚本结构:所有请求代码需放在 export default function() 函数中执行。

·URL 格式:确保目标 URL 格式正确,支持 http:// 和 https:// 协议。

·网络连通性:确保压测环境能够访问目标服务器。

二、注意事项

·错误处理:建议使用 check() 函数验证响应状态码和内容,确保请求成功。

·超时设置:对于可能响应较慢的接口,建议设置合理的 timeout 值。

·响应体大小:如果响应体很大且不需要检查内容,可以设置 discardResponseBody: true 以节省内存。

·Content-Type:发送 POST/PUT/PATCH 请求时,务必根据请求体格式设置正确的 Content-Type。

·文件上传:使用 FormData 上传文件时,文件必须提前上传到压测场景中,并使用 open() 函数读取。

·并发控制:批量请求时,注意合理设置 parallel 值,避免对目标服务器造成过大压力。

·URL 编码:查询参数和表单数据会自动进行 URL 编码,无需手动编码。

·重定向:默认会跟随重定向,可以通过 maxRedirects 控制最大重定向次数。

四、函数说明

http.get() 用于发起 HTTP GET 请求,适用于获取资源、查询数据等场景。该方法在脚本模式的压测场景中使用,支持设置请求头、查询参数等配置。

五、函数签名

http.get(url: string, options?: Request): Response

六、参数说明

·url (string,必填):目标请求的完整 URL 地址,支持 http:// 和 https:// 协议。

·options (Request,可选):请求配置对象,包含以下可选字段:

·headers (Record<string, string>):自定义请求头,如 {'User-Agent': 'pts-engine', 'Connection': 'keep-alive'}。

·query (Record<string, string>):URL 查询参数,会自动拼接到 URL 后面。

·timeout (number):请求超时时间,单位为毫秒,包括连接时间、任何重定向和读取响应正文的时间。

·maxRedirects (number):最大重定向跳转次数。

·discardResponseBody (boolean):是否丢弃响应体,适用于响应体太大且不需要进行 check 的场景。

·service (string):服务标识,用于在报表中将不同 URL 的请求归类到同一个服务下。

·basicAuth (BasicAuth):基础鉴权配置。

·chunked (function):分块传输回调函数,函数签名为 (body: string) => void,当数据以一系列分块的形式进行发送时,会按行读取响应体并进行回调函数的运行。

·contentLength (number):记录关联内容的长度。-1表示长度未知,>=0表示可以从 body 中读取给定的字节数。

七、返回值说明

返回 Response 对象,包含以下属性:

·statusCode (number):HTTP 状态码,如200、404、500等。

·status (string):HTTP 状态消息,如 "200 OK"。

·body (string):响应体内容,原始字符串格式。

·headers (Record<string, string>):响应头信息。

·contentLength (number):服务器响应体长度。

·proto (string):协议,如 "HTTP/1.0"。

·request (Request):为获得此响应而发送的请求。

·responseTimeMS (number):请求的响应时间,单位为毫秒。

·json() (方法):将响应体反序列化为 JSON 对象,仅当响应体为有效的 JSON 字符串时使用。

八、使用限制

·URL 必须包含完整的协议前缀(http:// 或 https://)。

·查询参数值必须是字符串类型。

·如果响应体不是有效的 JSON 格式,调用 json() 方法会抛出异常。

十、示例1:简单 GET 请求

本示例演示如何发起最简单的 GET 请求,并检查响应状态码和解析 JSON 响应体。

import http from 'pts/http';import { check, sleep } from 'pts';export default function () { // 发起简单的 GET 请求 const resp1 = http.get('http://mockhttpbin.pts.svc.cluster.local/get'); // 输出原始响应体 console.log(resp1.body); // 如果响应体是 JSON 格式,使用 json() 方法转换为对象 console.log(resp1.json()); // 检查响应状态码是否为 200 check('status is 200', () => resp1.statusCode === 200); // 等待 1 秒 sleep(1);}

十一、示例2:带请求头和查询参数的 GET 请求

本示例演示如何设置自定义请求头和 URL 查询参数,适用于需要传递特定头部信息或查询条件的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { // GET 请求,包含自定义请求头和查询参数 const resp2 = http.get('http://mockhttpbin.pts.svc.cluster.local/get', { headers: { 'Connection': 'keep-alive', 'User-Agent': 'pts-engine', 'Accept': 'application/json' }, query: { 'name1': 'value1', 'name2': 'value2', } }); // 从 JSON 响应中提取查询参数值 console.log(resp2.json().args.name1); // 输出: 'value1' // 验证响应中的查询参数值 check('body.args.name1 equals value1', () => resp2.json().args.name1 === 'value1');}

十二、示例 3:带超时和重定向配置的 GET 请求

本示例演示如何设置请求超时时间和最大重定向次数,适用于需要控制请求行为的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { const resp = http.get('http://mockhttpbin.pts.svc.cluster.local/get', { headers: { 'User-Agent': 'pts-engine' }, query: { 'page': '1', 'size': '10' }, timeout: 5000, // 设置超时时间为 5 秒 maxRedirects: 3 // 最大允许 3 次重定向 }); check('request success', () => resp.statusCode === 200);}

十四、函数说明

http.post() 用于发起 HTTP POST 请求,适用于创建资源、提交数据等场景。当请求体为对象时,默认会序列化为 JSON 格式发送。

十五、函数签名

http.post(url: string, body?: string | object | Record<string, string>, options?: Request): Response

十六、参数说明

·url (string,必填):目标请求的完整 URL 地址

·body (string | object | Record<string, string>,可选):请求体内容。

·如果为对象,会自动序列化为 JSON 字符串,并设置 Content-Type: application/json。

·如果为字符串,直接作为请求体发送。

·如果为 Record<string, string>,可以用于表单编码等场景。

·options (Request,可选):请求配置对象,字段同 http.get() 方法,可设置 headers、query、timeout、maxRedirects、discardResponseBody、service 等。

十七、返回值说明

返回 Response 对象,结构同 http.get() 方法。

十八、使用限制

·当 body 为对象时,系统会自动序列化为 JSON 字符串并设置 Content-Type: application/json 请求头,也可以手动设置。

·如果响应体不是有效的 JSON 格式,调用 json() 方法会抛出异常。

20、示例1:发送 JSON 格式的 POST 请求

本示例演示如何发送 JSON 格式的 POST 请求,适用于调用 RESTful API 创建或更新资源的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { // 发送 POST 请求,body 为对象会自动序列化为 JSON const resp = http.post( 'http://mockhttpbin.pts.svc.cluster.local/post', { user_id: '12345', username: 'testuser', email: 'test@example.com' }, { headers: { 'Content-Type': 'application/json', }, } ); // 解析响应 JSON 并提取数据 console.log(resp.json().json.user_id); // 输出: 12345 // 验证响应数据 check('body.json.user_id equals 12345', () => resp.json().json.user_id === '12345', resp);}

21、示例 2:发送字符串格式的 POST 请求

本示例演示如何发送字符串格式的请求体,适用于需要发送原始字符串数据的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { // 发送字符串格式的 POST 请求 const resp = http.post( 'http://mockhttpbin.pts.svc.cluster.local/post', 'raw string data', { headers: { 'Content-Type': 'text/plain', }, } ); check('request success', () => resp.statusCode === 200); console.log(resp.json().data); // 输出: 'raw string data'}

23、函数说明

当需要发送表单数据时,可以使用 application/x-www-form-urlencoded 格式。这种格式适用于传统的 HTML 表单提交场景。

24、参数说明

·url (string,必填):目标请求的完整 URL 地址。

·body (object,必填):表单数据对象,键值对会被编码为 URL 编码格式。

·options (Request,必填):请求配置对象,必须设置 Content-Type: application/x-www-form-urlencoded 请求头。

25、使用限制

·必须显式设置 Content-Type: application/x-www-form-urlencoded 请求头,否则服务器可能无法正确解析表单数据。

·body 对象中的值必须是字符串类型,非字符串值会被转换为字符串。

26、示例:发送表单编码的 POST 请求

本示例演示如何发送 application/x-www-form-urlencoded 格式的 POST 请求,适用于提交 HTML 表单数据的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { // 发送表单编码格式的 POST 请求 const resp = http.post( 'http://mockhttpbin.pts.svc.cluster.local/post', { user_id: '12345', action: 'login', timestamp: '1234567890' }, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, } ); // 验证 Content-Type 请求头 console.log(resp.json().headers['Content-Type']); // 输出: application/x-www-form-urlencoded // 从响应中提取表单数据 console.log(resp.json().form.user_id); // 输出: 12345 // 验证表单数据 check('body.form.user_id equals 12345', () => resp.json().form.user_id === '12345', resp);}

28、函数说明

http.FormData 用于构造 multipart/form-data 格式的请求体,适用于需要上传文件或同时发送文本和文件的场景。通过 new http.FormData() 创建实例,使用 append() 方法添加字段,最后通过 body() 方法获取请求体。

29、相关函数

·new http.FormData():创建 FormData 实例。

·formData.append(key, value):向 FormData 中添加字段,value 可以是字符串或 http.file() 返回的 File 对象。

·formData.body():返回 FormData 的请求体内容(ArrayBuffer 格式),调用后不能再进行 append 操作。

·formData.contentType():返回 FormData 的 Content-Type 值,包含 boundary 信息。

·http.file(data, name?, contentType?):创建文件对象,用于上传文件。

·data (string | ArrayBuffer,必填):文件内容,通常使用 open() 函数的返回值。

·name (string,可选):文件名,默认为纳秒级时间戳。

·contentType (string,可选):文件内容类型,默认为 application/octet-stream。

30、使用限制

·调用 formData.body() 后不能再调用 append() 方法。

·必须使用 formData.contentType() 返回的值设置 Content-Type 请求头。

·文件数据必须通过 open() 函数读取或使用 ArrayBuffer 格式。

32、示例1:上传文本和文件

本示例演示如何同时上传文本字段和文件,适用于文件上传表单的场景。

import http from 'pts/http';import { check } from 'pts';// 读取文件内容(文件需提前上传到压测场景中)const fileData = open("./sample/tmp.js");export default function () { // 创建 FormData 实例 const formData = new http.FormData(); // 添加文本字段 formData.append('data', 'some data'); formData.append('description', 'This is a test file'); // 添加文件字段,使用 http.file() 创建文件对象 formData.append('file', http.file(fileData)); // 发送 POST 请求,使用 formData.body() 作为请求体 const resp = http.post('http://mockhttpbin.pts.svc.cluster.local/post', formData.body(), { headers: { 'Content-Type': formData.contentType() // 必须使用 formData.contentType() 返回的值 } }); // 验证 Content-Type 包含 multipart/form-data console.log(resp.json().headers['Content-Type']); // 输出: multipart/form-data; boundary=xxxxx // 验证文本字段 console.log(resp.json().form.data); // 输出: some data // 验证文件大小 console.log(resp.json().files.file.length); // 输出文件字节数,如: 801 // 检查表单数据 check('body.form.data equals some data', () => resp.json().form.data === 'some data');}

33、示例2:上传多个文件

本示例演示如何上传多个文件,适用于需要同时上传多个文件的场景。

import http from 'pts/http';import { check } from 'pts';const file1 = open("./sample/file1.txt");const file2 = open("./sample/file2.jpg");export default function () { const formData = new http.FormData(); // 添加多个文件,可以指定文件名和内容类型 formData.append('document', http.file(file1, 'document.txt', 'text/plain')); formData.append('image', http.file(file2, 'photo.jpg', 'image/jpeg')); formData.append('category', 'uploads'); const resp = http.post('http://mockhttpbin.pts.svc.cluster.local/post', formData.body(), { headers: { 'Content-Type': formData.contentType() } }); check('upload success', () => resp.statusCode === 200); console.log('Document size:', resp.json().files.document.length); console.log('Image size:', resp.json().files.image.length);}

35、函数说明

http.put() 用于发起 HTTP PUT 请求,适用于完整更新资源的场景。PUT 请求通常需要提供完整的资源数据。

36、函数签名

http.put(url: string, body?: string | object | Record<string, string>, options?: Request): Response

37、参数说明

参数与 http.post() 方法相同。

38、返回值说明

返回 Response 对象,结构同 http.get() 方法。

39、示例:更新资源

本示例演示如何使用 PUT 请求更新资源,适用于 RESTful API 中更新完整资源的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { // 使用 PUT 请求更新资源 const resp = http.put( 'http://mockhttpbin.pts.svc.cluster.local/put', { id: '12345', name: 'Updated Name', status: 'active' }, { headers: { 'Content-Type': 'application/json', }, } ); check('update success', () => resp.statusCode === 200); console.log(resp.json().json.name); // 输出: Updated Name}

41、函数说明

http.delete() 用于发起 HTTP DELETE 请求,适用于删除资源的场景。

42、函数签名

http.delete(url: string, options?: Request): Response

43、参数说明

·url (string,必填):目标请求的完整 URL 地址。

·options (Request,可选):请求配置对象,字段同 http.get() 方法,可设置 headers、query、timeout、maxRedirects、discardResponseBody、service 等。

44、返回值说明

返回 Response 对象,结构同 http.get() 方法。

45、示例:删除资源

本示例演示如何使用 DELETE 请求删除资源,适用于 RESTful API 中删除资源的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { // 使用 DELETE 请求删除资源 const resp = http.delete('http://mockhttpbin.pts.svc.cluster.local/delete', { headers: { 'Authorization': 'Bearer token123' }, query: { 'id': '12345' } }); check('delete success', () => resp.statusCode === 200 || resp.statusCode === 204);}

47、函数说明

http.patch() 用于发起 HTTP PATCH 请求,适用于部分更新资源的场景。PATCH 请求只需要提供需要更新的字段。

48、函数签名

http.patch(url: string, body?: string | object | Record<string, string>, options?: Request): Response

49、参数说明

参数与 http.post() 方法相同。

50、返回值说明

返回 Response 对象,结构同 http.get() 方法。

51、示例:部分更新资源

本示例演示如何使用 PATCH 请求部分更新资源,适用于只需要更新部分字段的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { // 使用 PATCH 请求部分更新资源 const resp = http.patch( 'http://mockhttpbin.pts.svc.cluster.local/patch', { status: 'inactive' // 只更新 status 字段 }, { headers: { 'Content-Type': 'application/json', }, } ); check('patch success', () => resp.statusCode === 200);}

53、函数说明

http.head() 用于发起 HTTP HEAD 请求,只获取响应头信息,不返回响应体。适用于检查资源是否存在、获取资源元信息等场景。

54、函数签名

http.head(url: string, options?: Request): Response

55、参数说明

参数与 http.get() 方法相同。

56、返回值说明

返回 Response 对象,但 body 为空。可以通过 headers 属性获取响应头信息。

57、示例:检查资源

本示例演示如何使用 HEAD 请求检查资源是否存在,适用于不需要响应体内容的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { // 使用 HEAD 请求检查资源 const resp = http.head('http://mockhttpbin.pts.svc.cluster.local/get', { headers: { 'User-Agent': 'pts-engine' } }); // 检查状态码 check('resource exists', () => resp.statusCode === 200); // 获取响应头信息 console.log('Content-Type:', resp.headers['Content-Type']); console.log('Content-Length:', resp.headers['Content-Length']);}

59、函数说明

HTTP 基础鉴权可以通过两种方式实现:

1. 在 URL 中包含用户名和密码:http://username:password@host/path。

2. 使用 basicAuth 配置项(需配合 http.do() 方法使用)。

60、使用限制

·URL 中的用户名和密码会以 Base64 编码形式发送。

·仅适用于支持 HTTP Basic Authentication 的服务器。

·生产环境建议使用更安全的认证方式。

61、示例:使用 URL 进行基础鉴权

本示例演示如何在 URL 中包含用户名和密码进行基础鉴权,适用于需要简单认证的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { // 在 URL 中包含用户名和密码 const user = 'user'; const passwd = 'passwd'; const resp = http.get(`http://${user}:${passwd}@mockhttpbin.pts.svc.cluster.local/basic-auth/user/passwd`); // 验证认证结果 console.log(resp.json().authenticated); // 输出: true check('body.authenticated equals true', () => resp.json().authenticated === true);}

63、函数说明

可以通过在请求头中设置 Cookie 字段来发送 Cookie,适用于需要维护会话状态的场景。

64、使用限制

·Cookie 值必须是字符串格式

·多个 Cookie 可以使用分号分隔,如:cookie1=value1; cookie2=value2

·如果需要自动管理 Cookie,建议使用 http.do() 方法配合相关配置

65、示例:发送 Cookie

本示例演示如何在请求中发送 Cookie,适用于需要传递会话信息的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { // 在请求头中设置 Cookie const resp = http.get('http://mockhttpbin.pts.svc.cluster.local/cookies', { headers: { cookie: 'k=v; session_id=abc123; user_id=456' } }); // 验证 Cookie 是否正确传递 console.log(resp.json().cookies.k); // 输出: v console.log(resp.json().cookies.session_id); // 输出: abc123 check('body.cookies.k equals v', () => resp.json().cookies.k === 'v');}

67、函数说明

http.do() 是一个通用的 HTTP 请求方法,可以发送任意 HTTP 方法的请求。适用于需要更灵活控制请求参数或使用高级功能的场景。

68、函数签名

http.do(request: Request): Response

69、参数说明

request (Request,必填):请求配置对象,包含以下字段:

·method (string,必填):HTTP 方法,如 'GET'、'POST'、'PUT'、'DELETE'、'PATCH'、'HEAD' 等。

·url (string,必填):目标请求的完整 URL 地址。

·body (string | object | ArrayBuffer,可选):请求体内容,在使用 http.do 方法时才需要指定。

·headers (Record<string, string>,可选):请求头。

·query (Record<string, string>,可选):URL 查询参数。

·timeout (number,可选):请求超时时间(毫秒),包括连接时间、任何重定向和读取响应正文的时间。

·maxRedirects (number,可选):最大重定向跳转次数。

·discardResponseBody (boolean,可选):是否丢弃响应体,适用于响应体太大且不需要进行 check 的场景。

·service (string,可选):服务标识,用于在报表中将不同 URL 的请求归类到同一个服务下。

·basicAuth (BasicAuth,可选):基础鉴权配置。

·chunked (function,可选):分块传输回调函数,当数据以一系列分块的形式进行发送时,如果指定了 chunked 函数,会按行读取响应体并进行回调函数的运行。函数签名为 (body: string) => void。

·contentLength (number,可选):记录关联内容的长度。-1表示长度未知,>=0表示可以从 body 中读取给定的字节数。

·host (string,可选):host 或 host:port,通常不需要单独指定,使用 url 即可。

·path (string,可选):路径,相对路径省略前导斜杠,通常不需要单独指定,使用 url 即可。

·scheme (string,可选):协议,填写 "http" 或 "https",通常不需要单独指定,使用 url 即可。

70、返回值说明

返回 Response 对象,结构同其他 HTTP 方法。

71、使用限制

·method 和 url 字段为必填项。

·当使用 body 字段时,需要根据内容类型设置相应的 Content-Type 请求头。

·host、path、scheme 字段通常不需要单独指定,直接使用完整的 url 即可。

·chunked 回调函数仅在响应体以分块形式传输时才会被调用。

72、示例:使用 http.do() 发送请求

本示例演示如何使用 http.do() 方法发送请求,适用于需要完整控制请求参数的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { // 使用 http.do() 发送 POST 请求 const req = { method: 'post', url: 'http://mockhttpbin.pts.svc.cluster.local/post', headers: { 'Content-Type': 'application/json' }, query: { a: '1' }, body: { user_id: '12345' }, timeout: 5000, maxRedirects: 3 }; const resp = http.do(req); // 验证查询参数 console.log(resp.json().args.a); // 输出: 1 // 验证请求体 console.log(resp.json().json.user_id); // 输出: 12345 check('request success', () => resp.statusCode === 200);}

74、函数说明

http.batch() 用于批量发起多个 HTTP 请求,支持并行执行,适用于需要同时发起多个请求的场景,可以提高压测效率。

75、函数签名

http.batch(requests: Request[], options?: BatchOption): BatchResponse[]

76、参数说明

·requests (Request[],必填):请求配置对象数组,每个元素的结构与 http.do() 方法的参数相同,必须包含 method 和 url 字段。

·options (BatchOption,可选):批量请求配置选项。

·parallel (number,可选):并行执行数,默认值为 20。

77、返回值说明

返回 BatchResponse[] 数组,每个元素包含以下字段:

·error (string):错误信息,不为空则表示请求出错。

·response (Response):请求结果,包含 statusCode、body、headers 等属性。

78、使用限制

·批量请求的数量建议控制在合理范围内,避免过多请求导致性能问题。

·并行数 parallel 的值会影响请求的并发度,需要根据实际情况调整。

79、示例:批量发送请求

本示例演示如何使用 http.batch() 批量发送多个请求,适用于需要同时测试多个接口的场景。

import http from 'pts/http';import { check } from 'pts';export default function () { // 批量发送多个请求 const responses = http.batch( [ { method: 'GET', url: 'http://mockhttpbin.pts.svc.cluster.local/get?a=1', headers: { 'User-Agent': 'pts-engine' }, query: { b: '2' }, }, { method: 'POST', url: 'http://mockhttpbin.pts.svc.cluster.local/post', headers: { 'Content-Type': 'application/json' }, body: { user_id: '12345' }, }, { method: 'GET', url: 'http://mockhttpbin.pts.svc.cluster.local/get?c=3', headers: { 'Authorization': 'Bearer token123' }, }, ], // 批量请求配置选项 { parallel: 3, // 并行执行 3 个请求 } ); // 处理每个响应 responses.forEach((resp, index) => { if (resp.error) { console.log(`Request ${index + 1} error:`, resp.error); } else { console.log(`Request ${index + 1} status:`, resp.response.statusCode); check(`Request ${index + 1} success`, () => resp.response.statusCode === 200); } }); // 输出所有响应 console.log(JSON.stringify(responses));}

81、json() 方法

Response.json() 方法用于将响应体反序列化为 JSON 对象。

82、函数签名

json(): any

83、返回值

返回代表 Response.body 的 JavaScript 对象。

84、使用限制

·仅当响应体为有效的 JSON 字符串时才能使用。

·如果响应体不是 JSON 格式,调用此方法会抛出异常。

·建议在使用前先检查响应体的 Content-Type 是否为 application/json。

85、示例:解析 JSON 响应

import http from 'pts/http';import { check } from 'pts';export default function () { const resp = http.get('http://mockhttpbin.pts.svc.cluster.local/get', { query: { key: 'value' } }); // 检查响应是否为 JSON 格式 const contentType = resp.headers['Content-Type'] || ''; if (contentType.includes('application/json')) { const data = resp.json(); console.log('Parsed JSON:', data); check('has args', () => data.args !== undefined); } else { console.log('Response body:', resp.body); }}

赞 (0)
上一篇 4天前
下一篇 4天前