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

手寫Axios核心原理

開發 架構
Axios天然支持Promise的性能讓其方便對異步進行處理,同時又利用了Promise對請求進行了攔截,使得用戶可以在請求過程中添加更多的功能,對請求的中斷能自如操作。

[[355442]]

Axios是一個基于promise的HTTP庫,它能夠自動判斷當前環境,自由切換在瀏覽器和 node.js環境中。如果是瀏覽器,就會基于XMLHttpRequests實現;如果是node環境,就會基于node內置核心http模塊實現。同時,它還用promise處理了響應結果,避免陷入回調地獄中去。

不僅如此,Axios還可以攔截請求和響應、轉化請求數據和響應數據、中斷請求、自動轉換JSON數據、客戶端支持防御XSRF等。如此眾多好用的功能,快來一起看看它是如何實現的吧!

1.基本使用

axios基本使用方式主要有:

  • axios(config)
  • axios.method(url,data,config)
  1. // 發送 POST 請求 
  2. axios({ 
  3.   method: 'post'
  4.   url: '/user/12345'
  5.   data: { 
  6.     username: 'Web前端嚴選'
  7.     age: 2 
  8.   } 
  9. }); 
  10. // GET請求ID參數 
  11. axios.get('/user?ID=12345'
  12.   .then(function (response) { 
  13.     console.log(response); 
  14.   }) 
  15.   .catch(function (error) { 
  16.     console.log(error); 
  17.   }); 

2.實現axios

從axios(config)的使用上可以看出導出的axios是一個方法,從axios.get()的使用上可以看出導出的axios原型上會有get,post,put,delete等方法。

由分析可知,axios實際上是Axios類中的一個方法。我們可以先寫一個request方法來實現主要的請求功能,這樣就能使用axios(config)形式來調用了。

  1. class Axios{ 
  2.     constructor(){ 
  3.  
  4.     } 
  5.     request(config){ 
  6.         return new Promise((resolve) => { 
  7.             const {url='',data={},method='get'} = config; //解構傳參 
  8.             const xhr = new XMLHttpRequest;     //創建請求對象 
  9.             xhr.open(method,url,true);  
  10.             xhr.onreadystatechange = () => { 
  11.                 if(xhr.readyState == 4 && xhr.status == 200){ 
  12.                     resolve(xhr.responseText); 
  13.                     //異步請求返回后將Promise轉為成功態并將結果導出 
  14.                 } 
  15.             } 
  16.             xhr.send(JSON.stringfy(data)); 
  17.         }) 
  18.     } 
  19.  
  20. function CreateAxiosFn(){ 
  21.     let axios = new Axios; 
  22.     let req = axios.request.bind(axios); 
  23.     return req; 
  24.  
  25. let axios = CreateAxiosFn(); 

然后搭建一個簡易服務端代碼,以測試請求的效果:

  1. const express = require('express'
  2.  
  3. let app = express(); 
  4.  
  5. app.all('*'function (req, res, next) { 
  6.     res.header('Access-Control-Allow-Origin''*'); 
  7.     res.header('Access-Control-Allow-Headers''Content-Type'); 
  8.     res.header('Access-Control-Allow-Methods''*'); 
  9.     res.header('Content-Type''application/json;charset=utf-8'); 
  10.     next(); 
  11. }); 
  12.  
  13. app.get('/getInfo'function(request, response){ 
  14.     let data = { 
  15.         'username':'前端嚴選'
  16.         'age':'2' 
  17.     }; 
  18.     response.json(data); 
  19. }); 
  20. app.listen(3000, function(){ 
  21.     console.log("服務器啟動"); 
  22. }); 

啟動服務后,在頁面中測試請求是否成功:

  1. <button onclick="getMsg()">點擊</button> 
  2. <script src="./axios.js"></script> 
  3. <script> 
  4.     function getMsg(){ 
  5.         axios({ 
  6.             method: 'get'
  7.             url: 'http://localhost:3000/getInfo' 
  8.         }).then(res => { 
  9.             console.log(res); 
  10.         }) 
  11.     } 
  12. </script> 

點擊按鈕后,可以看到請求成功并獲取到數據。

3.原型上的方法

接下來實現以axios.method()形式的方法。

通過axios.get(),axios.post(),axios.put()等方法可以看出它們都是Axios.prototype上的方法,這些方法調用內部的request方法即可:

  1. const methodsArr = ['get','post','put','delete','head','options','patch','head']; 
  2. methodsArr.forEach(method => { 
  3.     Axios.prototype[method] = function(){ 
  4.         return this.request({ 
  5.             method: method, 
  6.             ...arguments[0] 
  7.         }) 
  8.     } 
  9. }) 

arguments的第一個參數包含url,data等信息,直接解構它的第一個元素即可

還需要實現一個工具方法,用來將b方法屬性混入到a中去:

  1. const utils = { 
  2.     extend(a,b,context){ 
  3.         for(let key in b){ 
  4.             if(b.hasOwnProperty(key)){ 
  5.                 if(typeof b[key] == 'function'){ 
  6.                     a[key] = b[key].bind(context); 
  7.                 }else
  8.                     a[key] = b[key
  9.                 } 
  10.             } 
  11.         } 
  12.     } 

最終導出axios的request方法,使之擁有get,post等方法

  1. function CreateAxiosFn(){ 
  2.     let axios = new Axios; 
  3.     let req = axios.request.bind(axios); 
  4.     //新增如下代碼 
  5.     utils.extend(req, Axios.prototype, axios) 
  6.     return req; 

再來測試一下post的請求:

  1. axios.post({ 
  2.     url: 'http://localhost:3000/postTest'
  3.     data: { 
  4.         a: 1, 
  5.         b: 2 
  6.     } 
  7. }).then(res => { 
  8.     console.log(res); 
  9. }) 

可以看到正確返回結果了。

4.攔截器

先來看看攔截器的使用:

  1. // 請求攔截 
  2. axios.interceptors.request.use(function (config) { 
  3.     // 在發送請求之前 
  4.     return config; 
  5.   }, function (error) { 
  6.     // 請求錯誤處理 
  7.     return Promise.reject(error); 
  8.   }); 
  9.  
  10. // 響應攔截 
  11. axios.interceptors.response.use(function (response) { 
  12.     // 響應數據處理 
  13.     return response; 
  14.   }, function (error) { 
  15.     // 響應錯誤處理 
  16.     return Promise.reject(error); 
  17.   }); 

攔截器,顧名思義就是在請求之前和響應之前,對真正要執行的操作數據攔截住進行一些處理。

那么如何實現呢,首先攔截器也是一個類,用于管理響應和請求。

  1. class InterceptorsManage{ 
  2.     constructor(){ 
  3.         this.handlers = []; 
  4.     } 
  5.     use(onFulField,onRejected){ 
  6.         //將成功的回調和失敗的回調都存放到隊列中 
  7.         this.handlers.push({ 
  8.             onFulField, 
  9.             onRejected 
  10.         }) 
  11.     } 

axios.interceptors.response.use和axios.interceptors.request.use來定義請求和響應的攔截方法。

這說明axios上有響應攔截器和請求攔截器,那么如何在axios上實現呢:

  1. class Axios{ 
  2.     constructor(){ 
  3.         this.interceptors = { 
  4.             request: new InterceptorsManage, 
  5.             response: new InterceptorsManage 
  6.         } 
  7.     } 
  8.     //.... 

在Axios的構造函數中新增interceptors屬性,然后定義request和response屬性用于處理請求和響應。

執行use方法時,會把傳入的回調函數放到handlers數組中。

這時再回看使用方式,axios.interceptors.request.use方法是綁在axios實例上的,因此同樣需要把Axios上的屬性和方法轉移到request上,將interceptors對象掛載到request方法上。

  1. function CreateAxiosFn() { 
  2.   let axios = new Axios(); 
  3.   let req = axios.request.bind(axios); 
  4.   utils.extend(req, Axios.prototype, axios) 
  5.   //新增如下代碼 
  6.   utils.extend(req, axios) 
  7.   return req; 

但是現在request不僅要執行請求的發送,還要執行攔截器中handler的回調函數,因此還需要把request方法進行一下改造:

  1. request(config){ 
  2.     //攔截器和請求的隊列 
  3.     let chain = [this.sendAjax.bind(this),undefined]; 
  4.  //請求的攔截 
  5.     this.interceptors.request.handlers.forEach(interceptor => { 
  6.         chain.unshift(interceptor.onFulField,interceptor.onRejected); 
  7.     }) 
  8.  //響應的攔截 
  9.     this.interceptors.response.handlers.forEach(interceptor => { 
  10.         chain.push(interceptor.onFulField,interceptor.onRejected) 
  11.     }) 
  12.     let promise = Promise.resolve(config); 
  13.     while(chain.length > 0){ 
  14.         //從頭部開始依次執行請求的攔截、真正的請求、響應的攔截 
  15.         promise = promise.then(chain.shift(),chain.shift()); 
  16.     } 
  17.     return promise; 
  18. sendAjax(config){ 
  19.     return new Promise((resolve) => { 
  20.         const {url='',method='get',data={}} = config; 
  21.         const xhr = new XMLHttpRequest(); 
  22.         xhr.open(method,url,true); 
  23.         xhr.onreadystatechange = () => { 
  24.             if(xhr.readyState == 4 && xhr.status == 200){ 
  25.                 resolve(xhr.responseText) 
  26.             } 
  27.         } 
  28.         xhr.send(JSON.stringify(data)); 
  29.     }) 

最后執行chain的時候是這個樣子的:

  1. chain = [ 
  2.     //請求之前成功的回調和失敗的回調 
  3.     function (config) { 
  4.         return config; 
  5.     },  
  6.     function (error) { 
  7.         return Promise.reject(error); 
  8.     } 
  9.  //真正的請求執行 
  10.     this.sendAjax.bind(this),  
  11.     undefined, 
  12.  //請求之后響應的成功回調和失敗回調 
  13.     function (response) { 
  14.         return response; 
  15.     },  
  16.     function (error) { 
  17.         return Promise.reject(error); 
  18.     } 

請求之前,promise執行為:

  1. promise.then
  2.  function (config) { 
  3.         return config; 
  4.     },  
  5.     function (error) { 
  6.         return Promise.reject(error); 
  7.     } 

請求時,執行為:

  1. promise.then
  2.  this.sendAjax.bind(this),  
  3.     undefined, 

響應后,執行為:

  1. promise.then
  2.  function (response) { 
  3.         return response; 
  4.     },  
  5.     function (error) { 
  6.         return Promise.reject(error); 
  7.     } 

這時我們測試一下攔截器的使用:

  1. function getMsg(){ 
  2.     axios.interceptors.request.use((config) => { 
  3.         console.log('請求攔截:',config); 
  4.         return config; 
  5.     },err => { 
  6.         return Promise.reject(err) 
  7.     }) 
  8.     axios.interceptors.response.use(response => { 
  9.         response = { 
  10.             message: '響應數據替換'
  11.             data: response 
  12.         } 
  13.         return response 
  14.     },err => { 
  15.         console.log(err,'響應錯誤'
  16.         return Promise.reject(err) 
  17.     }) 
  18.     axios.get({ 
  19.         url: 'http://localhost:3000/getTest'
  20.  
  21.     }).then(res => { 
  22.         console.log(res); 
  23.     }) 

可以在控制臺中看到攔截處理的打印輸出,證明攔截成功!

5.總結

Axios天然支持Promise的性能讓其方便對異步進行處理,同時又利用了Promise對請求進行了攔截,使得用戶可以在請求過程中添加更多的功能,對請求的中斷能自如操作。它的思想既清新樸實又不落入俗套,具有很好的借鑒意義。

看完這篇文章,你了解了Axios的核心原理了嗎?

本文轉載自微信公眾號「Web前端嚴選」,可以通過以下二維碼關注。轉載本文請聯系Web前端嚴選公眾號。

 

責任編輯:武曉燕 來源: Web前端嚴選
相關推薦

2020-10-20 09:12:57

axios核心原理

2020-11-02 09:35:04

ReactHook

2021-12-14 07:43:52

Spring核心原理環境準備

2021-08-10 18:36:02

Express原理面試

2020-11-24 07:48:32

React

2021-12-15 09:17:12

Spring依賴注入面試題

2021-12-27 08:27:17

SpringMVC面試

2022-08-27 13:49:36

ES7promiseresolve

2020-10-23 09:26:57

React-Redux

2021-12-12 21:01:12

CSS 技巧PurgeCss

2021-07-27 14:50:15

axiosHTTP前端

2021-12-01 06:40:32

Bind原理實現

2021-07-12 09:45:36

NameServer 核心Conusmer

2020-11-09 07:29:12

ReentrantLo源碼公平鎖

2025-06-30 02:22:00

2020-07-03 17:20:07

Redux前端代碼

2021-11-24 10:10:32

axios前端攔截器

2021-04-21 07:52:39

核心SignalR應用

2021-04-28 10:13:58

zookeeperZNode核心原理

2020-05-21 13:25:43

Spring組件架構
點贊
收藏

51CTO技術棧公眾號

欧美三级免费| 经典三级一区二区| 丰满亚洲少妇av| 91国内产香蕉| 摸摸摸bbb毛毛毛片| 四虎精品在线观看| 婷婷丁香激情综合| 五月天亚洲综合情| 老熟妇高潮一区二区高清视频| 日韩视频在线一区二区三区 | 日韩女优在线视频| 超碰超碰人人人人精品| 亚洲色图欧洲色图| 欧美激情第六页| 99国产揄拍国产精品| 亚洲综合电影一区二区三区| 精品国产一区二区三区久久| 久久久久9999| 国产亚洲字幕| 在线国产亚洲欧美| 免费不卡av在线| 国产鲁鲁视频在线观看特色| 久久众筹精品私拍模特| 99c视频在线| 中国黄色一级视频| 国产亚洲一区在线| 欧美激情18p| 日韩一区二区三区四区视频| 欧美美女在线| 亚洲国产高清自拍| 丰满少妇一区二区三区专区 | 国产综合自拍| 久久精品国产96久久久香蕉| mm131美女视频| 电影一区二区在线观看| 337p亚洲精品色噜噜| 美女网站免费观看视频| 日本乱码一区二区三区不卡| 亚洲综合激情小说| 午夜探花在线观看| 久做在线视频免费观看| 中文天堂在线一区| 日本免费高清一区二区| 免费在线黄色影片| 91最新地址在线播放| 国产精品国产精品国产专区蜜臀ah | 97人妻天天摸天天爽天天| 成人在线日韩| 欧美精品高清视频| 粉色视频免费看| 69堂精品视频在线播放| 欧美自拍偷拍一区| 阿v天堂2017| 岛国av在线播放| 一区二区三区 在线观看视频| 中文字幕中文字幕在线中一区高清| 国产日韩精品在线看| 久久综合九色综合久久久精品综合| 国产二区一区| 日韩一级片免费| 不卡欧美aaaaa| 国产中文一区二区| 亚洲欧美一区二区三| 国产美女精品一区二区三区| 成人自拍性视频| 国产精品一区二区人人爽| 久久er99热精品一区二区| 成人写真视频福利网| 国产精品无码天天爽视频| 国产原创一区二区三区| 99re视频在线观看| 天天操天天干天天| 成人aa视频在线观看| 麻豆av一区二区| 国产精品99999| 17c精品麻豆一区二区免费| 国产一级黄色录像片| 久久青青色综合| 天天射综合影视| 久久综合久久色| 台湾天天综合人成在线| 精品伦理精品一区| 国产熟妇搡bbbb搡bbbb| 久久国产影院| 欧美激情欧美激情在线五月| av黄色在线看| 首页亚洲欧美制服丝腿| 91久久久国产精品| 免费a视频在线观看| 久久久精品人体av艺术| 中文字幕一区二区三区5566| 波多野结衣在线高清| 色婷婷综合久久久久中文 | 99久久伊人网影院| 日本一区二区在线视频观看| 黄色成人在线| 欧美日韩在线视频首页| 欧美第一页浮力影院| 一区二区三区视频播放| 亚洲精品视频在线观看视频| 91麻豆精品久久毛片一级| 一区在线免费| 国产欧亚日韩视频| 黄色一级大片在线免费看国产| 国产嫩草影院久久久久| 日韩久久久久久久久久久久| 免费日韩电影| 日韩欧美一级二级三级久久久| 中文精品在线观看| 一区二区日韩欧美| 国产91精品最新在线播放| 在线观看日本一区| 欧美一区二区三区黄片| 大胆日韩av| 国内精品久久久久久影视8| 中文字幕第31页| 成人黄色网址在线观看| 午夜一区二区三视频在线观看| 欧美一卡二卡| 欧美伦理视频网站| 国内精品卡一卡二卡三| 亚洲激情网址| 成人午夜电影免费在线观看| 欧美日韩在线看片| 色婷婷国产精品| www男人天堂| 亚洲字幕久久| 成人黄色在线播放| www日韩tube| 一本一道久久a久久精品 | 麻豆视频在线观看| 久草中文综合在线| 先锋在线资源一区二区三区| 91精品论坛| 亚洲精品美女免费| 黄色一级视频免费| 国产精品1区二区.| 一区二区三区视频在线播放| 日本美女久久| 国产婷婷成人久久av免费高清| 国产极品在线播放| 国产91精品欧美| 国产免费内射又粗又爽密桃视频| 日韩色性视频| 色婷婷综合成人| 91亚洲国产成人久久精品麻豆| 国产欧美精品一区二区色综合朱莉| 黄色动漫在线免费看| 日韩av网站在线免费观看| 久久久免费观看| 天堂av一区二区三区| 亚洲午夜久久久久| av av在线| 一区二区国产在线观看| 精品一区二区三区日本| 日本三级一区| 亚洲欧美一区二区三区情侣bbw| 日韩免费不卡视频| 91美女精品福利| 欧洲熟妇精品视频| 日韩欧美高清| 91欧美激情另类亚洲| www.久久ai| 精品国产91洋老外米糕| 激情五月色婷婷| 久久久久久久久久看片| 五月婷婷狠狠操| 午夜精品一区二区三区国产| 亚洲自拍中文字幕| 超碰在线最新网址| 亚洲欧美中文另类| 亚洲综合精品国产一区二区三区 | 成人午夜亚洲| 久久婷婷国产麻豆91天堂| 精品人妻一区二区三区蜜桃| 亚洲成人tv网| 人妻aⅴ无码一区二区三区| 青青草国产成人av片免费| 手机在线视频你懂的| 成人影院中文字幕| 清纯唯美日韩制服另类| 日韩免费网站| 亚洲福利在线观看| www.av88| 亚洲综合一区在线| 国精品无码人妻一区二区三区| 免费欧美日韩国产三级电影| 裸体大乳女做爰69| 亚洲电影一级片| 91精品啪aⅴ在线观看国产| 77thz桃花论族在线观看| 在线观看欧美视频| 高清毛片aaaaaaaaa片| 色94色欧美sute亚洲线路二| 国产97免费视频| 久久综合久久综合久久综合| 国产精品久久久久久9999| 亚洲美女色禁图| 五月天亚洲综合| 欧美久久精品| 91丨九色丨国产在线| 老司机成人影院| 色综合天天综合网国产成人网| 欧美日韩伦理片| 日韩美女在线视频| 中文字幕有码视频| 欧美日韩另类在线| 国产精品丝袜一区二区| 久久久久久久av麻豆果冻| 日韩精品国产一区| 久久69国产一区二区蜜臀| 国产精品无码一区二区在线| 亚洲男女av一区二区| 欧洲精品久久| 欧美1区2区3区4区| 亚洲字幕在线观看| 四虎精品永久免费| 国产精品久久久久久久久影视 | 国产成人av免费观看| 日本一不卡视频| 91精品91久久久中77777老牛| 欧美一区不卡| 亚洲一卡二卡区| 国产精品免费不| 久久精品午夜一区二区福利| 一区二区三区视频播放| 亚洲综合社区网| 色综合.com| 国产精品久久久999| 中文字幕在线免费观看视频| 欧美激情xxxx| 羞羞的视频在线观看| 不卡av电影院| 麻豆免费在线视频| 久久九九亚洲综合| 免费超碰在线| 日韩在线观看免费全| www.在线播放| 色噜噜狠狠狠综合曰曰曰| 国产在线观看网站| 亚洲一区二区国产| 九色在线观看| 亚洲色图日韩av| 国产视频三级在线观看播放| 亚洲精品在线不卡| 久久久资源网| 国产亚洲一区精品| 成人高清免费观看mv| 亚洲欧洲日产国码av系列天堂| 青青草视频在线免费观看| 精品无码久久久久久国产| 视频三区在线观看| 亚洲视屏在线播放| 超碰在线影院| 色999日韩欧美国产| 免费高清在线观看| 九色成人免费视频| 黄毛片在线观看| 欧美重口另类videos人妖| 亚洲深夜视频| 国产精品极品在线| 亚洲精品无播放器在线播放| 亚洲一区二区免费在线| 99久久人爽人人添人人澡| 国产伦精品一区二区三区四区免费 | 9国产精品午夜| caoporen国产精品| 婷婷视频一区二区三区| 国产亚洲欧美一区二区| 亚洲第一福利社区| 亚洲日本japanese丝袜| 亚洲国产一成人久久精品| 国产黄色片免费在线观看| 午夜在线播放视频欧美| 蜜臀av免费观看| 国产精品一区二区三区网站| 又黄又爽的网站| 国产日韩视频一区二区三区| 国产传媒免费在线观看| 亚洲国产毛片aaaaa无费看| 黄色在线观看国产| 欧美在线你懂的| 精品国产九九九| 亚洲男人天堂久| 黄视频网站在线看| 98精品国产高清在线xxxx天堂| 欧美成人精品三级网站| 亚洲自拍偷拍视频| 欧洲专线二区三区| 美国av在线播放| 亚洲视频大全| 亚洲天堂网站在线| 久久综合九色综合欧美就去吻| 九九这里只有精品视频| 天天综合色天天综合色h| 一级特黄aaa大片在线观看| 欧美一级黄色片| 日本成人一区二区三区| 久久99精品国产99久久6尤物 | 欧美日韩激情视频| 一区二区三区播放| 日韩激情在线视频| 成人在线直播| 国产精品久久久久久搜索| 一区二区日韩| 爱爱爱视频网站| 久久精品亚洲一区二区| 手机精品视频在线| 中文子幕无线码一区tr| av大片免费观看| 欧美一二区视频| 最新国产在线观看| 欧美亚洲国产日韩2020| 日韩一区二区三区精品视频第3页| 欧美一级片免费观看| 韩日精品在线| 性鲍视频在线观看| 中文字幕国产一区二区| 亚洲熟妇无码乱子av电影| 日韩欧美的一区| 国产三区视频在线观看| 国产免费成人av| 成人免费电影网址| 黄色a级片免费| proumb性欧美在线观看| 69av.com| 91精品欧美一区二区三区综合在 | 欧美成人午夜影院| 亚洲青青一区| 亚洲欧美电影在线观看| 日韩精品成人一区二区三区| 少妇特黄一区二区三区| 大伊人狠狠躁夜夜躁av一区| 粉嫩小泬无遮挡久久久久久| 欧美久久精品一级黑人c片| 日日狠狠久久| 免费看av软件| 精品一区二区在线看| 国产一级淫片久久久片a级| 欧美色电影在线| 国产二区视频在线观看| 国产99视频在线观看| 国产亚洲一区二区三区啪| 玩弄japan白嫩少妇hd| 久久精品一二三| 探花视频在线观看| 亚洲区一区二区| 欧美理论影院| 偷拍视频一区二区| 激情久久五月天| 久热这里有精品| 日韩一级大片在线| 久久亚洲导航| 久久精品99久久| 媚黑女一区二区| 国产精品理论在线| 欧美日韩国产精选| 日韩在线观看www| 99视频免费观看蜜桃视频| 国内精品久久久久国产盗摄免费观看完整版| 亚洲一级片免费观看| 一区二区三区欧美日| 神马午夜电影一区二区三区在线观看| 97国产精品人人爽人人做| 亚洲动漫精品| 亚洲xxx在线观看| 亚洲精品日韩综合观看成人91| 东京干手机福利视频| 91高潮精品免费porn| 凹凸成人精品亚洲精品密奴| 91av视频免费观看| 亚洲综合免费观看高清完整版在线| 免费观看a视频| 国产精品久久久久久久久久ktv | 九九久久精品一区| 久久久久97| 美女少妇一区二区| 亚洲精品视频在线观看免费| 四季av日韩精品一区| 国产精品国产福利国产秒拍| 91精品久久久久久久久久不卡| www.四虎在线| 91国模大尺度私拍在线视频| a级片国产精品自在拍在线播放| 国产精品久久亚洲| 日本伊人色综合网| 国产午夜精品无码| 一本色道久久88综合日韩精品 | 青青草成人在线观看| 久草免费在线观看视频| 亚洲性av网站| 2023国产精华国产精品| 亚洲狼人综合干| 一区二区三区中文字幕| 国产在线视频网| 国产嫩草一区二区三区在线观看| 日韩国产欧美三级| 国产系列精品av| 精品国产欧美一区二区五十路| 香蕉久久夜色精品国产使用方法|