精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

進階全棧的第一步:能實現這五種接口

開發
如果你想成為一名全棧工程師,那么不能滿足于會寫這幾種方式的前端代碼,后端代碼也得會寫。所以,這篇文章我們來實現下前后端代碼,把整個鏈路打通,真正掌握它們。

上一篇文章我們總結了網頁開發的 5 種 http/https 傳輸數據的方式:

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

這 5 種方式覆蓋了開發中絕大多數場景,掌握好這些就能輕松應對各種 http/https 數據通信的需求。

如果你想成為一名全棧工程師,那么不能滿足于會寫這幾種方式的前端代碼,后端代碼也得會寫。

所以,這篇文章我們來實現下前后端代碼,把整個鏈路打通,真正掌握它們。

前端使用 axios 發送請求,后端使用 Nest.js 作為服務端框架。

準備工作

首先我們要把 Nest.js 服務端跑起來,并且支持 api 接口、靜態頁面。

Nest.js 創建一個 crud 服務是非常快的,只需要這么幾步:

  • 安裝 @nest/cli,使用 nest new xxx 創建一個 Nest.js 的項目,
  • 在根目錄執行 nest g resource person 快速生成 person 模塊的 crud 代碼
  • npm run start 啟動 Nest.js 服務

這樣一個有 person 的 crud 接口的服務就跑起來了,是不是非常快。

服務跑起來以后是這樣的

打印出了有哪些接口可以用,可以在 postman 或者瀏覽器來測試下:

api 接口跑通了,再支持下靜態資源的訪問:

