精品欧美一区二区三区在线观看 _久久久久国色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片无码v| 成人av资源在线播放| 天天插天天射天天干| 伊人网在线播放| 欧美经典一区二区| 亚洲free性xxxx护士hd| 中文字幕一区二区三区手机版| 欧美中文一区| 欧美日韩精品高清| www.xxx麻豆| 国产毛片在线| 国产精品乡下勾搭老头1| 欧美亚洲一区在线| 亚洲精品一区二区三区av| 国产又粗又大又爽| 91久久午夜| 中文字幕亚洲在线| av av在线| 久久69成人| 久久综合精品国产一区二区三区| 国产日韩精品在线| 黄网在线观看视频| 伊人青青综合网| 一区二区三欧美| www.四虎在线| 四虎国产精品永久在线国在线 | 色素色在线综合| 99久re热视频精品98| 黄色视屏网站在线免费观看| 国产一区二区毛片| 国产精品爱久久久久久久| 久久97人妻无码一区二区三区| 精品在线99| 日韩一级精品视频在线观看| 国产三级日本三级在线播放| 丰满诱人av在线播放| 久久成人久久爱| 2021国产精品视频| 久草视频在线资源站| 99re66热这里只有精品8| 亚洲精品在线不卡| 每日在线更新av| 污片在线免费观看| 国产mv日韩mv欧美| 成人福利网站在线观看| 国产精华7777777| 国产精品亚洲产品| 国内精品久久久久久影视8| 精品国产国产综合精品| 精品国产精品久久一区免费式| 亚洲国语精品自产拍在线观看| 三区视频在线观看| 福利一区二区免费视频| 天天影视色香欲综合网老头| 日韩欧美视频一区二区| 欧美3p视频在线观看| a级精品国产片在线观看| 亚洲一区免费网站| 国产精品久久久久精| 美女网站色91| 国产精品久久久久久亚洲影视| 欧美三级一区二区三区| 国产大片中文字幕在线观看| 丰满诱人av在线播放| 国产精品毛片久久久久久久 | 顶级网黄在线播放| 国产精品每日更新| 亚洲精蜜桃久在线| 国产理论电影在线观看| 久久久不卡网国产精品二区| 久久久久成人精品免费播放动漫| 性生活视频软件| 国产精品一区二区三区乱码| 91性高湖久久久久久久久_久久99| 最新中文字幕在线观看视频| 日韩不卡一区二区三区| 欧美有码在线观看| 精品欧美一区二区三区免费观看 | av在线免费网站| 亚洲人成在线观看一区二区| 中文字幕乱码一区二区三区| 一级黄色录像大片| 蜜臀精品久久久久久蜜臀| 浅井舞香一区二区| 亚洲国产精品无码久久久| 久久91麻豆精品一区| 亚洲精品视频免费| 日韩av在线看免费观看| 国产区精品区| 中文字幕欧美精品日韩中文字幕| 亚洲国产av一区| 日韩精品久久| 萌白酱国产一区二区| 国产精品国产精品88| 欧美精品中文| 国产亚洲精品日韩| 一级国产黄色片| 精品国产一区探花在线观看| 久久精品国产电影| 久久久久久久久久久97| 国产农村妇女精品一区二区| 国产成人在线视频| 国产青青草视频| 成人免费高清视频在线观看| 欧美男人的天堂| 波多野结衣在线影院| 一区二区三区视频在线看| 国模吧无码一区二区三区| 精品亚洲美女网站| 欧美日本国产一区| 中国免费黄色片| 成人羞羞动漫| 欧美精品久久久久久久久| 国产视频1区2区| 国产成人免费视频一区| 日韩精品国内| 国产嫩草在线视频| 欧美日韩情趣电影| 黄色国产在线视频| 精品国产精品| 欧美激情性做爰免费视频| 日本中文字幕在线观看视频| 国产一区 二区 三区一级| 久久综合精品一区| 2024最新电影在线免费观看| 色综合久久综合网97色综合 | 正义之心1992免费观看全集完整版| 欧美人与牲禽动交com | 中文字幕av一区二区三区高 | 国产美女在线一区| 欧美91在线|欧美| 亚洲精品国产精品国产自| 亚洲精品一区二区三区在线播放| 伊人成人在线| 人人澡人人澡人人看欧美| 国产成年妇视频| 国产午夜精品久久| 成人高清dvd| www成人在线视频| 亚洲美女精品久久| 国产无遮挡又黄又爽| 久久精品久久综合| 日韩av图片| 密臀av在线播放| 精品乱人伦小说| 又黄又色的网站| 97视频精品| 国产精品毛片a∨一区二区三区|国| 亚洲精品一区二区三区区别| 亚洲视频免费在线| 国产永久免费网站| 一道在线中文一区二区三区| 欧美一区视频在线| 美国一级片在线免费观看视频| 亚洲一二三四在线| 91免费黄视频| 亚洲日本一区二区三区在线| 久久精品精品电影网| 黄色一区二区视频| 欧美激情自拍偷拍| 欧美日韩大尺度| 国产精品一区二区av交换| 88xx成人精品| 日韩精品系列| 亚洲成人精品一区二区| 91九色蝌蚪porny| 在线观看日韩av电影| 国产亚洲欧美一区二区三区| 久久香蕉一区| 亚洲国产精品一区二区久| 欧美日韩中文视频| 成人黄色小视频在线观看| www.xxx麻豆| 欧美综合精品| 国产91在线播放| 亚洲欧美视频一区二区| 91麻豆精品国产91久久久久久| 老熟妇高潮一区二区三区| 国产剧情一区二区| 国产在线xxxx| 久久超级碰碰| 国产成人精品在线| 成人高清网站| 制服.丝袜.亚洲.另类.中文| 日本一级二级视频| av一区二区三区四区| 日日摸日日碰夜夜爽无码| 久久久久影视| 国产精品成人一区二区| 男人的天堂在线视频免费观看| 777奇米四色成人影色区| 久久久久国产精品夜夜夜夜夜| 成人免费高清在线| 免费日韩中文字幕| 视频91a欧美| 久久久久久久久久久免费| 香港一级纯黄大片| 欧美天堂一区二区三区| 国产一区二区三区在线视频观看| 国产不卡视频在线播放| av之家在线观看| 日韩免费久久| 国产专区精品视频| 少妇视频一区| 久久精品国产91精品亚洲 | 中文字幕21页在线看| 最新69国产成人精品视频免费| 99热这里只有精品在线观看| 亚洲一区二区三区自拍| 国产性猛交xx乱| 成人在线综合网| 成人免费在线观看视频网站| 黄色在线一区| 亚州欧美一区三区三区在线| 中文字幕一区二区三区四区久久 | 黄色在线论坛| 亚洲欧洲自拍偷拍| 精品毛片在线观看| 欧美中文字幕久久| 国产第一页在线播放| 欧美激情一区二区| 亚洲少妇18p| 紧缚捆绑精品一区二区| 精品视频一区二区在线| 欧美日韩ab| 一区二区三区欧美在线| 亚洲精品3区| 国产精品午夜av在线| 欧美成人性生活视频| 精品女同一区二区| 一级黄色片网站| 91久久奴性调教| 亚洲国产综合久久| 亚洲乱码国产乱码精品精可以看| 欧美做受高潮6| 99久久国产综合精品色伊| 99中文字幕在线| 蜜臀久久久久久久| 日韩av资源在线| 亚洲精品韩国| 久久最新免费视频| 欧美限制电影| 欧美另类一区| 免费成人高清在线视频theav| 国产精品v欧美精品v日韩| 国产美女精品视频免费播放软件| 欧美亚洲成人精品| wwww亚洲| 久久久久中文字幕2018| 国产激情视频在线观看| 色一情一乱一区二区| 香港一级纯黄大片| 精品调教chinesegay| 天天操天天干天天| 日韩写真欧美这视频| 在线免费一级片| 91福利在线观看| 波多野结衣一区二区三区四区| 日韩欧美成人网| 欧美特黄aaaaaa| 精品久久久久久久大神国产| 伊人久久综合视频| 狠狠久久五月精品中文字幕| 中文字幕亚洲精品在线| 欧美日韩一区二区在线| 免费看一级视频| 色呦呦网站一区| 欧美成人精品网站| 在线免费av一区| 中文字幕+乱码+中文| 欧美色图天堂网| 一级久久久久久久| 666欧美在线视频| 亚洲综合精品国产一区二区三区| 欧美一级生活片| 亚洲高清精品视频| 日韩欧美国产三级| 色呦呦视频在线| 亚洲欧美在线免费| av在线天堂播放| 久久久精品欧美| 青青草原av在线| 国内精品美女av在线播放| 成人bbav| 国产精品视频精品| 久久精品一级| 国产精品91久久| 91国内外精品自在线播放| 国产精品中文在线| 亚洲高清999| 免费看成人午夜电影| 视频在线不卡免费观看| 99久久免费观看| 9国产精品视频| 在线免费观看av网| eeuss鲁片一区二区三区在线观看| www.555国产精品免费| 久久久精品一品道一区| 久久精品日韩无码| 亚洲国产精品天堂| 青青草视频在线观看免费| 欧美高清一级片在线| 色呦呦中文字幕| 日韩在线视频免费观看| 亚洲私拍视频| 91九色视频在线| 天天久久夜夜| 免费成人深夜夜行网站视频| 国产欧美日韩综合一区在线播放 | 在线免费日韩av| 色综合色狠狠综合色| av免费观看网址| 亚洲人成电影网站色xx| caopo在线| 日韩av大片在线| 4438全国亚洲精品观看视频| 茄子视频成人在线观看| 91精品国产自产在线观看永久∴| 午夜精品久久久久久久无码| 狠狠色丁香婷综合久久| 中文字幕一区二区人妻在线不卡| 亚洲欧美区自拍先锋| 国产女主播喷水视频在线观看| 精品久久五月天| av大全在线免费看| 91成品人片a无限观看| 成人看片网站| 日韩精彩视频| 国产精品资源| 成人午夜精品无码区| 亚洲婷婷综合久久一本伊一区 | 在线高清一区| 国产资源中文字幕| 欧美激情自拍偷拍| 国产毛片aaa| 精品国产在天天线2019| 国产精品四虎| 国产成人高潮免费观看精品| 国产精品玖玖玖在线资源| 自拍偷拍一区二区三区| 日韩精品成人一区二区在线| 久久久精品人妻无码专区| 亚洲国产精品欧美一二99 | 欧美日韩精品免费观看视频| 亚欧洲精品视频| 久久久亚洲成人| 97久久综合区小说区图片区| 三年中文高清在线观看第6集 | 一本色道久久88亚洲综合88| 一个人www视频在线免费观看| 不卡一区二区三区视频| 亚洲精品国产偷自在线观看| jizzzz日本| 中文字幕中文在线不卡住| 中文在线字幕av| 亚洲美女视频网站| 黄毛片在线观看| 蜜桃精品久久久久久久免费影院 | www.欧美视频| 吴梦梦av在线| 国产一区二区福利视频| 精品人妻伦九区久久aaa片| 色久综合一二码| 免费黄色在线观看| 91久久久精品| 你懂的视频一区二区| 日韩av影视大全| 亚洲一二三区不卡| 少妇精品高潮欲妇又嫩中文字幕| 欧美极品少妇xxxxⅹ裸体艺术 | 91精品国产综合久久久蜜臀粉嫩 | 欧美aaaaa性bbbbb小妇| 精品国产免费久久久久久尖叫| 伊人影院久久| 国产精品成人99一区无码 | 国产女主播av| 成人精品在线视频观看| 精品无码久久久久| 亚洲欧美国产精品| 国语自产精品视频在线看抢先版结局| 一区二区日本| 国产成人午夜视频| 国产精品二区一区二区aⅴ| 日韩电影中文 亚洲精品乱码| 亚洲精品88| 日本一区免费看| 国产成人亚洲精品狼色在线| 久久久国产精品成人免费| 亚洲夜晚福利在线观看| 日韩美女在线| a级黄色小视频| 久久久久久久久99精品| 国产精品午夜一区二区| 久久久亚洲精选| 视频一区在线观看| 91欧美一区二区三区| 午夜欧美在线一二页| 国产女主播在线写真| 91色精品视频在线| 在线视频观看日韩|