每个Web开发者都应该知道的基本curl命令

curl新手?从我们的初学者指南开始:使用curl发送HTTP请求
在调试API或测试端点时,你需要快速、可靠且无需复杂设置的工具。虽然像Postman这样的GUI工具有其用武之地,但curl命令为Web开发者提供了无与伦比的速度和灵活性来进行命令行测试。本参考指南涵盖了你日常使用的基本curl命令,从基本的GET请求到高级身份验证模式。
关键要点
- 首先掌握基本的GET和POST请求——它们涵盖了80%的API测试需求
- 始终包含适当的Content-Type和Authorization头部
- 调试连接问题时使用详细模式(
-v
) - 在生产环境中设置超时以防止脚本挂起
- 将响应保存到文件以进行分析和比较
- 使用
-L
跟随重定向以获得完整的请求链 - 将curl与jq等工具结合使用以更好地处理JSON
API测试的基本curl命令
1. 基本GET请求
最简单的curl命令从任何URL获取数据:
curl https://api.github.com/users/octocat
这会返回原始JSON响应。为了更好的可读性,可以通过JSON格式化器传输输出:
# macOS/Linux
curl https://api.github.com/users/octocat | jq
# Windows (需要安装jq)
curl https://api.github.com/users/octocat | jq
使用场景: 快速API端点测试、检查服务是否响应或为脚本获取数据。
2. 带JSON数据的POST请求
现代API期望JSON负载。以下是正确发送它们的方法:
curl -X POST \
-H "Content-Type: application/json" \
-d '{"name":"John Doe","email":"john@example.com"}' \
https://api.example.com/users
对于复杂的JSON,将其保存到文件并引用:
curl -X POST \
-H "Content-Type: application/json" \
-d @user-data.json \
https://api.example.com/users
使用场景: 创建资源、提交表单或使用结构化数据测试POST端点。
3. 添加自定义头部
API通常需要特定的头部来进行身份验证、内容协商或自定义参数:
curl -H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
-H "User-Agent: MyApp/1.0" \
https://api.example.com/protected-resource
使用场景: API身份验证、设置用户代理、指定响应格式或添加自定义应用程序头部。
4. 跟随重定向
默认情况下,curl在重定向时停止。使用-L
自动跟随重定向:
curl -L https://bit.ly/shortened-url
限制重定向跳转以防止无限循环:
curl -L --max-redirs 5 https://example.com
使用场景: 测试短链接、跟随API重定向或检查应用程序中的重定向链。
5. 将响应保存到文件
与其让终端杂乱无章,不如直接将响应保存到文件:
# 使用原始文件名保存
curl -O https://example.com/data.json
# 使用自定义文件名保存
curl -o my-data.json https://api.example.com/export
# 分别保存头部和正文
curl -D headers.txt -o response.json https://api.example.com/data
使用场景: 下载文件、保存API响应以供分析或归档测试结果。
6. 基本身份验证
许多API仍然使用基本身份验证。安全地处理它:
curl -u username:password https://api.example.com/secure-endpoint
为了更好的安全性,让curl提示输入密码:
curl -u username https://api.example.com/secure-endpoint
使用场景: 测试内部API、访问开发端点或使用传统身份验证系统。
7. 用于调试的详细输出
当请求失败或行为异常时,详细模式显示确切发生的情况:
curl -v https://api.example.com/endpoint
这会显示:
- 发送的请求头部
- 接收的响应头部
- SSL/TLS握手详细信息
- 连接信息
使用场景: 调试失败的请求、理解API行为或排除SSL问题。
8. 设置超时
通过设置连接和总超时来防止请求挂起:
# 10秒连接超时,30秒总超时
curl --connect-timeout 10 --max-time 30 https://slow-api.example.com
使用场景: 测试慢速端点、防止脚本挂起或在不可靠网络中工作。
9. 表单数据提交
对于传统表单提交或文件上传:
# 标准表单数据
curl -X POST -d "username=john&password=secret" https://example.com/login
# 文件上传
curl -F "file=@document.pdf" -F "description=Important doc" https://example.com/upload
使用场景: 测试表单端点、上传文件或处理多部分数据。
10. 包含响应头部
在输出中查看头部和正文:
# 在响应中包含头部
curl -i https://api.example.com/endpoint
# 仅头部(用于检查状态码)
curl -I https://api.example.com/endpoint
使用场景: 检查响应码、调试缓存问题或检查API头部。
Web开发者的高级curl命令
处理Cookie
在请求间维护会话状态:
# 将cookie保存到文件
curl -c cookies.txt https://example.com/login
# 使用保存的cookie
curl -b cookies.txt https://example.com/dashboard
代理配置
通过代理路由请求进行测试或安全:
curl --proxy http://proxy.company.com:8080 https://api.example.com
SSL证书处理
对于使用自签名证书的开发环境:
# 跳过证书验证(仅开发环境)
curl -k https://localhost:8443/api
# 使用自定义CA证书
curl --cacert custom-ca.pem https://secure-api.example.com
性能和自动化技巧
批量操作
高效测试多个端点:
# 在一个命令中使用多个URL
curl https://api1.example.com https://api2.example.com
# 从文件中读取
curl -K url-list.txt
输出格式化
让响应更具可读性:
# 使用jq美化JSON
curl -s https://api.example.com/data | jq '.'
# 提取特定字段
curl -s https://api.example.com/users | jq '.[] | .name'
错误处理
让curl在HTTP错误时静默失败以用于脚本:
curl --fail --silent https://api.example.com/endpoint || echo "Request failed"
curl与其他工具:何时使用什么
使用curl的场景:
- 快速命令行测试
- 脚本和自动化
- CI/CD流水线集成
- 最小系统资源使用
使用Postman的场景:
- 复杂请求集合
- 团队协作
- 可视化响应检查
- 高级测试工作流
使用HTTPie的场景:
- 偏好更可读的语法
- JSON优先的API测试
- 更好的默认格式化
常见问题
使用limit-rate选项来限制请求,例如限制为每秒200千字节。你也可以在脚本中使用sleep命令在请求之间添加延迟。
-d标志将数据作为表单编码发送,这是POST请求的默认方式。-F标志将数据作为多部分表单数据发送,这在上传文件时是必需的。
可以。为此,发送一个包含GraphQL查询的JSON负载的POST请求。
使用详细模式检查SSL握手,如果需要可以使用insecure标志临时跳过证书验证,或者使用cacert选项指定自定义证书颁发机构。
对于基于令牌的身份验证,传递带有令牌的Authorization头部。对于基本身份验证,使用用户名和密码选项。为了提高安全性,将敏感值存储在环境变量中并在命令中引用它们。
结论
这些curl命令构成了命令行API测试的基础。从基本的GET和POST请求开始,然后随着需求的增长逐步整合头部、身份验证和高级功能。关键是为最常见的模式建立肌肉记忆——一旦你能够快速从终端测试端点,你会发现自己在开发和调试过程中不断使用curl。
Web开发者的curl命令为高效的API测试和调试提供了基础。这些命令在所有平台上都能工作,并无缝集成到开发工作流中,使它们成为任何Web开发者工具包中的必备工具。