从http请求到 curl调用的详细剖析
一、http请求
1、请求逻辑
【1】协议基础
- 基于tcp应用协议,采用请求——相应模式,数据按照文本形式组织(包括:请求头,请求方式,请求数据体,请求url)。具有无状态性,每次请求独立,服务器不保留上下文(依赖 Cookie/Session 维持状态)。
【2】数据传输过程 - 客户端:构造请求(方法 + URL + 头 + 体)→ 通过 TCP 发送至服务器
- 服务器端:解析请求 → 处理业务逻辑 → 返回响应(状态码 + 头 + 体)
【3】数据承载方式 - 请求头:传递元数据(如 Content-Type、Authorization,token [一般情况会在请求头里面] ),键值对结构,长度受限(约 4KB)
- 请求体:承载业务数据(如 JSON/表单),支持大体积传输(如文件上传)
2、常见的请求方式
【1】GET
- 用途:获取资源(如加载网页、查询数据)。
- 参数位置:通过 URL 查询字符串传递,多个参数用 & 链接(如 /api?id=123)。
- 特性:
- 幂等性:多次请求结果一致(仅读取数据)。
- 安全性:低(参数暴露于 URL 和日志)。
- 底层逻辑:
- 仅需 1 个 TCP 数据包传输(无请求体)。
- 可被浏览器缓存(URL 含完整参数)。
【2】POST
- 用途:创建资源或提交数据(如用户注册、文件上传)。
- 参数位置:请求体中传输(支持 JSON、表单等格式)。
- 特性:
- 幂等性:否(重复提交可能产生重复资源)。
- 安全性:高(数据加密后传输)。
- 底层逻辑:
- 需 2 个 TCP 数据包(先发头,再发体)。
- 默认不缓存,适合动态交互场景。
【3】PUT
- 用途:全量更新资源(如修改用户信息)。
- 参数位置:请求体中传递完整资源数据。
- 特性:
- 幂等性:是(多次执行结果一致)。
- 安全性:中(需完整数据覆盖原资源)。
- 对比 POST:
- PUT 需明确资源标识(如 /users/123),POST 由服务器生成 ID。
【4】DELETE
- 用途:删除指定资源(如订单、文件)。
- 参数位置:通过 URL 标识资源(如 /api/users/123)。
- 特性:
- 幂等性:是(重复删除无副作用)。
- 安全性:中(仅传递资源 ID)
3、请求体的几种格式
【1】form-data(多部分表单数据)
- 定义:以 multipart/form-data 格式传输数据,通过 boundary 分隔符 将多个字段分割成独立区块,每个区块可包含文本或二进制文件。(分隔符 boundary 由客户端或工具自动生成(如 Postman 使用随机字符串))
- 支持文本字段(text/file)与文件(application/octet-stream)共存
- value可以上传图片等文件,Postman 自动生成 Content-Type: multipart/form-data 并添加随机 boundary
【2】binary(单文件流)
- 定义:单一文件传输,每次请求仅能发送一个文件,无键值对元数据支持。Content-Type 必须匹配文件类型:如 image/png、application/pdf,否则服务器可能拒绝处理。
- 上传文件,请求方法只能为 POST 或 PUT。
【3】x-www-form-urlencoded(URL编码表单)
- 含义:数据按 key=value 格式排列,多个键值对以 & 连接,如 name=John&age=30。但是,仅支持文本,无法传输文件或二进制数据;体积有限制,URL 长度受服务器和浏览器约束(通常不超过 2048 字符)。
【4】raw(原始数据) - 含义:可发送任意格式的原始数据(JSON、XML、纯文本等),无预定义结构;Content-Type 必须显式指定,如 application/json、text/xml,否则服务器可能无法正确解析。优势是无额外元数据,适合高频 API 通信(如微服务间数据传输)
二、curl调用
1、curl参数解析
参数 | 作用 | 示例 |
---|---|---|
-X / --request | 指定 HTTP 请求方法(如 GET/POST/PUT/DELETE) | curl -X GET http://example.com |
-d / --data | 发送 POST/PUT 请求的请求体数据(默认 Content-Type: application/x-www-form-urlencoded) | curl -X POST -d "name=John&age=25" http://example.com |
-H / --header | 添加自定义请求头(如 Content-Type/Authorization) | curl -H "Content-Type: application/json" -H "Authorization: Bearer token123" http://example.com |
--data-binary | 从文件发送原始数据(如上传 JSON 文件) | curl -X POST --data-binary @data.json http://example.com |
-o / --output | 将响应保存到指定文件 | curl -o response.html http://example.com |
-O | 使用 URL 中的文件名保存响应(适用于下载文件) | curl -O http://example.com/file.zip |
-L / --location | 自动跟随重定向(如 301/302 跳转) | curl -L http://example.com |
-k / --insecure | 忽略 SSL 证书验证(测试环境用) | curl -k https://self-signed.badssl.com |
-u / --user | 指定用户名和密码(用于 Basic 认证) | curl -u admin:password http://example.com |
-v / --verbose | 显示详细传输信息(包括请求头、响应头、SSL 握手过程) | curl -v http://example.com |
--limit-rate | 限制下载速度(如 100K) | curl --limit-rate 100K http://example.com/file.zip |
-s / --silent | 静默模式(不显示进度和错误) | curl -s http://example.com |
-x / --proxy | 通过代理发送请求 | curl -x http://proxy-server:8080 http://example.com |
2、调用接口
【1】GET
#默认的方式是GET类型;下面这个和curl -X GET https://api.example.com/data是一样的
curl https://api.example.com/data
#加参数。 %20——是代表空格,curl不支持空格要转换编码格式
curl "https://api.example.com/search?q=hello%20world"
#配合-G和-d自动编码参数。等价于curl https://api.example.com/search?q=curl%20tutorial&page=2
curl -G https://api.example.com/search \
-d "q=curl tutorial" \
-d "page=2"
#含有请求头
curl -H "Authorization: Bearer token123" \
-H "User-Agent: MyApp/1.0" \
"https://api.example.com/protected?q=curl%20tutorial&page=2"
#自签名证书需要加 -k
curl -k https://internal-server.example.com
【2】POST
#发送表单数据(application/x-www-form-urlencoded)
curl -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=admin&password=123456" \
http://api.example.com/login
#发送 JSON 数据(application/json)
curl -X POST \
-H "Content-Type: application/json" \
-d '{"name": "Alice", "age": 30}' \
http://api.example.com/users
# 发送 JSON 文件内容
curl -X POST \
-H "Content-Type: application/json" \
-d "@data.json" \
http://api.example.com/upload
# 发送二进制文件(如图片)
curl -X POST \
-H "Content-Type: image/png" \
--data-binary "@image.png" \
http://api.example.com/upload
#上传文件表单(multipart/form-data)
curl -X POST \
-F "file=@/path/to/file.txt;type=text/plain" \
-F "description=This is a file" \
http://api.example.com/upload
#xml格式数据体
curl -X POST -d "serviceUrl=http://api.example.com/upload" -d "xml={"seqNo":1234567890123456,"orders":[{"userID":"$1","productID":"$2","startTime":"20250422170000","endTime":"20991231235959","operationType":1}]}" -d "submit=submit" 'http://api.example.com/upload/test/testUpdateHWOrderProduct.jsp'
【3】PUT
#简单的请求
curl -X PUT http://api.example.com/resource/123
#发送表单数据(application/x-www-form-urlencoded)
curl -X PUT \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "name=Alice&age=30" \
http://api.example.com/users/update
#发送 JSON 数据
curl -X PUT \
-H "Content-Type: application/json" \
-d '{"id": 1001, "status": "active"}' \
http://api.example.com/data/update
#从文件加载请求体
curl -X PUT \
-H "Content-Type: application/json" \
--data-binary "@update_data.json" \
http://api.example.com/config
#带 Cookie 认证的 PUT 操作
curl -X PUT \
-H "Cookie: session_id=3EFA3BD36FF71C3732232E3D7789D460" \
-d "enabled=true" \
http://api.example.com/settings/notifications
【4】DELETE
#携带查询参数
curl -X DELETE "http://api.example.com/data?category=temp&expired=true"
#添加认证与自定义头
curl -X DELETE \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-ID: $(uuidgen)" \
http://api.example.com/secured-resource/456
# JSON 格式
curl -X DELETE \
-H "Content-Type: application/json" \
-d '{"reason": "deprecated", "operator": "admin"}' \
http://api.example.com/records/789
# 表单编码
curl -X DELETE \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "confirm=true&forceDelete=1" \
http://api.example.com/files/101