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

nestjs入门学习规划:https://blog.youkuaiyun.com/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.youkuaiyun.com/md/?articleId=103909617

请求方式装饰器

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

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

请求参数装饰器

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

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

### 如何在 NestJS 中处理 POST 请求 #### 创建服务层逻辑 为了保持良好的架构设计,通常会把业务逻辑放在服务层。通过添加 `@Injectable()` 装饰器来定义一个可注入的服务类[^1]。 例如创建书籍管理功能时,在 `/src/books/books.service.ts` 文件内定义如下代码: ```typescript import { Injectable, HttpException } from '@nestjs/common'; import { BOOKS } from '../mocks/books.mock'; @Injectable() export class BooksService { private books = BOOKS; async addBook(book): Promise<any> { try { this.books.push(book); return await Promise.resolve(this.books); } catch (error) { throw new HttpException('Failed to add book', 500); } } } ``` 此段代码实现了向图书列表中增加新书的功能,并返回更新后的整个列表[^5]。 #### 控制器接收并转发请求 控制器主要职责在于接受来自前端的HTTP请求并向外发送响应数据。对于POST请求而言,控制器需解析传入的数据体并通过依赖注入机制调用对应的服务实例完成具体操作[^3]。 下面是在 `/src/books/books.controller.ts` 定义用于处理新增书籍POST请求的方法示例: ```typescript import { Controller, Post, Body } from '@nestjs/common'; import { BooksService } from './books.service'; @Controller('books') export class BooksController { constructor(private readonly booksService: BooksService) {} @Post('/add') create(@Body() bookData) { return this.booksService.addBook(bookData); } } ``` 这里使用了装饰器 `@Post('/add')` 来指定路由路径以及允许的HTTP方法;而参数修饰符 `@Body()` 则用来获取请求主体内的JSON对象作为输入传递给服务层函数[^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值