main.ts 是負責啟動 Nest.js 的 ioc 容器的,在腳手架生成的代碼的基礎上,調用下 useStaticAssets 就可以支持靜態資源的請求。

  1. async function bootstrap() { 
  2.   const app = await NestFactory.create<NestExpressApplication>(AppModule); 
  3.   app.useStaticAssets(join(__dirname, '..''public'), { prefix: '/static'}); 
  4.   await app.listen(3000); 
  5. bootstrap(); 

我們指定 prefix 為 static,然后再靜態文件目錄 public 下添加一個 html:

  1. <html> 
  2. <body>hello</body> 
  3. </html> 

重啟服務,然后瀏覽器訪問下試試:

api 接口和靜態資源的訪問都支持了,接下來就分別實現下 5 種前后端 http 數據傳輸的方式吧。

url param

url param 是 url 中的參數,Nest.js 里通過 :參數名 的方式來聲明,然后通過 @Param(參數名) 的裝飾器取出來注入到 controller:

  1. @Controller('api/person'
  2. export class PersonController { 
  3.   @Get(':id'
  4.   urlParm(@Param('id') id: string) { 
  5.     return `received: id=${id}`; 
  6.   } 

前端代碼就是一個 get 方法,參數放在 url 里:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script> 
  5. </head> 
  6. <body> 
  7.     <script> 
  8.         async function urlParam() { 
  9.             const res = await axios.get('/api/person/1'); 
  10.             console.log(res);             
  11.         } 
  12.         urlParam(); 
  13.    </script> 
  14. </body> 

啟動服務,在瀏覽器訪問下:

控制臺打印了服務端返回的消息,證明服務端拿到了通過 url param 傳遞的數據。

通過 url 傳遞數據的方式除了 url param 還有 query:

query

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

在 Nest.js 里,通過 @Query 裝飾器來取:

  1. @Controller('api/person'
  2. export class PersonController { 
  3.   @Get('find'
  4.   query(@Query('name'name: string, @Query('age') age: number) { 
  5.     return `received: name=${name},age=${age}`; 
  6.   } 

前端代碼同樣是通過 axios 發送一個 get 請求:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script> 
  5. </head> 
  6. <body> 
  7.     <script> 
  8.         async function query() { 
  9.             const res = await axios.get('/api/person/find', { 
  10.                 params: { 
  11.                     name'光'
  12.                     age: 20 
  13.                 } 
  14.             }); 
  15.             console.log(res);             
  16.         } 
  17.         query(); 
  18.    </script> 
  19. </body> 
  20. </html> 

參數通過 params 指定,axios 會做 url encode,不需要自己做。

然后測試下:

服務端成功接受了我們通過 query 傳遞的數據。

上面兩種(url param、query)是通過 url 傳遞數據的方式,下面 3 種是通過 body 傳遞數據。

html urlencoded

html urlencoded 是通過 body 傳輸數據,其實是把 query 字符串放在了 body 里,所以需要做 url encode:

用 Nest.js 接收的話,使用 @Body 裝飾器,Nest.js 會解析請求體,然后注入到 dto 中。

dto 是 data transfer object,就是用于封裝傳輸的數據的對象:

  1. export class CreatePersonDto { 
  2.     name: string; 
  3.     age: number; 
  1. import { CreatePersonDto } from './dto/create-person.dto'
  2.  
  3. @Controller('api/person'
  4. export class PersonController { 
  5.   @Post() 
  6.   body(@Body() createPersonDto: CreatePersonDto) { 
  7.     return `received: ${JSON.stringify(createPersonDto)}` 
  8.   } 

前端代碼使用 post 方式請求,指定 content type 為 application/x-www-form-urlencoded,用 qs 做下 url encode:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script> 
  5.     <script src="https://unpkg.com/qs@6.10.2/dist/qs.js"></script> 
  6. </head> 
  7. <body> 
  8.     <script> 
  9.         async function formUrlEncoded() { 
  10.             const res = await axios.post('/api/person', Qs.stringify({ 
  11.                 name'光'
  12.                 age: 20 
  13.             }), { 
  14.                 headers: { 'content-type''application/x-www-form-urlencoded' } 
  15.             }); 
  16.             console.log(res);   
  17.         } 
  18.  
  19.         formUrlEncoded(); 
  20.     </script> 
  21. </body> 
  22. </html> 

測試下:

服務端成功的接收到了數據。

其實比起 form urlencoded,使用 json 來傳輸更常用一些:

json

json 需要指定 content-type 為 application/json,內容會以 JSON 的方式傳輸:

后端代碼同樣使用 @Body 來接收,不需要做啥變動。form urlencoded 和 json 都是從 body 取值,Nest.js 內部會根據 content type 做區分,使用不同的解析方式。

  1. @Controller('api/person'
  2. export class PersonController { 
  3.   @Post() 
  4.   body(@Body() createPersonDto: CreatePersonDto) { 
  5.     return `received: ${JSON.stringify(createPersonDto)}` 
  6.   } 

前端代碼使用 axios 發送 post 請求,默認傳輸 json 就會指定 content type 為 application/json,不需要手動指定:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script> 
  5. </head> 
  6. <body> 
  7.     <script> 
  8.         async function json() { 
  9.             const res = await axios.post('/api/person', { 
  10.                 name'光'
  11.                 age: 20 
  12.             }); 
  13.             console.log(res);      
  14.         } 
  15.         json(); 
  16.     </script> 
  17. </body> 
  18. </html> 

測試下:

服務端成功接收到了通過 json 傳遞的數據。

json 和 form urlencoded 都不適合傳遞文件,想傳輸文件要用 form data:

form data

form data 是用 -------- 作為 boundary 分隔傳輸的內容的:

Nest.js 解析 form data 使用 FilesInterceptor 的攔截器,用 @UseInterceptors 裝飾器啟用,然后通過 @UploadedFiles 來取。非文件的內容,同樣是通過 @Body 來取。

  1. import { AnyFilesInterceptor } from '@nestjs/platform-express'
  2. import { CreatePersonDto } from './dto/create-person.dto'
  3.  
  4. @Controller('api/person'
  5. export class PersonController { 
  6.   @Post('file'
  7.   @UseInterceptors(AnyFilesInterceptor()) 
  8.   body2(@Body() createPersonDto: CreatePersonDto, @UploadedFiles() files: Array<Express.Multer.File>) { 
  9.     console.log(files); 
  10.     return `received: ${JSON.stringify(createPersonDto)}` 
  11.   } 

前端代碼使用 axios 發送 post 請求,指定 content type 為 multipart/form-data:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script> 
  5. </head> 
  6. <body> 
  7.     <input id="fileInput" type="file" multiple/> 
  8.     <script> 
  9.         const fileInput = document.querySelector('#fileInput'); 
  10.  
  11.         async function formData() { 
  12.             const data = new FormData(); 
  13.             data.set('name','光'); 
  14.             data.set('age', 20); 
  15.             data.set('file1', fileInput.files[0]); 
  16.             data.set('file2', fileInput.files[1]); 
  17.  
  18.             const res = await axios.post('/api/person/file', data, { 
  19.                 headers: { 'content-type''multipart/form-data' } 
  20.             }); 
  21.             console.log(res);      
  22.         } 
  23.  
  24.          
  25.         fileInput.onchange = formData; 
  26.     </script> 
  27. </body> 
  28. </html> 

file input 指定 multiple 可以選擇多個文件。

測試下:

服務端接收到了 name 和 age:

去服務器控制臺看下:

可以看到,服務器成功的接收到了我們上傳的文件。

全部代碼上傳到了 github:https://github.com/QuarkGluonPlasma/nestjs-exercize

總結

我們用 axios 發送請求,使用 Nest.js 起后端服務,實現了 5 種 http/https 的數據傳輸方式:

其中前兩種是 url 中的:

url param:url 中的參數,Nest.js 中使用 @Param 來取

query:url 中 ? 后的字符串,Nest.js 中使用 @Query 來取

后三種是 body 中的:

form urlencoded:類似 query 字符串,只不過是放在 body 中。Nest.js 中使用 @Body 來取,axios 中需要指定 content type 為 application/x-www-form-urlencoded,并且對數據用 qs 做 url encode

json:json 格式的數據。Nest.js 中使用 @Body 來取,axios 中不需要單獨指定 content type,axios 內部會處理。

form data:通過 ----- 作為 boundary 分隔的數據。主要用于傳輸文件,Nest.js 中要使用 FilesInterceptor 來處理,用 @UseInterceptors 來啟用。其余部分用 @Body 來取。axios 中需要指定 content type 為 multipart/form-data,并且用 FormData 對象來封裝傳輸的內容。

這 5 種 http/https 的傳輸數據的方式覆蓋了絕大多數開發場景,如果你想進階全棧,能夠提供這 5 種接口是首先要做到的。

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2021-01-15 18:17:06

網絡協議分層

2011-07-25 14:17:46

BSMIT運維北塔

2015-06-02 11:42:00

Cloud FoundAzure

2009-01-18 08:49:04

Java入門JDK

2019-11-20 10:54:46

無密碼身份驗證網絡安全

2012-07-11 16:43:14

飛視美

2013-01-15 09:17:11

2010-07-01 13:44:12

2021-08-24 05:07:25

React

2018-02-10 11:24:39

Python數據程序

2020-07-22 22:10:34

互聯網物聯網IOT

2012-08-30 11:14:11

云計算虛擬化

2020-11-17 14:55:36

亞馬遜云科技遷移

2024-02-26 10:08:01

2020-11-11 07:09:05

隔離直播系統

2017-09-19 09:36:55

思科服務

2013-04-03 09:22:14

虛擬化網絡虛擬化

2010-11-05 10:32:50

云應用程序規劃

2010-01-21 10:29:54

java認證

2009-02-02 23:18:25

虛擬化VMware整合評估
點贊
收藏

51CTO技術棧公眾號

美女性感视频久久| 首页亚洲中字| 亚洲永久精品国产| 久久国产精品久久精品国产| 国产天堂第一区| 婷婷精品进入| 亚洲精品久久久久久久久久久久久| 国产欧美一区二区三区久久人妖 | 成人免费黄色在线| 国产精品av电影| 欧美成人精品激情在线视频| 你懂的视频欧美| 欧美一级欧美三级| 最新中文字幕免费视频| 第一中文字幕在线| 中文字幕av一区二区三区免费看| 97国产在线观看| 免费一级suv好看的国产网站| 欧美片第一页| 一区二区三区中文字幕电影| 日韩和欧美的一区二区| 丁香社区五月天| 啄木系列成人av电影| 91麻豆精品国产91久久久久| 欧美激情成人网| 黄色成人在线网| 亚洲私人黄色宅男| 日本在线成人一区二区| 日本国产在线观看| 国产精品一区不卡| 成人动漫网站在线观看| 中文字幕天堂在线| 亚洲永久字幕| 在线精品国产欧美| 最新在线黄色网址| 台湾佬成人网| 午夜电影网一区| 国产伦精品一区二区三区视频黑人| 波多野结衣视频观看| 中文精品在线| 91超碰caoporn97人人| 久久久久久久久久一区二区三区| 欧美电影三区| 中文字幕亚洲无线码a| 欧美偷拍一区二区三区| 亚洲激情77| 精品一区二区三区三区| 女同性恋一区二区三区| eeuss国产一区二区三区四区| 欧美一区二区在线视频| www.51色.com| 精品三级久久久| 日韩欧美一区中文| 97人人模人人爽人人澡| 国产高清精品二区| 欧美一区二区久久| 成人高清在线观看视频| 精品视频成人| 日韩美女视频在线| 成人一区二区三区仙踪林| 狠狠躁少妇一区二区三区| 2023国产一二三区日本精品2022| 国产传媒欧美日韩| 少妇精品高潮欲妇又嫩中文字幕| a级精品国产片在线观看| 精品午夜一区二区三区| 欧洲一级在线观看| 中文字幕第一区二区| 亚洲欧洲日韩精品| 天天操天天舔天天干| 99r国产精品| 欧洲亚洲一区二区| 日本视频在线播放| 一区二区三区中文免费| 你真棒插曲来救救我在线观看| 麻豆mv在线观看| 色视频一区二区| 91.com在线| 国产日韩电影| 亚洲成av人片一区二区三区| 国产精品国产亚洲精品看不卡| 国产高清中文字幕在线| 91福利社在线观看| 涩多多在线观看| 老司机凹凸av亚洲导航| 这里只有精品视频| 色在线观看视频| 亚洲在线成人| 国产免费一区二区三区在线观看| 国产草草影院ccyycom| 99riav久久精品riav| 亚洲综合欧美日韩| 91禁在线看| 欧美色爱综合网| 久久av一区二区三| 国产剧情一区| 久久99久久99精品免观看粉嫩| 天天综合天天干| 国产综合自拍| 国产成人av网| 亚洲欧美高清视频| 国产免费成人在线视频| 免费观看亚洲视频| 丝袜美腿一区| 欧美精品一区二区三区高清aⅴ | 一区二区三区日韩在线观看| aa免费在线观看| 涩涩屋成人免费视频软件| 欧美日韩精品一区二区三区蜜桃| 9191在线视频| 精品免费在线| 777777777亚洲妇女| 国产精品国产av| 久久久久久黄色| 蜜臀精品一区二区| 成人毛片免费| 欧美日韩国产天堂| 少妇户外露出[11p]| 婷婷久久国产对白刺激五月99| 欧美综合第一页| 丰满少妇被猛烈进入| 亚洲欧洲日韩在线| 日韩精品第1页| 日韩av超清在线观看| 亚洲第一网中文字幕| wwwav国产| 久久99精品国产91久久来源| 日本不卡久久| 国产视频在线观看一区| 日韩精品系列| 亚洲一区二区三区免费视频| 一区二区在线播放视频| 欧美黄色录像| 国产综合在线看| 国产肥老妇视频| 亚洲日本一区二区| 亚洲精品永久视频| 日韩免费久久| 日本亚洲欧洲色| 欧美高清电影在线| 狠狠色香婷婷久久亚洲精品| bl动漫在线观看| 伊人久久大香线蕉综合热线| 国产精品免费一区二区三区在线观看| 国产精品扒开做爽爽爽的视频 | av在线播放亚洲| 99亚洲乱人伦aⅴ精品| 久久91亚洲精品中文字幕| 精品国产99久久久久久宅男i| 国产精品国产a级| 日本人69视频| 亚洲先锋影音| 99久久精品久久久久久ai换脸| 成码无人av片在线观看网站| 日韩欧美在线综合网| 国产一级av毛片| 99在线精品一区二区三区| 欧美国产激情视频| 九色成人国产蝌蚪91| 日本亚洲精品在线观看| xxxxx日韩| 欧美狂野另类xxxxoooo| 黄色一级片在线免费观看| 成人av电影免费在线播放| 国产欧美日韩伦理| av中文字幕在线观看第一页| 日韩精品免费在线播放| 蜜臀尤物一区二区三区直播| 中日韩av电影| 51自拍视频在线观看| 极品尤物久久久av免费看| 激情小说网站亚洲综合网| 欧美办公室脚交xxxx| 亚洲视频在线观看| 国产又粗又长又大视频| 亚洲国产一二三| 国精品无码人妻一区二区三区| 亚洲a一区二区三区| 97se视频在线观看| 午夜影院在线观看国产主播| 日韩亚洲欧美成人一区| 国产精品成人久久| 欧美国产视频在线| 人妻精油按摩bd高清中文字幕| 国产欧美一级| 最新精品视频| 日本午夜精品| 国产精品一区二区性色av| 欧美aaa免费| 亚洲香蕉成视频在线观看| 国产免费高清视频| 疯狂欧美牲乱大交777| 女同久久另类69精品国产| www.成人网.com| 老司机久久精品| 国产亚洲精品自拍| 国产又黄又爽免费视频| 四虎影视精品| 亚洲伊人久久综合| 国产另类xxxxhd高清| 欧美激情视频一区二区| 高清av在线| 亚洲精美色品网站| 亚洲综合精品视频| 懂色av影视一区二区三区| 日韩欧美123区| 国产日韩成人精品| 日韩免费高清一区二区| 寂寞少妇一区二区三区| 激情内射人妻1区2区3区 | 久久久精品影视| 日本精品一二三| 看国产成人h片视频| 久久久噜噜噜www成人网| 欧美激情综合色综合啪啪| 日韩欧美亚洲区| 色爱综合av| 国产精品播放| 日本高清精品| 91久久在线视频| 久久精品视频免费看| 日韩精品在线视频观看| 亚洲乱码国产乱码精品精软件| 欧美区视频在线观看| 最近免费中文字幕大全免费版视频| 亚洲444eee在线观看| 午夜免费激情视频| 亚洲特级片在线| 精品人妻中文无码av在线 | 日韩一区电影| 欧美最大成人综合网| 亚洲国产合集| 国产一区二区无遮挡| 成人性生交大片免费看96| 91在线精品视频| 亚洲欧美一级| 91久久国产精品91久久性色| 日韩成人在线一区| 国产精品久久久久免费a∨| 成人va天堂| 国产精品精品一区二区三区午夜版 | avav在线看| 鲁大师成人一区二区三区| 国产中文字幕免费观看| 国产亚洲毛片| 99福利在线观看| 快she精品国产999| 91日韩视频在线观看| 日本不卡一二三区黄网| 亚洲 激情 在线| 麻豆精品视频在线观看视频| 污视频免费在线观看网站| 蜜臀va亚洲va欧美va天堂| 性chinese极品按摩| 青青草国产成人av片免费| 亚洲污视频在线观看| 久久激五月天综合精品| 亚洲日本黄色片| 国产精品亚洲一区二区三区在线| 成人在线短视频| 成人一区二区三区| 日韩网站在线播放| 欧美激情在线一区二区| 九九热久久免费视频| 亚洲欧美国产高清| 不卡的免费av| 欧美性猛交xxxx| 中文在线免费看视频| 欧美一区二区三区在线视频| 东京干手机福利视频| 亚洲精品视频在线播放| 中文字幕在线播放| 久久综合久久八八| av老司机在线观看| 国产精品久久久久久久久久尿| 激情久久一区二区| 99视频网站| 国产精品一区2区3区| 国产乱码精品一区二区三区日韩精品 | 欧美 国产 小说 另类| 日韩国产精品大片| 91视频福利网| 久久综合中文字幕| 国产尤物在线播放| 婷婷开心激情综合| 最近中文在线观看| 日韩欧美激情在线| 欧美日韩视频精品二区| 久久精品99久久久久久久久| 牛牛精品视频在线| 国产精品久久国产精品99gif| 国产精品色婷婷在线观看| 精品欧美一区二区精品久久| 日韩欧美网址| av网站手机在线观看| 日本不卡一区二区| 污片免费在线观看| 国产在线高清| 日韩欧美成人精品| 91午夜交换视频| 日韩精品中文字幕在线播放| 国产福利视频在线观看| 欧美中文字幕在线| 日韩中文字幕视频网| 手机成人在线| 狠狠综合久久av一区二区老牛| 国产天堂在线播放| 成人精品小蝌蚪| 永久免费看片直接| 色国产综合视频| 欧美一级性视频| 久久亚洲国产精品成人av秋霞| 波多野结衣亚洲| 国产精品福利视频| 久久精品青草| 在线观看的毛片| xfplay精品久久| 国产无码精品久久久| 欧美一区二区三区视频在线 | 亚洲精品高潮| 天堂社区 天堂综合网 天堂资源最新版 | 日本精品久久久久久久久久| 极品美女销魂一区二区三区免费| 泷泽萝拉在线播放| 午夜电影网亚洲视频| 亚洲国产精品18久久久久久| 乱亲女秽乱长久久久| 成人亚洲视频| 日韩精品欧美一区二区三区| 午夜综合激情| 粉嫩av懂色av蜜臀av分享| 亚洲一区影音先锋| 亚洲不卡免费视频| 欧美精品一区二区免费| 国产精品igao视频网网址不卡日韩| 色婷婷精品国产一区二区三区| 裸体一区二区| 性猛交ⅹxxx富婆video| 日韩欧美在线播放| 日本护士...精品国| 91成品人片a无限观看| 久久人人爽人人爽人人片av不| 日韩成人三级视频| 岛国av在线一区| 日韩精品一区三区| 亚洲精品国产精品国自产观看浪潮| 欧美hdxxxx| 精品国产电影| 校园激情久久| 五月天综合视频| 欧美色网站导航| 免费的黄网站在线观看| 成人网欧美在线视频| 亚洲综合色站| 亚洲色偷偷色噜噜狠狠99网| 亚洲福利视频一区| 四虎影视在线观看2413| 欧美怡红院视频一区二区三区| 久久综合影院| 成人午夜激情av| 中文字幕中文字幕在线一区 | 欧美啪啪小视频| 亚洲片在线资源| 黄页免费欧美| 成人免费在线视频播放| 成人一级视频在线观看| 久久久免费高清视频| 伊人伊人伊人久久| 91成人app| 黄色国产一级视频| 日本一区二区免费在线观看视频 | 日本三级2019| 日韩精品视频在线播放| 国产精品伦一区二区| 看一级黄色录像| 99亚偷拍自图区亚洲| 日本丰满少妇做爰爽爽| 俺去啦;欧美日韩| 国产精品超碰| 性刺激综合网| 国产精品一区二区x88av| 国产午夜性春猛交ⅹxxx| 一区二区三区高清国产| 激情五月综合婷婷| 日本少妇高潮喷水视频| 国产精品久久久久久福利一牛影视| а√中文在线资源库| 国产不卡精品视男人的天堂| 国产二区精品| 亚洲蜜桃精久久久久久久久久久久| 欧美日韩中文一区| 美女扒开腿让男人桶爽久久软| 亚洲午夜在线观看| 成人av影院在线| 亚洲综合一区中| 欧美亚洲国产另类| 亚洲欧美在线专区| 黄色片网站免费| 亚洲成**性毛茸茸| 欧美男女视频|