赞
踩
当我们使用pytest
或者unittest
进行接口测试,发现bug
,详细描述之后提给RD
,但是往往不够,RD
为了更快复现+验证,通常找你要curl
,此时千万别说没有,作为一名测试开发工程师,这个需求还是很容易解决的。这时候需要我们写一个函数将请求转成curl
命令就解决啦。当然本文也会介绍cURL 的基本知识点和用法。cURL 是一个命令行工具,用于通过 URL 发送和接收数据。它支持多种协议,包括 HTTP、FTP、SMTP 等,并提供了丰富的选项和功能。我们将涵盖 cURL 的安装、发送 GET 和 POST 请求、处理响应等内容,帮助您快速上手使用 cURL 进行网络请求。
cURL 是一个开源的命令行工具,用于进行网络请求。它是一个跨平台工具,可以在多种操作系统上使用,如 Linux、Windows 和 macOS。cURL 支持多种协议,包括 HTTP、HTTPS、FTP、SMTP、POP3 等。
cURL 提供了丰富的选项和功能,使得我们可以灵活地发送请求、设置请求头、处理响应等。它还支持数据传输的断点续传、文件上传和下载等高级功能。
在大多数 Linux 发行版中,cURL 已经预装。如果没有,可以使用包管理器进行安装。例如,在 Ubuntu 上可以执行以下命令:
sudo apt-get install curl
在 Windows 上,可以从 cURL 官网(curl.se/windows/)下载预编译的可执行文件,然后将其添加到系统路径中。
在 macOS 上,默认已经安装了 cURL。如果需要更新或自定义安装,可以使用包管理器(如 Homebrew)进行安装。
使用 cURL 发送 GET 请求非常简单。只需在命令行中执行以下命令:
curl URL
其中,URL 是要请求的地址。例如:
curl https://api.example.com/users
cURL 将发送一个简单的 GET 请求,并将响应打印到控制台。
要发送 POST 请求,可以使用 -X
选项指定请求方法,并使用 -d
选项传递请求数据。例如:
curl -X POST -d 'username=admin&password=123456' https://api.example.com/login
在上面的示例中,我们发送了一个带有用户名和密码的 POST 请求到登录接口。
使用 -H
选项可以设置请求头。例如:
curl -H 'Content-Type: application/json' https://api.example.com/users
在上面的示例中,我们设置了请求头的 Content-Type 为 application/json。
cURL 默认将响应输出到标准输出。如果需要将响应保存到文件中,可以使用 -o
选项指定文件名。例如:
curl -o response.json https://api.example.com/users
在上面的示例中,cURL 将响应保存到名为 response.json 的文件中。
在发送 HTTP 请求时,服务器可以选择对传输的数据进行压缩,以减少数据量和提高传输效率。常见的压缩算法包括gzip和deflate。当使用 --compressed
选项时,cURL 将在请求中包含适当的头信息,指示服务器对响应进行压缩,并在接收到响应后自动解压缩。这样可以减少网络传输的时间和资源占用。
使用 --compressed
选项的示例:
curl --compressed https://api.example.com/data
上述命令会发送一个带有压缩请求头的 GET 请求到 https://api.example.com/data
,并在接收到响应后自动解压缩。
注意:不是所有的服务器都支持压缩功能,也不能保证所有的响应都会进行压缩。但是在支持压缩的服务器上,使用 --compressed
选项可以节省带宽和提高传输效率。
当使用 cURL 发送 HTTPS 请求时,默认情况下,cURL 会验证服务器的证书是否有效和可信。这是为了确保与服务器之间的安全通信,并防止中间人攻击。然而,有时服务器的证书可能无效或自签名,导致验证失败。在这种情况下,可以使用 --insecure
选项来绕过对服务器证书的验证。
使用 --insecure
选项的示例:
curl --insecure https://api.example.com/data
上述命令会发送一个 HTTPS 请求到 https://api.example.com/data
,但不会验证服务器的证书有效性。这样可以在某些情况下继续进行连接,但也存在一定的安全风险,因为无法确保与服务器之间的通信是否被篡改。
请注意,在正式环境中,建议不要使用 --insecure
选项,以确保安全通信并避免潜在的安全问题。只有在开发和测试过程中,或者确信与服务器之间的连接是安全的情况下,才应该考虑使用 --insecure
选项。
cURL 还提供了一些高级功能,使得网络请求更加灵活和强大。
-C
选项可以实现断点续传功能,用于继续下载中断的文件。-F
选项可以上传文件。例如 curl -F 'file=@path/to/file' https://api.example.com/upload
会将指定文件上传到服务器。-b
和 -c
选项可以处理和发送 Cookie。-m
选项可以设置请求超时时间。了解了基本用法,这个功能就好实现了
- def to_curl(request, compressed: bool = False, verify: bool = False) -> str:
- parts = [
- ('curl', None),
- ('-X', request.method)
- ]
-
- for k, v in sorted(request.headers.items()):
- parts += [('-H', f'{k}: {v}')]
-
- if request.body:
- body = request.body
- if isinstance(body, bytes):
- body = body.decode('utf-8')
- parts += [('-d', body)]
-
- if compressed:
- parts += [('--compressed', None)]
-
- if verify:
- parts += [('--insecure', None)]
-
- parts += [(None, request.url)]
-
- flat_parts = []
- for k, v in parts:
- if k:
- flat_parts.append(quote(k))
- if v:
- flat_parts.append(quote(v))
- return ' '.join(flat_parts)
-
代码很好理解,主要解释一下如下两点:
1、在给 cURL 添加请求头时,使用 sorted()
函数对请求头进行排序是为了保证请求头的顺序一致性。
HTTP 请求头在发送到服务器时,如果顺序不一致,可能会导致服务器解析出错或产生意外行为。虽然大多数情况下,请求头的顺序不会影响实际结果,但为了避免潜在的问题,最好保持请求头的一致顺序。
使用 sorted()
函数对请求头进行排序可以确保每次执行循环时,请求头的顺序是一致的,从而生成相同的 cURL 命令。为了保险起见,特别是当涉及 HTTP 请求时,建议对请求头进行排序以确保一致性和可预测性。
2、quote
函数是 shlex
模块中的一个方法,用于在生成命令行参数时对字符串进行安全转义。
在命令行中,某些特殊字符具有特殊含义,如空格、引号、反斜杠等。如果字符串中含有这些特殊字符,为了确保命令行的正确解析,需要对字符串进行转义,即将特殊字符进行处理,以避免其被误解为命令行语法的一部分。
quote
函数根据不同的操作系统和命令行解析器的规则,对字符串进行适当的转义处理。它会在需要转义的特殊字符前添加反斜杠 ``,以确保在命令行中正常解析。
例如,若要传递包含空格的字符串 "Hello World"
作为命令行参数,可以使用 quote
函数对其进行转义,确保它被正确地识别为单个参数:
- from shlex import quote
-
- arg = "Hello World"
- quoted_arg = quote(arg)
- print(quoted_arg)
输出结果为:
'Hello World'
quote
函数返回一个转义后的字符串,将字符串用引号括起来,表明其是一个整体的参数。这样,当拼接命令行参数时,在解析命令行时就能正确识别字符串中的空格,并将其作为单个参数处理。
至此已经实现请求转curl
的功能了,既方便自己也可以方便他人。提升效率的小妙招。
最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保100%免费】
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。