五种HTTP数据传输方式

news2024/11/17 16:23:31

在前端开发过程中,后端主要提供 http 接口来传输数据,而这种数据传输方式主要有五种:

  • url param
  • query
  • form-urlencoded
  • form-data
  • json

下面就让我们一起来了解一下在Nest.js中如何使用这五种HTTP数据传输方式:

一,创建项目

使用nest new 创建一个nest的项目

nest new 项目名称

在根目录执行 nest g resource person 快速生成 person 模块的 crud 代码

nest g resource person

nest start --watch 启动 Nest 服务

这样一个有 person 的 crud 接口的服务就跑起来了

二,访问静态资源

api 接口跑通了,再支持下静态资源的访问

main.ts 是负责启动 Nest 的 ioc 容器的,调用下 useStaticAssets 来支持静态资源的请求:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { NestExpressApplication } from '@nestjs/platform-express';
async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  app.useStaticAssets('public', { prefix: '/static'});
  await app.listen(3000);
}
bootstrap();
//注意:要给 create 方法传入 NestExpressApplication 的泛型参数才有 useStaticAssets这些方法

 我们指定 prefix 为 static,然后在静态文件目录 public 下添加一个 html

api 接口和静态资源的访问都支持了,接下来就分别实现下 5 种前后端 http 数据传输的方式

三,url param

url param 是 url 中的参数,Nest 里通过 :参数名 的方式来声明(比如下面的 :id),然后通过 @Param(参数名) 的装饰器取出来注入到 controller:

@Controller('person') 的路由和 @Get(':id') 的路由会拼到一起,也就是只有 /person/xxx 的 get 请求才会走到这个方法。

接下来我们在前端页面中使用axios请求一下这个接口:

在页面中使用axios发起一个get请求,参数放在url中

<!DOCTYPE html>
<html lang="en">

<head>
  <script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script>
</head>

<body>
  <script>
    async function urlParam() {
      // 使用axios发起请求
      const res = await axios.get('/person/10086');
      console.log(res);
    }
    urlParam();
  </script>
</body>

 启动服务,在浏览器访问下:

控制台打印了服务端返回的消息,证明服务端拿到了通过 url param 传递的数据。

四,query

query 是 url 中 ? 后的字符串,需要做 url encode。

在 Nest 里,通过 @Query 装饰器来取:

注意:这个 find 的路由要放到 :id 的路由前面,因为 Nest 是从上往下匹配的,如果放在后面,那就匹配到 :id 的路由了。

接下来就在前端页面中去请求这个接口:

<!DOCTYPE html>
<html lang="en">

<head>
  <script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script>
</head>

<body>
  <script>
    async function urlParam() {
      // 使用axios发起请求
      const res = await axios.get('/person/find',{
        params:{
          name:'张三',
          age:25
        }
      });
      console.log(res);
    }
    urlParam();
  </script>
</body>

 参数通过 params 指定,axios 会做 url encode,不需要自己做。

让我们测试一下,服务端成功接受了我们通过 query 传递的数据。

 上面两种(url param、query)是通过 url 传递数据的方式,下面 3 种是通过 body 传递数据

五,form urlencoded

form urlencoded 是通过 body 传输数据,其实是把 query 字符串放在了 body 里。

用 Nest 接收的话,使用 @Body 装饰器,Nest 会解析请求体,然后注入到 dto 中。

dto 是 data transfer object,就是用于封装传输的数据的对象:

前端代码使用 post 方式请求,指定 content type 为 application/x-www-form-urlencoded,用 qs 做下 url encode

<!DOCTYPE html>
<html lang="en">

<head>
  <script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script>
  <script src="https://unpkg.com/qs@6.10.2/dist/qs.js"></script>
</head>

<body>
  <script>
    async function formUrlEncoded() {
      const res = await axios.post('/person', Qs.stringify({
        name: '张三',
        age: 24
      }), {
        headers: { 'content-type': 'application/x-www-form-urlencoded' }
      });
      console.log(res);
    }

    formUrlEncoded();
  </script>
