当前位置: 首页 > news >正文

body Param Query 三个 不同的入参 分别是什么意思 在前端 要怎么传 这三种不同的参数

在 NestJS 中,@Body()@Param()@Query() 用于处理不同类型的请求参数。以下是它们的含义及前端传递方式:


  1. @Body():请求体参数
    • 含义:用于获取请求体中的数据(如 POST/PUT 请求中提交的 JSON、表单数据等)。

• 前端传递方式:

• 发送 POST/PUT/PATCH 请求,将数据放在请求体中。

• JSON 示例(Axios):

```javascript
axios.post('/api/users', {name: 'John',age: 25
});
```

• 表单数据(如上传文件):

```javascript
const formData = new FormData();
formData.append('name', 'John');
formData.append('avatar', file);axios.post('/api/upload', formData, {headers: { 'Content-Type': 'multipart/form-data' }
});
```

  1. @Param():路由参数
    • 含义:获取 URL 路径中的动态参数(如 /users/:id 中的 id)。

• 前端传递方式:

• 直接在 URL 路径中传递参数,适用于 GET/DELETE 等请求。

• 示例(Axios):

```javascript
axios.get('/api/users/123'); // 匹配路由 `/users/:id`
```

• 后端获取方式:

```typescript
@Get(':id')
getUser(@Param('id') id: string) {// id = '123'
}
```

  1. @Query():查询参数
    • 含义:获取 URL 中 ? 后的键值对参数(如 /users?name=John&age=25)。

• 前端传递方式:

• 在 URL 后附加查询字符串,适用于 GET 请求。

• 示例(Axios):

```javascript
axios.get('/api/users', {params: { name: 'John', page: 2 }
});
// 实际 URL:/api/users?name=John&page=2
```

• 后端获取方式:

```typescript
@Get()
getUsers(@Query('name') name: string, @Query() query: any) {// name = 'John'// query = { name: 'John', page: '2' }
}
```

总结对比

参数类型装饰器传递位置常见场景示例 URL
Body@Body()请求体(Request Body)提交表单、JSON 数据POST /api/users
Param@Param()URL 路径中资源标识(如 ID)GET /api/users/123
Query@Query()URL 查询字符串过滤、分页、排序GET /api/users?name=John

掌握这些参数的使用方式,能够更灵活地处理不同场景下的数据传递需求。

在 NestJS 中,application/x-www-form-urlencodedapplication/jsonmultipart/form-data 是 HTTP 请求的 Content-Type,它们定义了请求体(@Body())的数据格式。而 @Param()@Query() 与请求体无关,只涉及 URL 路径参数和查询参数。以下是它们的联系与区别:


  1. application/x-www-form-urlencoded
    • 用途:传统的表单提交格式,数据会被编码为键值对(类似 URL 查询参数)。

• 与 @Body() 的关系:

• 数据通过 @Body() 接收。

• 前端传递时需设置 Content-Type: application/x-www-form-urlencoded

• 示例(Axios):

```javascript
axios.post('/api/submit', 'name=John&age=25', {headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
```

• NestJS 接收:

```typescript
@Post()
submitForm(@Body() formData: any) {// formData = { name: 'John', age: '25' }
}
```

  1. application/json
    • 用途:传递 JSON 格式的复杂数据(如嵌套对象、数组)。

• 与 @Body() 的关系:

• 数据通过 @Body() 接收,NestJS 会自动解析 JSON。

• 前端需设置 Content-Type: application/json

• 示例(Axios):

```javascript
axios.post('/api/data', { name: 'John', hobbies: ['coding', 'music'] }, {headers: { 'Content-Type': 'application/json' }
});
```

• NestJS 接收:

```typescript
@Post()
submitData(@Body() data: any) {// data = { name: 'John', hobbies: ['coding', 'music'] }
}
```

  1. multipart/form-data
    • 用途:上传文件或混合文本和文件数据(如表单包含文件输入)。

• 与 @Body() 的关系:

• 文本字段通过 @Body() 接收。

• 文件字段需结合 @UploadedFile()@UploadedFiles()(需使用 multer 中间件)。

• 示例(Axios):

```javascript
const formData = new FormData();
formData.append('name', 'John');
formData.append('avatar', file);axios.post('/api/upload', formData, {headers: { 'Content-Type': 'multipart/form-data' }
});
```

• NestJS 接收:

```typescript
@Post()
@UseInterceptors(FileInterceptor('avatar')) // 使用文件拦截器
uploadFile(@Body() formData: { name: string },@UploadedFile() file: Express.Multer.File
) {// formData.name = 'John'// file 包含上传的文件信息
}
```

  1. @Param()@Query()
    • 与 Content-Type 无关:

@Param() 从 URL 路径中获取参数(如 /users/:id)。

@Query() 从 URL 查询字符串中获取参数(如 /users?name=John)。

• 示例:

```javascript
// 前端请求
axios.get('/api/users/123?name=John');
```
```typescript
// NestJS 接收
@Get(':id')
getUser(@Param('id') id: string,  // id = '123'@Query('name') name: string // name = 'John'
) {}
```

总结对比

Content-Type数据位置适用场景NestJS 接收方式
application/x-www-form-urlencoded请求体(Body)简单键值对表单提交@Body()
application/json请求体(Body)复杂结构化数据(JSON)@Body()
multipart/form-data请求体(Body)文件上传或混合数据@Body() + @UploadedFile()
N/AURL 路径资源标识(如 ID)@Param()
N/AURL 查询字符串过滤、分页、排序参数@Query()

关键点

  1. @Body() 的形态由 Content-Type 决定:不同 Content-Type 影响请求体的解析方式。
  2. @Param()@Query() 独立于 Content-Type:它们只处理 URL 路径和查询参数。
  3. 文件上传需特殊处理:使用 multipart/form-data 时,需结合文件拦截器(如 multer)和 @UploadedFile()

相关文章:

  • git回退commit
  • Flink维表深度解析
  • python 里有冒泡排序吗
  • 【MQ篇】RabbitMQ之消费失败重试!
  • Python3:Jupyter Notebook 安装和配置
  • 基于大模型的急性化脓性阑尾炎全程诊疗预测与方案研究
  • 物联网相关
  • Golang | 搜索表达式
  • 巧记英语四级单词 Unit6-上【晓艳老师版】
  • Dijkstra 算法代码步骤[leetcode.743网络延迟时间]
  • Milvus如何实现关键词过滤和向量检索的混合检索
  • 信竞中的数学(一):质数
  • 典籍查询界面增加我的收藏查询功能
  • 极狐GitLab 议题权重有什么作用?
  • 【漫话机器学习系列】227.信息检索与数据挖掘中的常用加权技术(TF-IDF)
  • 论文检索相关网站
  • 制作一款打飞机游戏26:精灵编辑器
  • 【2025 最新前沿 MCP 教程 05】为 MCP 设置开发环境
  • 《AI大模型应知应会100篇》第37篇:Agent框架入门:让AI具备自主行动能力
  • 非结构化数据解析
  • 李强主持召开国务院常务会议
  • 葛兰西的三位一体:重提并复兴欧洲共产主义的平民圣人
  • 闲暇时间的“堕落”
  • 哈马斯同意释放剩余所有以方被扣押人员,以换取停火五年
  • 体坛联播|巴萨“三杀”皇马夺国王杯,陈妤颉破亚洲少年纪录
  • 俄联邦安全局:俄军高级官员汽车爆炸案嫌疑人已被捕