nestjs[controller控制层各种请求方式及参数获取方式]

nestjs入门学习规划:https://blog.csdn.net/lxy869718069/article/details/114028195

前要说明

接收一个接口请求,如:‘/xxx’,通过了各种拦截、中间件、异常过滤等处理之后进入了controller层,然后就需要对前端传递的数据进行获取。
本例以hello-world项目为例,了解controller如何获取各种前端参数以及设置请求方式

控制器简介

在这里插入图片描述
其实理解起来就是:我给前端一个’/xxx’的(get/post/put/delete)请求接口,然后我后端controller层配置一个(@Get(‘xxx’)/@Post(‘xxx’)/@Put(‘xxx’)/@Delete(‘xxx’))的接收方法,一但前端调用了,就触发这个装饰器配置相关方法,同时方法参数中使用(@Request/@Body/@Query/@Param…)等装饰器获取传递过来的参数。

参数获取方式

常用的从前端那里获取的参数的方式也就几种。
1.前端人员什么也不传直接获取数据
例如:localhost:3001/app/userlist
在这里插入图片描述
getUserlist()是属于@Get(‘userlist’)的方法,当请求/app/userlist的时候实际作用就是调用这个方法,一般这个方法里面使用的service中的调用逻辑(当前先不管)。
使用postman请求结果:
在这里插入图片描述
2.前端人员传递的参数在query里面
例如:localhost:3001/app/userinfo?id=‘1’
在这里插入图片描述
这里需要使用@Query装饰器来获取内容,其返回的是一个由?id='1’所构成的对象{id:‘1’}
使用postman请求结果:
在这里插入图片描述
3.前端人员传递的是动态参数
例如:localhost:3001/app/paraminput,其中这个paraminput是一个动态参数(其值不确定,有可能是paraminput 或者test或者其他)由用户来自定义传递

在这里插入图片描述
这里要注意的是:
@Get()本身是没有命名的,他的命名由传入进来的@Param字段的值来决定的,因此会出现localhost:3000/app/paraminput,而paraminput是一个动态值,也可以是localhost:3000/app/test之类的,要区分好和Query的区别
使用postman请求结果:
在这里插入图片描述
4.前端人员传递的参数在body里面
例如:localhost:3001/app/userinfo
注意:这里的接口名称和Get的接口名称是一样的,但是只要是请求方式不同,那么就会是两个接口
请求方式:post
请求数据:在body里面
准备工作
1.了解请求头:请求头里面通常会带有这里请求的一些基本信息,当前我们主要了解其中两个内容
1.Content-Type含义及其作用
一个正确的HTTP请求应当具备状态行、请求头、消息主体,数据本身的编码方式由Content-Type声明,请求的客户端和服务端必须遵守同一个编码方式才能正确解析数据的内容
类型1:Content-Type:application/x-www-form-urlencoded—常用于原生的 form 表单提交
类型2:Content-Type:multipart/form-data —常用于文件传输
类型3:Content-Type:application/json —以Json格式编码数据体,方便传输结构化数据(键值对),广泛用于 ajax 请求
类型4:…
以上三种常用于项目开发中,至于其他的特殊需求可以根据需要使用
在这里插入图片描述
其中@Body 用于获取post请求体中的参数内容,@Headers用于获取请求头内容如下:
在这里插入图片描述
使用postman请求结果:
这里是(Content-Type:application/x-www-form-urlencoded)请求头,其他方式也一样。
在这里插入图片描述
在这里插入图片描述
5.补充:前端人员传递xml数据的获取方式(文件上传formdata获取方式类似)
首先要了解的内容:
nestjs当前默认服务器是express,当不考虑换服务器的时候,我们得知道
express 默认只支持:
application/json,
application/x-www-form-urlencoded,
multipart/form-data。
这三种请求方式的内容。
然后还得知道express获取数据的实质是请求体调用on监听data方法来获取如:

@Post('userxml')
  getUserXML(@Request() req): string {
    // @Request()获取express原生请求体,监听data方法拿到req数据
    req.on('data', reqs => {
      console.log(reqs);
    })
    return '';
  }
postman输入测试内容

在这里插入图片描述
在这里插入图片描述
执行效果如下
在这里插入图片描述
可以看出内容已经传递过来了,但是确是一些乱码。因此我们需要插件的协助来转换获取到的reqs数据:

npm install --save xml2js

使用如下:
在这里插入图片描述
在这里插入图片描述
可以看出打印已经有json形势的结果了,具体转换规则可以了解下xml2js这个包
提示:这里仅仅只是一种局部实现方式,也可以将这个内容注册成全局的,或者配置直接让express支持xml请求数据。可根据实际需求调整。
中间件实现方式参考:https://editor.csdn.net/md/?articleId=103909617

请求方式装饰器

@Get()
@Post()
@Put()
@Delete()

这里列了几个常用的请求方式装饰器,但是在开发中用的最多的还是@Get()和@Post()这两个,其他的有时间自己了解吧。

请求参数装饰器

在这里插入图片描述
请求参数装饰器就是用于获取参数的各类装饰器。常用的有:@Query()、@Body()、@Headers()、@Param(‘param’)等。

form/data传递方式参考文件上传

NestJS ,可以使用 class-validator 库进行请求参数校验。下面是一个简单的示例代码: 1. 首先,您需要安装 class-validator 和 class-transformer 库: ``` npm install class-validator class-transformer ``` 2. 在您的 DTO(Data Transfer Object)类定义请求参数的验证规则。例如,假设您有一个 UserDto 类来处理用户注册请求: ```typescript import { IsNotEmpty, IsEmail } from 'class-validator'; export class UserDto { @IsNotEmpty() username: string; @IsNotEmpty() @IsEmail() email: string; @IsNotEmpty() password: string; } ``` 3. 在您的控制使用这个 DTO 类,并使用 @Body() 装饰器将请求体绑定到 DTO 对象: ```typescript import { Controller, Post, Body } from '@nestjs/common'; import { UserDto } from './user.dto'; @Controller('users') export class UserController { @Post() createUser(@Body() userDto: UserDto) { // 这里的 userDto 将自动根据定义的验证规则进行校验 // 如果校验失败,NestJS 会抛出 BadRequestException 异常 // 您可以在这里处理校验失败的逻辑 // 如果校验通过,可以继续处理用户注册逻辑 // ... } } ``` 在上述示例,我们使用了 IsNotEmpty 和 IsEmail 等验证装饰器来定义验证规则。您可以根据需要使用其他 class-validator 提供的装饰器来定义更复杂的验证规则。 请注意,NestJS 默认情况下会使用 class-transformer 库对请求体进行转换。这意味着,如果您在请求接收的是 JSON 字符串,NestJS 会自动将其转换为 DTO 对象。如果您不想使用这种转换,请在 main.ts 文件禁用它: ```typescript import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule, { bodyParser: false }); await app.listen(3000); } bootstrap(); ``` 以上就是在 NestJS 进行请求参数校验的基本方法。您可以根据具体的需求进一步扩展和定制验证规则。希望能对您有所帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值