</body>

测试一下,服务器成功接收到了数据并返回:

六,json

json 需要指定 content-type 为 application/json,内容会以 JSON 的方式传输,后端代码同样使用 @Body 来接收,不需要做啥变动。form urlencoded 和 json 都是从 body 取值,Nest 内部会根据 content type 做区分,使用不同的解析方式。

前端代码使用 axios 发送 post 请求,默认传输 json 就会指定 content type 为 application/json,不需要手动指定

<!DOCTYPE html>
<html lang="en">

<head>
  <script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script>
</head>

<body>
  <script>
    async function json() {
      const res = await axios.post('/person', {
        name: '张三',
        age: 24
      });
      console.log(res);
    }

    json();
  </script>
</body>

 测试下,服务端成功接收到了通过 json 传递的数据

 七,form data

json 和 form urlencoded 都不适合传递文件,想传输文件要用 form data

Nest 解析 form data 使用 FilesInterceptor 的拦截器,用 @UseInterceptors 装饰器启用,然后通过 @UploadedFiles 来取。非文件的内容,同样是通过 @Body 来取。

import { AnyFilesInterceptor } from '@nestjs/platform-express';
import { CreatePersonDto } from './dto/create-person.dto';

@Controller('api/person')
export class PersonController {
  @Post('file')
  @UseInterceptors(AnyFilesInterceptor({
      dest: 'uploads/'
  }))
  body2(@Body() createPersonDto: CreatePersonDto, @UploadedFiles() files: Array<Express.Multer.File>) {
    console.log(files);
    return `received: ${JSON.stringify(createPersonDto)}`
  }
}

这一步需要

npm i -D @types/multer

 前端代码使用 axios 发送 post 请求,指定 content type 为 multipart/form-data

<!DOCTYPE html>
<html lang="en">
<head>
    <script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script>
</head>
<body>
    <input id="fileInput" type="file" multiple/>
    <script>
        const fileInput = document.querySelector('#fileInput');

        async function formData() {
            const data = new FormData();
            data.set('name','张三');
            data.set('age', 24);
            data.set('file1', fileInput.files[0]);
            data.set('file2', fileInput.files[1]);

            const res = await axios.post('/person/file', data, {
                headers: { 'content-type': 'multipart/form-data' }
            });
            console.log(res);     
        }

        fileInput.onchange = formData;
    </script>
</body>
</html>

 file input 指定 multiple 可以选择多个文件。

测试一下:

服务端接收到了 name 和 age:

去服务器控制台看下:

可以看到,服务器成功的接收到了我们上传的文件

八,总结

我们用 axios 发送请求,使用 Nest 后端服务,实现了 5 种 http/https 的数据传输方式:

其中前两种是 url 中的:

  • url param: url 中的参数,Nest 中使用 @Param 来取
  • query:url 中 ? 后的字符串,Nest 中使用 @Query 来取

后三种是 body 中的:

  • form urlencoded: 类似 query 字符串,只不过是放在 body 中。Nest 中使用 @Body 来取,axios 中需要指定 content type 为 application/x-www-form-urlencoded,并且对数据用 qs 或者 query-string 库做 url encode
  • json: json 格式的数据。Nest 中使用 @Body 来取,axios 中不需要单独指定 content type,axios 内部会处理。
  • form data:主要用于传输文件,Nest 中要使用 FilesInterceptor 来处理其中的 binary 字段,用 @UseInterceptors 来启用,其余字段用 @Body 来取。axios 中需要指定 content type 为 multipart/form-data,并且用 FormData 对象来封装传输的内容。

这 5 种 http 的传输数据的方式覆盖了绝大多数开发场景

下一章我们一起深入学习一下Nest的文件上传,大文件切片上传。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1838981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【送模板】5张图,帮你轻松搞懂OKR工作法

