如何将 HTTP 请求转换为 cURL 命令行

前言

当我们使用pytest或者unittest进行接口测试,发现bug,详细描述之后提给RD,但是往往不够,RD为了更快复现+验证,通常找你要curl,此时千万别说没有,作为一名测试开发工程师,这个需求还是很容易解决的。这时候需要我们写一个函数将请求转成curl命令就解决啦。当然本文也会介绍cURL 的基本知识点和用法。cURL 是一个命令行工具,用于通过 URL 发送和接收数据。它支持多种协议,包括 HTTP、FTP、SMTP 等,并提供了丰富的选项和功能。我们将涵盖 cURL 的安装、发送 GET 和 POST 请求、处理响应等内容,帮助您快速上手使用 cURL 进行网络请求。

cURL 简介

cURL 是一个开源的命令行工具,用于进行网络请求。它是一个跨平台工具,可以在多种操作系统上使用,如 Linux、Windows 和 macOS。cURL 支持多种协议,包括 HTTP、HTTPS、FTP、SMTP、POP3 等。

cURL 提供了丰富的选项和功能,使得我们可以灵活地发送请求、设置请求头、处理响应等。它还支持数据传输的断点续传、文件上传和下载等高级功能。

cURL 的安装

Linux

在大多数 Linux 发行版中,cURL 已经预装。如果没有,可以使用包管理器进行安装。例如,在 Ubuntu 上可以执行以下命令:

arduino 复制代码
sudo apt-get install curl

Windows

在 Windows 上,可以从 cURL 官网(curl.se/windows/)下载预编译的可执行文件,然后将其添加到系统路径中。

macOS

在 macOS 上,默认已经安装了 cURL。如果需要更新或自定义安装,可以使用包管理器(如 Homebrew)进行安装。

基本用法

发送 GET 请求

使用 cURL 发送 GET 请求非常简单。只需在命令行中执行以下命令:

复制代码
curl URL

其中,URL 是要请求的地址。例如:

arduino 复制代码
curl https://api.example.com/users

cURL 将发送一个简单的 GET 请求,并将响应打印到控制台。

发送 POST 请求

要发送 POST 请求,可以使用 -X 选项指定请求方法,并使用 -d 选项传递请求数据。例如:

arduino 复制代码
curl -X POST -d 'username=admin&password=123456' https://api.example.com/login

在上面的示例中,我们发送了一个带有用户名和密码的 POST 请求到登录接口。

设置请求头

使用 -H 选项可以设置请求头。例如:

arduino 复制代码
curl -H 'Content-Type: application/json' https://api.example.com/users

在上面的示例中,我们设置了请求头的 Content-Type 为 application/json。

处理响应

cURL 默认将响应输出到标准输出。如果需要将响应保存到文件中,可以使用 -o 选项指定文件名。例如:

arduino 复制代码
curl -o response.json https://api.example.com/users

在上面的示例中,cURL 将响应保存到名为 response.json 的文件中。

压缩请求和解压响应

在发送 HTTP 请求时,服务器可以选择对传输的数据进行压缩,以减少数据量和提高传输效率。常见的压缩算法包括gzip和deflate。当使用 --compressed 选项时,cURL 将在请求中包含适当的头信息,指示服务器对响应进行压缩,并在接收到响应后自动解压缩。这样可以减少网络传输的时间和资源占用。

使用 --compressed 选项的示例:

arduino 复制代码
curl --compressed https://api.example.com/data

上述命令会发送一个带有压缩请求头的 GET 请求到 https://api.example.com/data,并在接收到响应后自动解压缩。

注意:不是所有的服务器都支持压缩功能,也不能保证所有的响应都会进行压缩。但是在支持压缩的服务器上,使用 --compressed 选项可以节省带宽和提高传输效率。

对服务器证书的验证

当使用 cURL 发送 HTTPS 请求时,默认情况下,cURL 会验证服务器的证书是否有效和可信。这是为了确保与服务器之间的安全通信,并防止中间人攻击。然而,有时服务器的证书可能无效或自签名,导致验证失败。在这种情况下,可以使用 --insecure 选项来绕过对服务器证书的验证。

使用 --insecure 选项的示例:

arduino 复制代码
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 会将指定文件上传到服务器。
  • Cookie 支持:使用 -b 和 -c 选项可以处理和发送 Cookie。
  • 超时设置:使用 -m 选项可以设置请求超时时间。
  • HTTPS 支持:cURL 默认支持 HTTPS,并具有 SSL/TLS 加密功能。

实现请求转crul

了解了基本用法,这个功能就好实现了

python 复制代码
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 函数对其进行转义,确保它被正确地识别为单个参数:

ini 复制代码
from shlex import quote
​
arg = "Hello World"
quoted_arg = quote(arg)
print(quoted_arg)

输出结果为:

arduino 复制代码
'Hello World'

quote 函数返回一个转义后的字符串,将字符串用引号括起来,表明其是一个整体的参数。这样,当拼接命令行参数时,在解析命令行时就能正确识别字符串中的空格,并将其作为单个参数处理。

最后

至此已经实现请求转curl的功能了,既方便自己也可以方便他人。提升效率的小妙招。

相关推荐
豆角焖肉22 分钟前
SpringBoot 集成腾讯 AI 人脸识别
人工智能·spring boot·后端·人脸识别·腾讯 ai·base64 图片
jack1868931 分钟前
Github Copilot 高效开发实战场景指南
python
AIFQuant31 分钟前
Python A股实时行情API接入:沪深股票数据与WebSocket推送实战
开发语言·python·websocket·金融·a股行情
小小龙学IT33 分钟前
Python Matplotlib 数据可视化库深度解析
python·信息可视化·matplotlib
付威202333 分钟前
如果你想拥有自己的 Agent,为什么值得从 rpi 开始
后端
小小张说故事1 小时前
Python 到底是值传递还是引用传递?一个赋值实验讲透,别再背结论了
python
Maxwin1 小时前
AI 生成的视频怎么局部修改?2026 年分章生成 Manim 代码的最新做法
python·aigc
可乐ea1 小时前
2000 个智能体把 Agent 重写成 Rust:编排流水线拆解
开发语言·后端·rust·多智能体协作·ai编程助手·智能体编排·rust重写
用户72757483196501 小时前
02-变量、常量和字符串:len("Hello, 世界") 为什么不是 9?
后端
SamDeepThinking1 小时前
CyclicBarrier的底层实现
java·后端·面试