likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 10

前言

当我们使用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 上可以执行以下命令:

sudo apt-get install curl

Windows

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

macOS

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

基本用法

发送 GET 请求

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

curl URL

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

curl https://api.example.com/users

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

发送 POST 请求

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

实现请求转crul

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

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的功能了,既方便自己也可以方便他人。提升效率的小妙招。

转载自:https://juejin.cn/post/7272843829555691561
评论
请登录