OKR是目标与关键结果法的缩写&#xff0c;OKR运用在工作中就是强调对业务进行逻辑思考&#xff0c;找到目标与关键结果之间的因果关系。这种因果关系的是否准确决定我们努力的价值。 OKR是一种高效的目标管理方法。“O”就是object&#xff0c;目标的意思&#xff0c;“kr”就…

项目的打包

一:打包到微信小程序 1)vscode打包 2)在微信小程序开发工具中打开路径,上传. 疑问:为什么pnpm bulid:mp-weixin用于打包,pnpm dev:mp-weixin也可生成对应路径下的文件?? 打包的是没有热重载,且打包体积更小. 二:条件编译 vscode可以打包成能在不同平台上运行的代码.但是有…

08--LVS网站高并发解决方案

前言&#xff1a;LVS&#xff0c;工作稳定&#xff0c;抗负载能力强&#xff0c;属于运维基础&#xff0c;这里将lvs两种模式的部署方式在这里记录一下&#xff0c;并在示例完成后&#xff0c;补充一下基础概念。本章不可避免的涉及到一些网络方面知识&#xff0c;会形象简单的…

被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?

引言&#xff1a;在使用 MyBatis 进行数据库操作时&#xff0c;#{} 和 ${} 的区别是面试中常见的问题&#xff0c;对理解如何在 MyBatis 中安全有效地处理 SQL 语句至关重要。正确使用这两种占位符不仅影响应用的安全性&#xff0c;还涉及到性能优化。 题目 被拷打已老实&…

富唯智能打造的AGV搬运机器人转运机器人

AGV搬运机器人&转运机器人 AGV搬运机器人&#xff0c;内部搭载ICD系列核心控制器&#xff0c;拥有不同的移载平台&#xff0c;负载最高可达 1000kq;重复精度高达5mm;支持 Wi-Fi漫游&#xff0c;实现更稳健的网络数据交互;无轨化激光 SLAM 导航&#xff0c;配合 3D 避障相机…

2024年仿真建模与多媒体技术国际学术会议(ISMMT 2024)

全称&#xff1a;2024年仿真建模与多媒体技术国际学术会议&#xff08;ISMMT 2024&#xff09; 会议网址:http://www.ismmt.com 会议时间&#xff1a;最终通知见官网&#xff01; 会议地点: 深圳 投稿邮箱&#xff1a;ismmtsub-conf.com投稿标题&#xff1a;ArticleTEL。投稿时…

什么是“基准测试集”呢?

基准测试集有三部分构成&#xff1a;DocumentSet、QuerySet、RelevantJudgement。在比较多个IR系统孰优孰劣的时候&#xff0c;要做的就是&#xff1a;使用统一的DecumentSet建立索引&#xff0c;然后使用统一的QuerySet去进行查询&#xff0c;最后使用统一的judgement进行评判…

web爬虫笔记:js逆向案例九(某多多 anti_content参数)补环境流程

web爬虫笔记:js逆向案例九(某多多 anti_content参数)补环境流程 一、目标网站:aHR0cHM6Ly9tb2JpbGUueWFuZ2tlZHVvLmNvbS8= 二、接口分析 1、快速定位加密位置(通过搜索/cells/hub/v3快速定位到加密js文件) 2、通过分析可知&#

HSP_09章 模块和包

文章目录 P102 模块的常见应用场景分析P103 模块的基本介绍1. 导入模块import2.实例演示 P104 自定义模块1.自定义模块的介绍:2. 注意事项和使用细节2.1 使用 __name__可以避免模块中测试代码的执行2.2 使用__all__可以控制 import *时,哪些功能被导入&#xff0c;注意: import…

禅道身份认证绕过漏洞(QVD-2024-15263)复现

禅道项目管理系统在开源版、企业版、旗舰版的部分版本中都存在此安全漏洞。攻击者可利用该漏洞创建任意账号实现未授权登录。 1.漏洞级别 高危 2.漏洞搜索 fofa: title"禅道"3.影响范围 v16.x < 禅道 < v18.12 &#xff08;开源版&#xff09; v6.x <…

Vue40-vueComponent构造函数

