curl使用

本文介绍curl工具的常见用法,使用 https://httpbin.org/ 这个网站作为 Http Server 进行测试

常见用法

官网:https://curl.se/

-X:指定HTTP请求方法

最简单的GET请求

[root@localhost ~]# curl https://httpbin.org/get
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.61.1",
    "X-Amzn-Trace-Id": "Root=1-697b7bb9-72d9720837c940ea3b545d06"
  },
  "origin": "223.104.83.109",
  "url": "https://httpbin.org/get"
}

不同的请求方式,使用 -X 指定请求方法即可

# POST请求
curl -X POST https://httpbin.org/post
# PUT请求
curl -X PUT https://httpbin.org/put
# DELETE请求
curl -X DELETE https://httpbin.org/delete

-H (Header):设置请求头

设置请求头

curl -H "X-My-Header: CoolValue" https://httpbin.org/headers

-d (Data):设置请求体,--data

# 提交用户名和密码(普通表单格式)
curl -d "username=admin&password=123" https://example.com/login

# 提交 JSON 数据(通常需要配合 -H)
curl -H "Content-Type: application/json" \
     -d '{"id": 101, "name": "Gemini"}' \
     https://api.example.com/user

发送 -d '{"name": "test"}' 时,服务器并不一定知道这是一段 JSON。如果不加 -H "Content-Type: application/json",服务器可能会把它当成普通文本,导致解析失败。

带参数请求组合

请求即Payloads

# JSON: Content-Type
curl -X POST https://httpbin.org/post \
     -H "Content-Type: application/json" \
     -d '{"username": "jdoe", "active": true}'

# 表单:application/x-www-form-urlencoded
curl -X POST https://httpbin.org/post \
     -d "name=John+Doe" \
     -d "[email protected]"

# 上传文件: multipart/form-data
curl -X POST https://httpbin.org/post -F "[email protected]"

# body比较大,不方便加在命令行,将POST body放进文件里读取
curl -X POST https://httpbin.org/post \
     -H "Content-Type: application/json" \
     -d @data.json

设置Cookies

curl -b "session_id=12345; preference=dark_mode" https://httpbin.org/cookies

# 访问接口,并将Cookies保存到文件
curl -c cookies.txt https://httpbin.org/cookies/set/mycookie/value

# 将Cookies保存到文件进行读取
curl -b cookies.txt https://httpbin.org/cookies

重定向检测

先简单介绍下HTTP 重定向的原理:
平时用浏览器输入一个网址时,很多时候你看到的页面并不是你输入的那个地址,而是经过了一次或多次后台换站。当访问一个网址A时,服务器可能会返回一个 301(永久移动)或 302(临时移动)的状态码,并告诉浏览器:“你要找的东西不在我这,去 URL B 看看吧。”

HTTP 302/303 的 MDN 解释:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/302
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/303

如果不加 -L: curl 收到服务器发的跳转指令(301/302)后,会直接停下来,给你看一段提示信息(甚至什么都不显示),它不会自动去访问 URL B。如果加上 -L: curl 就会像浏览器一样“聪明”。它看到跳转指令后,会自动抓取 URL B 的内容。如果 B 又跳到了 C,它会一直追下去,直到抓取到最终那个能正常显示的页面内容(状态码 200 OK)。

举个直观的例子:访问百度
在 Google 浏览器输入 baidu.com。服务器会反馈:“为了安全,请去 https://www.baidu.com (注意多了 s 和 www )。”,在浏览器中会自动跳转:你根本感觉不到,地址栏会自动变长,页面随后加载出来。实际测试的时候,你可能看到浏览器地址栏还是baidu.com ,选中地址栏的文本时也还是baidu.com ,但是把它复制出来就变成了 https://www.baidu.com/ 。(不同浏览器测试上述行为可能不一样,在google 中测试建议先删掉 baidu 这个搜索引擎,否则回车时使用的地址可能是搜索引擎设置的关键词匹配后的地址,干扰测试)

现在来用curl测试,命令 curl http://baidu.com 结果如下

[root@localhost ~]# curl http://baidu.com
<a href="http://www.baidu.com/">Moved Permanently</a>.

在命令行用 curl -L http://baidu.com: 它会先发现搬家了,然后自动跑去新家,把最终的搜索页面代码抓取回来显示给你。

[root@localhost ~]# curl -L http://baidu.com
# 结果是一段html文本

保存到 html 中打开就是百度的搜索页面
image

curl 的重定向相关用法

  1. 自动跟随重定向 (-L)
    让 curl 像浏览器一样,发现页面跳转就自动跟过去,直到抓取到最后的网页内容,使用 -L(或 --location)参数。
  2. 查看重定向的详细过程 (-v 或 -I,大写 i)
    可以知道请求是如何从 A 跳到 B,再跳到 C 的,可以结合使用以下参数:
    -I (大写 i): 仅查看 HTTP 响应头(Header),不下载网页内容。这能让你看到 Location 字段。
    -v (verbose): 显示完整的请求和响应过程(包括握手信息)。

例如:只看重定向的路径和状态码:curl -IL http://baidu.com

[root@localhost ~]# curl -IL http://baidu.com
HTTP/1.1 301 Moved Permanently
Location: http://www.baidu.com/
Date: Sun, 01 Feb 2026 04:47:34 GMT
Content-Type: text/plain; charset=utf-8

HTTP/1.1 200 OK
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Length: 0
Content-Type: text/html
Pragma: no-cache
Server: bfe
Date: Sun, 01 Feb 2026 04:47:34 GMT

Windows 下的 curl

Windows 下PowerShell中的curl实际调用的是Invoke-WebRequest

https://stackoverflow.com/questions/47364244/curl-vs-invoke-webrequest

posted @ 2026-01-29 23:41  vonlinee  阅读(13)  评论(0)    收藏  举报