curl 入门:在终端里测试 API ​ curl 就是在终端里发 HTTP 请求的工具浏览器能做的事它都能做而且更灵活。这篇把 curl 的常用参数逐个拆清楚看完再回去看那些常用的API测试命令就不会有盲区了。一、curl 是什么​ curl发音 “see URL”是一个命令行工具用来向服务器发送 HTTP 请求并显示响应。几乎所有 Linux 和 macOS 系统都预装了Windows 10 以上也自带。​ 验证一下当前环境里有没有这个工具curl--version# curl 8.4.0 ...​ 能打出版本号就说明可以直接用。为什么不用浏览器测试浏览器只方便测 GET 请求在地址栏输入 URL。但登录接口是 POST 请求还要带 JSON 数据和自定义请求头。浏览器地址栏做不了这些事。curl 可以精确控制请求的每一个细节。二、最简单的用法curlhttp://localhost:5000/hello​ 就这样不加任何参数。curl 向这个 URL 发一个 GET 请求把服务器返回的内容打印到终端你好世界​ 和你在浏览器地址栏输入http://localhost:5000/hello然后回车是一回事。三、参数详解​ 例如复杂的 curl 命令可能长这样curl-XPOST http://localhost:5000/login\-HContent-Type: application/json\-d{username: zhangsan, password: 123456}​ 看着一大串其实就三个参数。先说一个前置知识命令末尾的\是换行续写符告诉终端这行没写完下一行还是同一条命令。去掉\写成一行也完全一样只是太长了不好看。​ 一条 curl 命令拆开就四个部分工具名 请求方法 请求头 请求体。3.1-X指定请求方法curl-XPOST http://localhost:5000/login​-X后面跟 HTTP 方法。不写-X默认是 GET。curlhttp://localhost:5000/hello# GET默认curl-XPOST http://localhost:5000/login# POSTcurl-XPUT http://localhost:5000/user/1# PUTcurl-XDELETE http://localhost:5000/user/1# DELETE​ 查看信息用 GET登录/注册/刷新 Token 用 POST。3.2-H设置请求头-HContent-Type: application/json​-H后面跟一个请求头格式是名字: 值。请求头是 HTTP 请求的元信息不是正文数据而是告诉服务器一些附加信息。常用的两个请求头Content-Type: application/json告诉服务器我发的请求体是 JSON 格式。没有这个头Flask 的request.json会返回None后面的代码就炸了。Authorization: Bearer eyJhbGciOi...带上 JWT Token。服务器从这个头里取出 Token 做验签。可以同时设多个请求头写多个-Hcurlhttp://localhost:5000/profile\-HAuthorization: Bearer eyJhbGciOi...\-HAccept: application/json3.3-d发送请求体-d{username: zhangsan, password: 123456}​-ddata后面跟要发送的数据放在 HTTP 请求体里。这就是服务器端request.json读到的内容。​ 注意如果使用-d显示设置请求体curl 会自动把请求方法改成 POST。所以下面两种写法效果一样# 显式写 -X POSTcurl-XPOST http://localhost:5000/login\-d{username: zhangsan}# 省略 -X POST-d 会自动触发 POSTcurlhttp://localhost:5000/login\-d{username: zhangsan}​ 但-d不会自动加Content-Type: application/json头。curl 默认的 Content-Type 是application/x-www-form-urlencoded表单格式不是 JSON。所以发 JSON 数据时-H Content-Type: application/json不能省省了服务器不知道你发的是 JSON。四、auth 系列里的四种典型用法​ 把上面学的参数组合起来使用。4.1 模式一GET 请求不带参数​ 最简单的情况获取公开数据curlhttp://localhost:5000/hello​ 不需要任何参数。4.2 模式二POST 请求带 JSON 数据​ 登录、注册、刷新 Token 都是这个模式提交数据给服务器curl-XPOST http://localhost:5000/login\-HContent-Type: application/json\-d{username: zhangsan, password: 123456}​ 三件套-X POST-H声明 JSON -d带数据。4.3 模式三GET 请求带 Token​ 访问受保护接口不用传数据但要证明身份curlhttp://localhost:5000/profile\-HAuthorization: Bearer eyJhbGciOi...​ 只需要一个-H带上 Token。4.4 模式四带 Cookie​ Session 方案里登录后服务器会在响应里设置 Cookie。后续请求要把 Cookie 带回去# 登录-c 把服务器返回的 Cookie 保存到文件curl-XPOST http://localhost:5000/login\-HContent-Type: application/json\-d{username: zhangsan, password: 123456}\-ccookies.txt# 后续请求-b 带上之前保存的 Cookiecurlhttp://localhost:5000/profile-bcookies.txt​-ccookie jar把响应里的 Cookie 保存到文件-bcookie从文件读 Cookie 带到请求里。五、四个实用技巧5.1 中文显示成 \uXXXX​ 如果你用 curl 测试 Flask 接口发现中文变成了这样{error:\u7f3a\u5c11 Token}​ 这不是 curl 的问题是 Flask 的jsonify默认把中文做了转义。在 Flask 代码里加一行就能解决fromflaskimportFlask appFlask(__name__)app.json.ensure_asciiFalse​ 加了之后返回的就是正常中文{error: 缺少 Token}。5.2 查看完整的请求和响应-v​ 加了-vverbosecurl 会打印完整的请求头和响应头方便排查问题curl-vhttp://localhost:5000/hello GET /hello HTTP/1.1 ← 请求行 Host: localhost:5000 ← 请求头 User-Agent: curl/8.x.x HTTP/1.1 200 OK ← 响应状态行 Content-Type: application/json ← 响应头 {message: 你好世界} ← 响应体​开头的是你发出去的开头的是服务器返回的。当接口返回的不是你预期的结果时先加-v看看请求和响应的细节。5.3 格式化 JSON 输出管道 python​ curl 返回的 JSON 默认是紧凑的一行不好看。管道给 Python 格式化一下curlhttp://localhost:5000/profile\-HAuthorization: Bearer eyJ...\|python-mjson.tool{message:你好zhangsan,role:user}​python -m json.tool是 Python 自带的 JSON 格式化工具不需要安装任何东西。5.4 静默模式-s​ curl 默认会显示下载进度条在脚本里会很吵。加-ssilent关掉curl-shttp://localhost:5000/hello六、总结参数作用例子无参数发 GET 请求curl http://localhost:5000/hello-X POST指定请求方法-X POST、-X PUT、-X DELETE-H ...设置请求头-H Content-Type: application/json-d {...}发送请求体数据-d {username: zhangsan}-c file保存 Cookie 到文件-c cookies.txt-b file从文件读 Cookie-b cookies.txt-v显示完整请求/响应细节排查问题时用-s静默模式不显示进度条脚本里用​ curl 的参数远不止这些记住最核心的组合-X定方法、-H加请求头、-d带数据。这三个覆盖了 90% 的 API 测试场景。