fastapi: 同样是post方法提交数据,postman软件params标签下输入键值对和body标签下的form-data有什么区别?fastapi接收参数时的区别?

一、 Postman 中两种提交方式的本质区别

 
1. Params(查询参数 / Query Parameters)
  • 传输位置:拼接在 URL 链接 后面。例如你在 Params 输入 id=10,Postman 实际发出的请求 URL 会变成:http://api.com
  • 数据限制:只能传输纯文本,且由于浏览器和服务器对 URL 长度有限制(通常为 2KB-8KB),无法传输超大数据。
  • 安全性极低。参数完全暴露在 URL 中,会被浏览器历史记录、服务器日志(如 Nginx 日志)明文记录。绝不能用于传输密码或敏感 Token。
2. Body -> form-data(表单数据)
  • 传输位置:放在 HTTP 的 Request Body(请求体) 中,Content-Type 为 multipart/form-data
  • 数据限制:支持多媒体/二进制数据(如上传图片、文件),且没有大小限制。
  • 安全性:相对较高。参数在请求体中,不会暴露在 URL 或系统日志里(配合 HTTPS 传输时内容会被完全加密)。

 

说明:即使是 POST 方法,也可以通过 URL 传参。

二,代码:

@router.post("/test-params")
def handle_params(
    # 接收 Postman 的 Params 标签下的数据
    product_id: Annotated[int, Query(description="从URL拼接参数中获取")]
):
    return {"source": "Params", "product_id": product_id}

@router.post("/test-form")
def handle_form(
    # 接收 Postman 的 Body -> form-data 标签下的数据
    product_id: Annotated[int, Form(description="从HTTP请求体表单中获取")]
):
    return {"source": "Form-Data", "product_id": product_id}
 

三,测试效果:

查看请求url的不同:
可以看到第2个url报了422,因为接收参数时用的form类型
INFO:     127.0.0.1:53974 - "POST /api/products/test-params?product_id=1234 HTTP/1.1" 200 OK
INFO:     127.0.0.1:45244 - "POST /api/products/test-form?product_id=1234 HTTP/1.1" 422 Unprocessable Entity
INFO:     127.0.0.1:49226 - "POST /api/products/test-form HTTP/1.1" 200 OK

params:注意url上有参数

image

form:

image
 
 
posted @ 2026-06-24 22:14  刘宏缔的架构森林  阅读(7)  评论(0)    收藏  举报