curl 携带post请求
curl 携带post请求
curl 是携带命令行里的瑞士军刀,POST 请求则是请求它最常用的功能之一。别管你是携带调试 API 还是爬数据,绕不开这行命令。请求
最基础的携带用法长这样:curl -X POST https://api.example.com/login。但光这样发出去,请求服务器大概率回你一个 400——因为你啥数据都没带。携带POST 的请求核心是请求体,你得告诉服务器你想干什么。携带
带表单数据
最常见的请求场景是模拟网页表单提交。用 -d 参数,携带curl 会自动把内容编码成 application/x-www-form-urlencoded 格式:
curl -d "username=admin&password=123456" https://api.example.com/login 注意,请求这里 -X POST 可以省略。携带因为一旦你用了 -d,请求curl 默认就会发 POST 请求。携带我见过不少新手多写个 -X POST,倒也没错,就是冗余。真正要注意的是,-d 里的数据如果有特殊字符(比如 & 或空格),得先 URL 编码,否则服务器会解析错乱。
发 JSON 数据
现在接口基本都是 JSON 格式了。你得手动指定 Content-Type 头,不然服务器可能不认:
curl -H "Content-Type: application/json" -d '{ "name":"张三","age":30}' https://api.example.com/users 有个坑:单引号里如果包含单引号,得用双引号转义,或者干脆反过来。我习惯外层用单引号,内层 JSON 用双引号,最省事。要是 JSON 特别长,写成一行看着费劲,可以用 --data @file.json 从文件读取,既清晰又避免转义问题。
文件上传
POST 不光是发文本。传文件用 -F 参数,它会自动设置成 multipart/form-data 格式:
curl -F "file=@/path/to/photo.jpg" -F "caption=海边日落" https://api.example.com/upload 这个 @ 符号是关键,它告诉 curl 后面是文件路径,不是普通字符串。如果你要同时传多个文件,写多个 -F 就行。注意,文件路径里如果有空格,得用引号包住整个 @ 部分。
调试 POST 请求
最烦人的是请求发出去了,服务器返回 500,但你又不知道错在哪。这时候加 -v 参数,curl 会把整个请求头和响应头都打印出来:
curl -v -H "Content-Type: application/json" -d '{ "key":"value"}' https://api.example.com/test 输出里你能看到实际发送的 HTTP 报文,连 Host、User-Agent 都一目了然。如果嫌 -v 输出太啰嗦,用 -w "\n%{ http_code}" 只显示状态码,适合写脚本时判断成功失败。
还有个实用技巧:用 --trace-ascii - 把整个通信过程以 ASCII 格式打印,比 -v 更详细,能看到二进制内容(比如文件上传时的 boundary 分隔符)。调试某些诡异问题时,这招能救命。
带 Cookie 和 Header
很多接口要求登录态。先发一个 POST 拿 Cookie,再用 -c 保存到文件,后续请求用 -b 带上:
curl -c cookies.txt -d "user=admin&pass=123" https://api.example.com/login curl -b cookies.txt https://api.example.com/profile 有些接口需要自定义 Header,比如签名验证。用 -H 可以叠加多个:
curl -H "Authorization: Bearer token123" -H "X-Request-ID: abc123" -d '{ }' https://api.example.com/data 最后提个醒:-d 和 -F 不能混用。混了的话 curl 会报错,或者你得到的行为完全不符合预期。要发混合数据(既有文本字段又有文件),全用 -F,文本字段不带 @ 即可。
curl 的 POST 就这点事儿。记不住参数没关系,多用几次自然就顺了。真到了生产环境,建议先拿 --dry-run 看看生成的请求长啥样,再实际发送——这参数不发送数据,只打印将发送的内容,省得手滑把测试数据写进生产库。