从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 使用随机字符串))
    image
    • 支持文本字段(text/file)与文件(application/octet-stream)共存
    • value可以上传图片等文件,Postman 自动生成 Content-Type: multipart/form-data 并添加随机 ‌boundary‌

【2】binary(单文件流)

  • 定义:‌单一文件传输‌,每次请求仅能发送一个文件,无键值对元数据支持。Content-Type 必须匹配文件类型‌:如 image/png、application/pdf,否则服务器可能拒绝处理。
    image
    • 上传文件,请求方法只能为 ‌POST‌ 或 ‌PUT‌。

【3】x-www-form-urlencoded(URL编码表单)

  • 含义:数据按 key=value 格式排列,多个键值对以 & 连接,如 name=John&age=30。但是,仅支持‌文本,无法传输文件或二进制数据;体积有限制‌,URL 长度受服务器和浏览器约束(通常不超过 2048 字符)。
    image
    【4】raw(原始数据)
  • 含义:可发送任意格式的原始数据(JSON、XML、纯文本等),无预定义结构;Content-Type 必须显式指定‌,如 application/json、text/xml,否则服务器可能无法正确解析。优势‌是无额外元数据,适合高频 API 通信(如微服务间数据传输)
    image

二、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
posted @ 2025-04-30 17:04  不然我哥  阅读(51)  评论(0)    收藏  举报