一、组件的本质&#xff1a;VueComponent构造函数 组件的本质是&#xff1a;构造函数 二、每一次调用vue.extend&#xff0c;返回的事一个全新的 VueComponent VueComponent的源码如下&#xff1a; 三、组件中的this 组件中的this是VueComponent实例对象&#xff0c;结构和vm…

通过视频网站传播的RecordBreaker窃密木马分析

1 攻击活动概览 近期&#xff0c;安天CERT监测到通过视频网站进行传播的攻击活动。攻击者窃取订阅者数量超过10万的视频创作者账号&#xff0c;发布与破解版热门软件相关的演示视频&#xff0c;诱导受害者下载RecordBreaker窃密木马。 RecordBreaker窃密木马是Raccoon…

基于DMAIC的SMT TX插件撞伤不良改善

在快速发展的电子制造领域&#xff0c;SMT&#xff08;表面贴装技术&#xff09;已经成为电子产品组装的核心技术之一。然而&#xff0c;SMT TX插件撞伤不良问题一直是制约生产效率与产品质量的瓶颈。本文将基于DMAIC&#xff08;定义、测量、分析、改进、控制&#xff09;方法…

注意力机制简介

为了减少计算复杂度&#xff0c;通过借鉴生物神经网络的一些机制&#xff0c;我们引入了局部连接、权重共享以及汇聚操作来简化神经网络结构。神经网络中可以存储的信息量称为网络容量。一般来讲&#xff0c;利用一组神经元来存储信息的容量和神经元的数量以及网络的复杂度成正…

重生奇迹MU 探秘奇幻世界

"探秘奇幻世界&#xff0c;成就无尽荣耀&#xff01;欢迎来到重生奇迹MU&#xff0c;一个永不落幕的游戏乐园。在这里&#xff0c;你可以尽情挑战各种困难&#xff0c;发掘神秘宝藏&#xff0c;还可与来自世界各地的玩家一起创造无尽的历史。为了帮助你更好地探索游戏世界…

用Vue3和ApexCharts打造交互式3D折线图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue.js 中使用 ApexCharts 构建交互式折线图 应用场景 ApexCharts 是一个功能强大的 JavaScript 库&#xff0c;用于创建交互式、可定制的图表。在 Vue.js 中&#xff0c;它可以通过 vue3-apexcharts 插件轻松…

IPython大揭秘:神奇技巧让你掌握无敌编程力量!

IPython技巧 基础技巧文件操作技巧输入输出技巧魔术命令技巧调试技巧程序性能优化技巧输入输出重定向技巧魔术命令控制技巧自定义显示格式技巧多线程多进程技巧异常处理技巧数据可视化技巧自定义魔术命令技巧安装扩展包技巧Jupyter Notebook集成技巧文档显示技巧代码块执行技巧…

2024 年 Python 基于 Kimi 智能助手 Moonshot Ai 模型搭建微信机器人(更新中)

注册 Kimi 开放平台 Kimi&#xff1a;https://www.moonshot.cn/ Kimi智能助手是北京月之暗面科技有限公司&#xff08;Moonshot AI&#xff09;于2023年10月9日推出的一款人工智能助手&#xff0c;主要为用户提供高效、便捷的信息服务。它具备多项强大功能&#xff0c;包括多…

【Orange Pi 5与Linux内核编程】-理解Linux内核中的container_of宏

理解Linux内核中的container_of宏 文章目录 理解Linux内核中的container_of宏1、了解C语言中的struct内存表示2、Linux内核的container_of宏实现理解3、Linux内核的container_of使用 Linux 内核包含一个名为 container_of 的非常有用的宏。本文介绍了解 Linux 内核中的 contain…

【软件工程】【22.10】p2

关键字&#xff1a; 软件开发基本途径、初始需求发现技术、UML表达事物之间关系、RUP需求获取基本步骤、项目过程建立涉及工作、项目规划过程域的意图和专用目标 判定表、分支覆盖、条件覆盖 三、简答 四、应用 这里条件覆盖有待商榷