引言
作为一个后端开发人员(Java/Go),curl (Client URL) 是你调试 API、排查网络问题和编写自动化脚本时最强大的瑞士军刀。接下来讲讲,如何使用curl ,以及实战如何使用curl
什么是curl
curl 的全称是 Client URL 。它的核心逻辑非常简单:向服务器发请求,把结果拿回来
当你只输入 URL 时,默认就是 GET 请求,结果直接打印在终端(stdout)。下面就是一条非常朴素的curl
bash
curl https://www.google.com
作为 Java/Go 开发者,你 90% 的场景是在调试 RESTful API。这里有三个必背参数:-X (方法) 、-H (头) 、-d (体)
curl
curl -X POST https://api.example.com/login \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "123"}'
curl的命令与用法
curl虽然可以自动生成,但理解核心参数对于手动微调至关重要。
最简单的一个curl格式如下:
bash
curl [options] [URL]
下面是一个命令表,可以对应着看:
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
| -X | --request | 指定 HTTP 方法 (GET, POST, PUT, DELETE) | -X POST |
| -H | --header | 设置请求头 (可多次使用) | -H "Content-Type: application/json" |
| -d | --data | 发送 POST 数据 (默认会设为 POST 方法) | -d '{"id": 1}' |
| -v | --verbose | 调试神器,显示详细的握手、Header 交互过程 | -v |
| -i | --include | 在输出结果中包含响应头 (HTTP Response Headers) | -i |
| -o | --output | 将输出保存到文件,而不是打印在屏幕上 | -o output.json |
| -L | --location | 跟随重定向 (比如 301/302 跳转) | -L |
| -k | --insecure | 允许连接不安全的 SSL (自签名证书) | -k |
如何生成curl命令?
我们一般不手写curl命令,因为手写容易出错,当然也有手写的时候(调试或者测接口速度)。但是我们一般怎么生成curl命令呢?
浏览器开发者工具 (最常用)
当你需要复现前端发起的请求,或者通过浏览器抓包调试时:
- 打开浏览器(Chrome/Edge),按
F12打开开发者工具。 - 切换到 Network (网络) 标签页。
- 在页面上触发一次请求。
- 在 Network 列表里右键点击该请求 -> Copy -> Copy as cURL (bash) )。
- 粘贴到你的终端或笔记中。
提示: 这样生成的命令包含所有的 Cookie 和 Header,非常适合用来在本地复现线上环境的请求。

Postman/ApiPost/ApiFox
在这些非常常用的后端调试工具中,也是可以生成curl的
用ApiPost来举例子

curl实战
IDE编辑器
不知道你知不知道idea里面也可以使用curl呢?非常简单好用,当我们不想使用调试工具的时候,可以在idea等IDE里面快速发起一次请求,反正我自己就非常喜欢在idea里面这样做,简洁简单高效!
1.可以编写一个.http后缀的文件,如下图所示

2.curl转换成http

3.然后就能生成一个http请求执行 
如果你是 Java 开发者,安装了 Spring 插件:
- 在你的
Controller代码行号旁边,会有一个小图标。 - 点击它可以直接生成该接口的 HTTP 请求文件,连粘贴
curl都省了
当然,IDEA 自带的底部 Terminal 就是一个完整的 Shell。
- 如果你在 Mac/Linux 上,直接敲
curl。 - 如果你在 Windows 上,IDEA 的 Terminal 默认通常是 PowerShell 或 CMD。建议将其配置为 Git Bash (File -> Settings -> Tools -> Terminal -> Shell path),这样你就能在 IDEA 内部无缝运行任何标准的 Linux
curl命令了。
排查接口问题
当线上服务出现"奇怪的问题"------比如偶尔超时、握手失败、接口过慢、或者返回莫名其妙的 400 错误时,curl 的深层能力就派上用场了
显微镜模式 (-v)
-v (verbose) 是调试神器。它会打印出通信的每一个细节:
*开头:curl 自身的日志(解析 IP、握手过程)。>开头:发送出去的数据(Request)。<开头:接收回来的数据(Response)。
场景: 排查 HTTPS 证书错误,或者确认反向代理(Nginx)是否修改了你的 Header
bash
curl -v https://api.example.com
忽略 SSL 证书 (-k)
在内网开发(特别是 Java Spring Boot 配置了自签名证书时),curl 会报错 SSL certificate problem。 加上 -k (insecure) 可以跳过证书验证
性能分析 (-w) ------ 后端必知
这是许多中高级开发都不知道的隐藏功能。当你需要分析接口到底慢在哪里 (是 DNS 慢?TCP 建连慢?还是 Java 代码处理慢?)时,可以使用 -w 自定义输出格式
创建一个格式文件 curl-fmt.txt:
txt
\n
DNS解析: %{time_namelookup} s
TCP建连: %{time_connect} s
SSL握手: %{time_appconnect} s
首包时间: %{time_starttransfer} s (TTFB)
总耗时: %{time_total} s
\n
执行命令:
Bash
curl -w "@curl-fmt.txt" -o /dev/null -s https://www.google.com
可能输出以下结果:
bash
DNS解析: 0.004 s
TCP建连: 0.020 s
SSL握手: 0.055 s
首包时间: 0.120 s <-- 这里慢说明服务器处理逻辑慢
总耗时: 0.121 s
反向转换:Curl -> Java/Go 代码
既然你可以生成 Curl,你也可以把 Curl 变回代码。这在对接第三方 API 时非常有用。
- 工具: curlconverter.com
- 用法: 粘贴
curl命令,它会自动生成标准的 Go (net/http) 或 Java (HttpClient/OkHttp) 代码。
总结
无论是新手还是老手,看了这篇文章或许你都能学到不少东西,或许学到了新东西?总之curl是一个非常实用的工具,简单且好用,实际开发与调试非常常用。