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

【NestJS】HTTP 接口传参的 5 种方式(含前端调用与后端接收)

【NestJS】HTTP 接口传参的 5 种方式

在前后端开发中,HTTP 接口的数据传输方式有多种,常见的有 query、url param、form-urlencoded、form-data、json
作为前端,我们不仅要知道如何调用,还要理解后端如何接收。今天我们用 NestJS 来演示这几种方式。


目录

  • 1. Query 参数
  • 2. URL Param 参数
  • 3. Form-Urlencoded
  • 4. Form-Data
  • 5. JSON
  • 总结

1. Query 参数

参数位置

  • 写在 URL ? 后面,多个参数用 & 分隔
  • 例如: GET /person?name=三十&age=18

前端调用

// axios 方式
axios.get('/api/person', {params: { name: '三十', age: 18 }
});// 或者直接拼接
axios.get('/api/person?name=三十&age=18');

后端定义

@Controller('api/person')
export class PersonController {@Get('/query')queryHandle(@Query('name') name: string, @Query('age') age: number) {return `[三十] queryHandle received name=${name}, age=${age}`;}
}

2. URL Param 参数

参数位置

  • 直接放在 URL 路径中
  • 例如:GET /person/18

前端调用

axios.get('/api/person/18');

后端定义

@Controller('api/person')
export class PersonController {@Get(':id') // 声明参数,定义多个参数: @Get(':id/:age/:name')urlParamHandle(@Param('id') id: string) { // @Param() 装饰器,取出参数注入到 Controller 方法中return `[三十] urlParamHandle received id=${id}`;}
}

注意点: 静态路由和动态路由定义顺序

静态路由(find、list、detail 等)要放在前面, 动态路由(:id、:slug 等)要放在后面 ,否则静态路由会被动态路由“吃掉”

@Controller('api/person')
export class PersonController {@Get('find') // 静态路由findAll() {return 'find all';}@Get(':id') // 动态路由getById(@Param('id') id: string) {return { id };}
}

3. Form-Urlencoded

参数位置

  • 写在 body 里,格式类似 name=三十&age=18

在这里插入图片描述

非英文字符和其他需要编码的字符可以通过 encodeURIComponent('三十') 编码或使用 query-string npm 包处理

  • Content-Type: application/x-www-form-urlencoded

前端调用

import qs from 'qs';const res = await axios.post('/api/person', qs.stringify({name: '三十',age: 18}), {headers: { 'content-type': 'application/x-www-form-urlencoded' }});

后端定义(NestJS)

// dto 是 data transfer object,用于封装传输的数据的对象
class CreatePersonDto {name: string;age: number;
}@Controller('api/person')
export class PersonController {@Post()formUrlEncodedHandle(@Body() createPersonDto: CreatePersonDto) { // 使用 @Body 装饰器,Nest 会解析请求体,然后注入到 dto 中。return `[三十] formUrlEncodedHandle received ${JSON.stringify(createPersonDto)}`}
}

4. Form-Data

参数位置

  • 也是写在 body 中

  • 使用 boundary 分隔,支持上传 文件

    在这里插入图片描述

  • Content-Type: multipart/form-data

前端调用

import axios from 'axios'
const fileInput = document.querySelector('#fileInput');async function formData() {const data = new FormData();data.set('name','三十');data.set('age', 18);data.set('file1', fileInput.files[0]);data.set('file2', fileInput.files[1]);axios.post('/api/person/file', data, {headers: { 'content-type': 'multipart/form-data' }});
}fileInput.onchange = formData;

后端定义

import {Body,UseInterceptors,UploadedFiles,
} from '@nestjs/common';
import { PersonService } from './person.service';
import { AnyFilesInterceptor } from '@nestjs/platform-express';@Controller('api/person')
export class PersonController {@Post('file')@UseInterceptors(AnyFilesInterceptor({dest: 'upload/', // 默认上传文件存放的目录}),)formDataHandle(@Body() createPersonDto: CreatePersonDto,@UploadedFiles() files: Array<Express.Multer.File>,) {console.log(files);return `[三十] formDataHandle received ${JSON.stringify(createPersonDto)}`;}
}

5. JSON

参数位置

  • 写在 body 中
  • Content-Type: application/json

前端调用

axios.post('/api/person', {name: '三十',age: 18
});

后端定义(NestJS)

@Controller('api/person')
export class PersonController {@Post()applicationJsonHandle(@Body() createPersonDto: CreatePersonDto) {return `[三十] applicationJsonHandle received ${JSON.stringify(createPersonDto)}`;}
}

总结

方式参数位置Content-Type前端调用示例NestJS 装饰器
QueryURL ? 后面无需特殊设置axios.get('/api?x=1')@Query
URL ParamURL 路径无需特殊设置axios.get('/api/1')@Param
Form-Urlencodedbody(字符串)application/x-www-form-urlencodedaxios.post(url, qs.stringify())@Body
Form-Databody(分隔符)multipart/form-dataaxios.post(url, formData)@Body + @UploadedFile
JSONbody(JSON)application/jsonaxios.post(url, { obj })@Body
http://www.dtcms.com/a/362884.html

相关文章:

  • 面试新纪元:无声胜有声,让AI成为你颈上的智慧伙伴
  • 基于YOLO8的番茄成熟度检测系统(数据集+源码+文章)
  • 利用飞算Java打造电商系统核心功能模块的设计与实现
  • Controller返回CompletableFuture到底是怎么样的
  • 【DSP28335 入门教程】定时器中断:为你的系统注入精准的“心跳”
  • 在windows平台oracle 23ai 数据库上使用bbed
  • zephyr设备树的硬件描述转换为c语言
  • 梳理一下 @types/xxx
  • 【Python语法基础学习笔记】竞赛常用标准库
  • 数据库的锁级别
  • Git在idea中的实战使用经验(一)
  • 深度学习之第五课卷积神经网络 (CNN)如何训练自己的数据集(食物分类)
  • SQLShift 实现Oracle 到 OceanBase 的存储过程转换初体验
  • FlowGPT-GPT提示词分享平台
  • 深入剖析Java设计模式之策略模式:从理论到实战
  • 【音视频】 WebRTC GCC 拥塞控制算法
  • 从Java全栈到前端框架:一场真实的技术面试实录
  • Leetcode二分查找(5)
  • 【算法】哈希表专题
  • 单元测试总结2
  • 【大前端】Vue 和 React 主要区别
  • dy图文批量下载
  • 【C++】模板(初阶)--- 初步认识模板
  • 从一行 var a = 1 开始,深入理解 V8 引擎的心脏
  • 【Linux我做主】进程退出和终止详解
  • 掌握设计模式--模板方法模式
  • 前缀树约束大语言模型解码
  • Ollama:本地大语言模型部署和使用详解
  • 【论文阅读】DeepSeek-LV2:用于高级多模态理解的专家混合视觉语言模型
  • ObjectMapper一个对象转json串为啥设计成注入?...