You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

REST API参数位置决策:Header、Body、URL、Query选择及对象CRUD场景答疑

嘿,这个问题绝对是REST API设计里绕不开的经典困惑,我踩过不少坑,也看过很多成熟项目的最佳实践,今天就给你掰扯清楚:

一、通用决策原则:先搞懂每个位置的定位

首先得明确每个参数位置的核心用途,别乱塞:

Header:放「请求元数据」,和资源本身无关的内容

Header是用来描述请求的“属性”,不是资源数据本身,比如:

  • 身份验证Token:标准做法是放在Authorization头里(比如Bearer {your-token}
  • 内容类型:Content-Type: application/json告诉服务器请求体是JSON格式
  • 其他元信息:比如语言偏好Accept-Language、缓存控制Cache-Control、跨域相关的Origin
  • 核心原则:敏感信息(比如Token)优先放Header,避免暴露在URL/Query里

URL:放「资源标识符」,用来定位资源

REST是面向资源的,URL就是资源的“地址”,所以:

  • 唯一标识资源的ID:比如用户ID、订单ID,必须放在URL路径里,比如/users/{userId}/orders/{orderId}
  • 资源的层级关系:比如/users/{userId}/orders,体现用户下的订单资源
  • 核心原则:URL要简洁、语义化,一眼就能看出要操作哪个资源

Query参数:放「可选的筛选/控制参数」,用来调整返回结果

Query是对资源请求的“补充说明”,不影响资源的身份,比如:

  • 过滤条件:/users?role=admin筛选管理员用户
  • 分页参数:/users?page=2&size=10获取第二页数据
  • 排序规则:/users?sort=createdAt,desc按创建时间倒序
  • 搜索关键词:/users?search=john搜索名字含john的用户
  • 核心原则:非必填、用来调整返回结果的参数,都丢Query里

Body:放「资源的核心数据」,尤其是创建/更新的内容

Body是用来传递资源本身的结构化数据,适合内容较多或需要格式化的场景:

  • 创建资源时的字段:POST请求里的新用户信息{"name": "Alice", "email": "alice@example.com"}
  • 更新资源时的字段:PUT/PATCH请求里的修改内容
  • 核心原则:GET请求尽量别用Body(虽然HTTP规范允许,但很多客户端/服务器不支持,容易踩坑)
二、针对你的场景:带ID、字段、Token的对象API,分请求方法拆解

假设你的API是操作某个业务对象(比如ProductUser),支持GET/PUT/POST/DELETE,参数位置这么放就对了:

GET请求(获取单个/列表对象)

  • Token:放在Header的Authorization头里
  • 单个对象的ID:放在URL路径,比如/api/products/{productId}(定位具体产品)
  • 列表请求的筛选/分页/排序:全部放在Query参数,比如/api/products?category=electronics&page=1&size=20
  • 注意:绝对别用GET传Body,遵守行业约定,避免兼容性问题

POST请求(创建新对象)

  • Token:放在Header的Authorization头里
  • 新对象的字段(除了ID,一般ID由服务端生成):放在Body里,比如{"name": "无线耳机", "price": 999, "stock": 100}
  • URL只需要资源集合路径:/api/products(不需要ID,因为对象还没创建)

PUT请求(更新整个对象)

  • Token:放在Header的Authorization头里
  • 要更新的对象ID:放在URL路径,比如/api/products/{productId}(明确要更新哪个产品)
  • 更新的完整字段:放在Body里,比如{"name": "新款无线耳机", "price": 899, "stock": 50}(PUT是幂等操作,建议传完整对象数据)

DELETE请求(删除对象)

  • Token:放在Header的Authorization头里
  • 要删除的对象ID:放在URL路径,比如/api/products/{productId}
  • 一般不需要Body,如果有特殊删除条件(比如需要验证用户密码),可以把验证信息放在Header或Query,尽量别用Body保持简洁
最后补几个避坑提醒
  1. 敏感信息(Token、密码等)绝对不能放URL/Query,会被日志、浏览器历史记录下来,严重不安全
  2. 幂等性:PUT/DELETE是幂等操作(重复请求结果一致),参数放URL/Header更符合特性;POST是非幂等的,用Body传创建数据更合理
  3. 可读性:URL别塞太多参数,复杂的资源数据放Body,筛选控制放Query,让API一眼就能看懂

内容的提问来源于stack exchange,提问作者Bugs Buggy

火山引擎 最新活动