精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品自拍一区| 精品国产一区二区三区成人影院 | 制服丝袜成人动漫| 国产人妻人伦精品| 青春草在线观看 | 波多野结衣在线免费观看| 天天色天天射天天综合网| 97久久久精品综合88久久| 国产精品美女网站| 精品在线免费观看视频| 国产剧情在线观看一区| 日韩欧美在线影院| 37pao成人国产永久免费视频| 在线观看av的网站| aaa亚洲精品一二三区| 国产精品久久久久久久久久99| 久草视频手机在线| 亚洲人成精品久久久| 欧美一级免费观看| 国产精品拍拍拍| 国内高清免费在线视频| 国产精品免费人成网站| 精品国产aⅴ麻豆| 精品国产18久久久久久| 快she精品国产999| 91国产中文字幕| 日本老熟俱乐部h0930| 欧美欧美黄在线二区| 精品国精品国产| 亚洲免费黄色录像| 欧美日韩美女| 欧美日韩中国免费专区在线看| 国产一二三四区在线观看| 9色在线观看| 久久久久久黄色| 国产日韩三区| 久久中文字幕精品| 波多野结衣一区二区三区在线 | proumb性欧美在线观看| 成人激情免费在线| 在线观看免费黄色小视频| 丝袜美腿亚洲色图| 欧美一级片免费在线| 国产精品成人久久| 激情久久一区| 欧美韩日一区二区| 欧美日韩在线视频免费播放| 欧美xxxxx视频| 中日韩美女免费视频网址在线观看 | 擼擼色在线看观看免费| 五月天一区二区三区| www.亚洲视频.com| 牛牛电影国产一区二区| 亚洲国产日韩a在线播放| 无码人妻精品一区二区三区99v| 欧美激情办公室videoshd| 中文字幕欧美区| 日韩av免费电影| 国产特黄在线| 中文字幕电影一区| 亚洲一区在线直播| 精品自拍一区| 一区二区三区精品视频在线| a级黄色片免费| ririsao久久精品一区| 亚洲国产日韩在线一区模特| 欧美爱爱视频免费看| 中文字幕资源网在线观看免费| 亚洲1区2区3区4区| 国产女女做受ⅹxx高潮| 成人在线黄色| 91精品国产综合久久精品图片| 在线亚洲国产精品网| 国产拍欧美日韩视频二区| 亚洲精品aa| 精品一区二三区| 久久久无码中文字幕久...| 国产美女激情视频| 亚洲欧美高清| 人体精品一二三区| 中文字幕第315页| 精品伊人久久久久7777人| 99久久精品无码一区二区毛片| 高清一区二区三区四区| 26uuu国产在线精品一区二区| 日本在线观看一区| h视频网站在线观看| 亚洲乱码日产精品bd| 精品欧美一区免费观看α√| 外国电影一区二区| 日韩精品一区二区三区在线播放 | 国产在线精品一区二区夜色 | 一区二区三区蜜桃网| 激情深爱综合网| 欧美一级网址| 日韩成人av在线播放| 日本猛少妇色xxxxx免费网站| 亚洲精品一区二区在线看| 国语对白做受69| 中文字幕一区二区人妻痴汉电车| 国产jizzjizz一区二区| 日本一区二区三区四区高清视频 | 亚洲v精品v日韩v欧美v专区| 999精品视频在线| www国产精品| 中文字幕视频一区二区在线有码| 九九热这里有精品视频| 久久一区亚洲| 国产精品综合久久久久久| 国产高清免费在线播放| 午夜婷婷国产麻豆精品| 97超碰人人爽| 国产欧美日韩在线观看视频| 欧美福利视频在线| 中文字幕一区二区在线视频| av电影天堂一区二区在线观看| 亚洲视频精品一区| 中文字幕高清在线播放| 精品国产一区二区精华| 天天色影综合网| 丝袜诱惑制服诱惑色一区在线观看 | 台湾佬综合网| 欧美黄色三级网站| 亚洲一级片免费看| 国产亚洲精品超碰| 欧美在线观看成人| 给我免费播放日韩视频| 在线亚洲欧美视频| 亚洲黄色激情视频| a美女胸又www黄视频久久| av动漫在线播放| 亚洲午夜剧场| 伊是香蕉大人久久| 国产一区二区视频免费| 91亚洲精品久久久蜜桃| 精品成在人线av无码免费看| www.欧美| 久久久精品一区二区| 中文字幕+乱码+中文乱码www| 久久综合999| 国产青青在线视频| 欧美一区二区三区红桃小说| 欧美精品videofree1080p| 精品国产亚洲av麻豆| 日韩美女视频一区| 性生活在线视频| 中文字幕一区二区三区在线视频 | 亚洲欧美综合色| 天天色综合社区| 日韩在线欧美| 国产自摸综合网| 国产鲁鲁视频在线观看特色| 3751色影院一区二区三区| av最新在线观看| 极品美女销魂一区二区三区免费| 一区二区91美女张开腿让人桶| 久久伊人国产| 久久精品精品电影网| 91久久精品国产91性色69 | 亚洲女成人图区| 久久精品五月天| 国产精品女主播在线观看| 亚洲小视频网站| 欧美日本一区二区视频在线观看| 国产高清在线一区二区| 182在线视频观看| 亚洲女人被黑人巨大进入al| 中文字幕久久熟女蜜桃| 综合久久一区二区三区| 一起草最新网址| 国产精品久久久久久久免费软件| 日本午夜精品电影| 成人永久在线| 性欧美亚洲xxxx乳在线观看| 国产三级在线| 6080亚洲精品一区二区| 中文字幕第28页| 久久久青草青青国产亚洲免观| 久久久精品在线视频| 久久人体视频| 国产伦精品一区二区三区免 | 伊人狠狠色j香婷婷综合| 国产一区免费视频| 国产成人a视频高清在线观看| 欧美成人精品在线| 国产中文在线视频| 日韩美女天天操| 三级网站在线播放| 一区二区三区久久久| 国产sm调教视频| 国产91色综合久久免费分享| 精品久久久久久无码国产| 欧美一区二区三区另类| 欧美一区二区三区在线播放| 成人国产精品久久| 日韩免费观看网站| 蜜臀av国内免费精品久久久夜夜| 国产亚洲精品日韩| 国产刺激高潮av| 3d动漫精品啪啪1区2区免费| 国产精品久久久久久久久久精爆| 亚洲激情av在线| 欧美 日韩 国产 成人 在线观看| 国产成人8x视频一区二区| 天天视频天天爽| 亚洲精品系列| 少妇高潮大叫好爽喷水| 日韩av在线播放网址| 久久福利电影| 91免费精品国偷自产在线在线| 国产精品在线看| 日韩欧美精品一区二区三区| 欧美另类交人妖| 天堂中文8资源在线8| 精品无人国产偷自产在线| 在线观看一二三区| 欧美日韩激情视频| 国产午夜手机精彩视频| 中文字幕国产精品一区二区| 菠萝菠萝蜜网站| 国产精品中文字幕一区二区三区| 北条麻妃av高潮尖叫在线观看| 欧美一区亚洲| 亚洲精品国产一区| 蜜桃一区二区| 国产九色精品| 9l视频自拍蝌蚪9l视频成人| 国产免费亚洲高清| 欧美18av| 久久久成人精品视频| 成人免费在线电影| 精品偷拍各种wc美女嘘嘘| 亚洲h视频在线观看| 91精品国产乱| 一级日韩一级欧美| 欧美在线啊v一区| www成人在线| 精品国产精品自拍| 国产一级黄色av| 亚洲黄色性网站| 久草网站在线观看| √…a在线天堂一区| 欧美黄色高清视频| 久久综合久久综合久久综合| 国产毛片毛片毛片毛片毛片毛片| 国产精品88av| 中文字幕第66页| 狂野欧美一区| 冲田杏梨av在线| 日本免费新一区视频| 好男人www社区| 美国三级日本三级久久99| 免费看污污网站| 日本不卡在线视频| 中文字幕第88页| 久久精品国产精品亚洲精品| 自拍偷拍21p| 久久精品国产亚洲高清剧情介绍| 91精品国产三级| 成人亚洲一区二区一| 无码国产精品一区二区免费式直播 | 亚洲精品写真福利| 国产精选第一页| 午夜在线电影亚洲一区| 日韩av一二三区| 在线影视一区二区三区| 波多野结衣午夜| 欧美精品在线视频| 91精品国产综合久| 亚洲成人黄色网址| 午夜视频在线播放| 亚洲人成在线电影| 欧美性videos| 久久韩国免费视频| 亚洲区欧洲区| 日本久久久久久久久久久| av一区在线播放| 91精品久久久久久久久久入口 | 亚洲不卡在线观看| 国产精品va无码一区二区三区| 欧美天堂一区二区三区| 在线观看中文字幕av| 日韩欧美成人一区二区| 免费福利在线观看| 视频在线观看一区二区| 日本理论片午伦夜理片在线观看| 日韩美女主播视频| 亚洲午夜剧场| 久久国产精品免费一区| 精品国产一区二区三区小蝌蚪| 欧美日韩一级在线| 亚洲美女一区| 欧美亚洲日本在线观看| 国产精品一二三四| 在线观看日韩精品视频| 国产精品国模大尺度视频| 一级aaa毛片| 欧美午夜在线观看| 国产成人手机在线| 中文日韩电影网站| 超碰资源在线| 成人激情春色网| 亚洲精品亚洲人成在线观看| 国产一二三四五| 久久国产福利| 麻豆网站免费观看| 国产精品区一区二区三| 日韩三级视频在线| 欧美一区二区三区视频免费| 国产综合视频一区二区三区免费| 欧美成在线观看| 欧美日韩精品一区二区三区视频| 国产亚洲情侣一区二区无| 色男人天堂综合再现| 蜜臀av无码一区二区三区| 国精品**一区二区三区在线蜜桃| 中文字幕影片免费在线观看| 亚洲欧美在线高清| 中文字幕日本人妻久久久免费 | av在线女优影院| 久久久久久亚洲精品| 亚洲国产伊人| 伊人久久大香线蕉精品| 在线综合亚洲| 午夜视频在线免费看| 国产精品久久久久久久蜜臀 | 国产久一一精品| 综合伊思人在钱三区| 激情深爱综合网| 成人自拍视频在线观看| 中国一级片在线观看| 欧美日本韩国一区二区三区视频 | 在线成人激情视频| 麻豆mv在线看| 91在线无精精品一区二区| 久久久久国产| www亚洲成人| 久久综合五月天婷婷伊人| 色网站在线播放| 337p日本欧洲亚洲大胆精品| 日本大胆在线观看| 91在线|亚洲| 婷婷亚洲最大| 日韩久久久久久久久久久| 最新国产の精品合集bt伙计| 亚洲天堂中文字幕在线| 久久人人爽人人爽爽久久| 91天天综合| 亚洲精品8mav| 久久超碰97人人做人人爱| 亚洲色图100p| 欧美日韩一区二区三区高清 | 国产精品久久二区二区| 最近中文字幕免费在线观看| 有码中文亚洲精品| 999精品嫩草久久久久久99| 日韩国产精品毛片| 韩国毛片一区二区三区| 久久久美女视频| 亚洲第一网中文字幕| 永久免费毛片在线播放| 欧美三级网色| 日韩av一区二区在线影视| 亚洲 欧美 变态 另类 综合| 欧美一区二区三区不卡| 少女频道在线观看高清| 精品在线视频一区二区| 久久一区欧美| 免费看的黄色录像| 欧美一级日韩一级| heyzo高清中文字幕在线| 欧美午夜精品久久久久免费视| 日韩精品久久久久久| 免费一级suv好看的国产网站| 日韩欧美美女一区二区三区| xxxx成人| 欧美自拍资源在线| 国产福利视频一区二区三区| 黄网站免费在线| 色哟哟亚洲精品一区二区| 国产剧情一区二区在线观看| 国产一线二线三线女| 国产偷国产偷精品高清尤物| 一级片在线观看视频| 久久久久久久久久久av| 欧美精选视频在线观看| 国产女同无遮挡互慰高潮91| 欧美色另类天堂2015| 黄网页免费在线观看| 国产伦精品一区二区三区| 美女视频一区二区三区| 久久国产在线视频| 亚洲精品网址在线观看| 久久精品九色| 国产乱子夫妻xx黑人xyx真爽| 亚洲欧美一区二区三区国产精品 | 97视频一区| 婷婷激情四射五月天| 婷婷综合五月天| 蜜桃视频在线观看www社区|