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

在 Node.js 中發出 HTTP 請求的五種方法

開發 前端
axios比superagent的功能列表很長,盡管 node-fetch 看起來很有前途并且安裝大小很小,但我不確定該 API 是否足夠用戶友好——至少對我來說是這樣。 您可能會注意到我的討論

原文來源:https://blog.logrocket.com/5-ways-make-http-requests-node-js/

原文作者:Geshan Manandhar

譯者:一川

在 Node.js 中發出 HTTP 請求的方法有多種。可以通過使用 Node.js 提供的標準內置 HTTP/HTTPS 模塊、利用 Node 環境中包含的 Fetch API 或選擇第三方 npm 包來簡化流程來實現此目的。

在本文中,將探索本機 HTTPS 模塊和 Fetch API,并研究流行的 npm 包,例如 Axios、Got、superagent 和 node-fetch,以促進高效地發出 HTTP 請求。

將使用每個 HTTP 客戶端向 JSONPlaceholder API 發出 GET 請求。它將向我們發送 10 個用戶的數據。將在控制臺上記錄每個用戶名和 ID。

Let’s get started!

標準 Node.js HTTP(S) 模塊

Node.js 帶有內置的 HTTP 和 HTTPS 模塊。在下面的示例中,使用 HTTPS 模塊對占位符 API 執行 GET 請求:

const https = require('https');

https.get('https://jsonplaceholder.typicode.com/users', res => {
  let data = [];
  const headerDate = res.headers && res.headers.date ? res.headers.date : 'no response date';
  console.log('Status Code:', res.statusCode);
  console.log('Date in Response header:', headerDate);

  res.on('data', chunk => {
    data.push(chunk);
  });

  res.on('end', () => {
    console.log('Response ended: ');
    const users = JSON.parse(Buffer.concat(data).toString());

    for(user of users) {
      console.log(`Got user with id: ${user.id}, name: ${user.name}`);
    }
  });
}).on('error', err => {
  console.log('Error: ', err.message);
});

讓我們看一下代碼,需要使用nodejs內置的 https 模塊,該模塊在任何標準 Node.js 安裝中都可用。無需 package.json 文件或 npm install 即可開始使用它。

接下來,將 data 初始化為空數組,并記錄響應標頭中的狀態代碼和日期。每當獲得一塊數據時,就把它推入 data 數組中。收到所有響應后,連接數據數組,將其轉換為字符串,并解析 JSON 以獲取用戶列表。循環訪問用戶并將用戶 ID 和名稱記錄到控制臺。

這里需要注意一件事:如果請求出現錯誤,錯誤消息將記錄在控制臺上。上述代碼可作為拉取請求使用。

您可以使用 node native-https.js 命令執行上面的代碼,前提是您將文件命名為 native-https.js 。它應該顯示如下輸出:

圖片圖片

可以使用相同的方法來運行本文中的所有其他示例;他們將顯示類似的輸出。打印狀態代碼、響應標頭中的日期以及響應正文中的用戶 ID 和名稱。

內置Fetch API

Node.js 在 v16.15.0 中提供了 Fetch API 的瀏覽器兼容實現的實驗版本,并在 Node v21 中變得穩定。

Fetch 在環境中本身可用,無需導入或單獨需要。這個內置 API 具有多種優勢:無需持續維護,最大限度地減少安全問題,并且不會影響捆綁包大小或通常與第三方軟件包相關的許可問題。

您可以將 Fetch API 與 async/await 或 Promise 鏈結合使用:

(async () => {
  try {
    const res = await fetch('https://jsonplaceholder.typicode.com/users');
    const headerDate = res.headers && res.headers.get('date') ? res.headers.get('date') : 'no response date';
    console.log('Status Code:', res.status);
    console.log('Date in Response header:', headerDate);

    const users = await res.json();

    for(user of users) {
      console.log(`Got user with id: ${user.id}, name: ${user.name}`);
    }
  } catch (err) {
    console.log(err.message); //can be console.error
  }
})();

由于 Fetch API 與瀏覽器兼容,因此您為使用 Fetch API 在瀏覽器中獲取數據而編寫的代碼也可以在 Node.js 中使用而無需修改,反之亦然。

Axios

Axios 是一個非常流行的基于 Promise 的請求庫。它是一個適用于瀏覽器和 Node.js 的 HTTP 客戶端。它還包括一些方便的功能,例如攔截請求和響應數據,以及自動將請求和響應數據轉換為 JSON。

const axios = require('axios');

axios.get('https://jsonplaceholder.typicode.com/users')
  .then(res => {
    const headerDate = res.headers && res.headers.date ? res.headers.date : 'no response date';
    console.log('Status Code:', res.status);
    console.log('Date in Response header:', headerDate);

    const users = res.data;

    for(user of users) {
      console.log(`Got user with id: ${user.id}, name: ${user.name}`);
    }
  })
  .catch(err => {
    console.log('Error: ', err.message);
  });

上面的示例中的代碼比前一個示例中的代碼少,因為它使用了 Promise 鏈。但是,您可以將其變成 async/await。

解釋一下上面的例子做了什么。需要使用 axios 庫,然后使用 axios.get 方法向 JSONPlaceholder API 發出 GET 請求。使用承諾鏈來處理響應。在 then 方法回調中,將狀態代碼和日期記錄到控制臺。

Axios 將響應數據轉換為開箱即用的 JSON。上例中的響應數據是用戶數組。循環遍歷它并將用戶 ID 和名稱記錄到控制臺。

Got

Got 是 Node.js 的另一個流行的 HTTP 請求庫。 Got 具有基于承諾的 API,其 HTTP/2 支持和分頁 API 是其獨特的特點。

const got = require('got');

got.get('https://jsonplaceholder.typicode.com/users', {responseType: 'json'})
  .then(res => {
    const headerDate = res.headers && res.headers.date ? res.headers.date : 'no response date';
    console.log('Status Code:', res.statusCode);
    console.log('Date in Response header:', headerDate);

    const users = res.body;
    for(user of users) {
      console.log(`Got user with id: ${user.id}, name: ${user.name}`);
    }
  })
  .catch(err => {
    console.log('Error: ', err.message);
  });

上面的代碼示例與 Axios 類似,但有兩個主要區別:

  1. 我們需要將 {responseType: 'json'} 作為第二個參數傳遞給 get 方法,以指示響應為 JSON 格式
  2. 狀態代碼標頭稱為 statusCode ,而不是 status

其他的與之前對 axios 的要求保持一致。您可以在此拉取請求中看到上面的示例。

superagent

superagent 于 2011 年 4 月由 VisionMedia 首次發布,是最古老的 Node.js 請求包之一。 superagent 將自己定位為“小型、漸進式客戶端 HTTP 請求庫和 Node.js 模塊,具有相同的 API,支持許多高級 HTTP 客戶端功能。”它提供基于回調和基于承諾的 API。 superagent 有幾個插件,您可以使用它來擴展其功能。

const superagent = require('superagent');

(async () => {
  try {
    const res = await superagent.get('https://jsonplaceholder.typicode.com/users');
    const headerDate = res.headers && res.headers.date ? res.headers.date : 'no response date';
    console.log('Status Code:', res.statusCode);
    console.log('Date in Response header:', headerDate);

    const users = res.body;
    for(user of users) {
      console.log(`Got user with id: ${user.id}, name: ${user.name}`);
    }
  } catch (err) {
    console.log(err.message); //can be console.error
  }
})();

Superagent 已經成熟且經過實戰考驗,因此非常可靠。我們還可以使用 SuperTest 庫測試超級代理調用。與前面的示例一樣,上面的超級代理示例可作為拉取請求使用。

node-fetch

node-fetch 是 Node.js 的另一個非常流行的 HTTP 請求庫 - 根據 npm 趨勢,在 2024 年 2 月的第一周,它的下載量超過 5000 萬次。

用他們自己的話來說,“node-fetch 是一個輕量級模塊,它將 Fetch API ( window.fetch ) 引入 Node.js?!逼涔δ馨ㄅc基于瀏覽器的 window.fetch 以及本機 Promise 和異步函數的一致性。

const fetch = require('node-fetch');

(async () => {
  try {
    const res = await fetch('https://jsonplaceholder.typicode.com/users');
    const headerDate = res.headers && res.headers.get('date') ? res.headers.get('date') : 'no response date';
    console.log('Status Code:', res.status);
    console.log('Date in Response header:', headerDate);

    const users = await res.json();
    for(user of users) {
      console.log(`Got user with id: ${user.id}, name: ${user.name}`);
    }
  } catch (err) {
    console.log(err.message); //can be console.error
  }
})();

讓我們回顧一下與使用 superagent 和 async/await 的示例相比的一些差異:

  • node-fetch 不需要顯式的 GET 方法; HTTP 動詞可以作為第二個參數中的 method 鍵發送,該參數是一個對象。例如: {method: 'GET'}
  • 另一個區別是標頭是一個對象,具有 get 方法來獲取標頭值。我們調用 res.headers.get('date') 來獲取日期響應頭的值

Node HTTP請求方式對比

除了內置的 HTTP/HTTPS 模塊和內置的 fetch API 之外,所有其他四個 HTTP 客戶端庫都可以作為 npm 包提供。以下是根據 npm 趨勢顯示的過去六個月每周下載統計數據的快速概覽:

從每月下載量來看,過去六個月中,node-fetch 最受歡迎,而 superagent 則最不受歡迎。為了更全面地了解它們的受歡迎程度,讓我們檢查其他指標,從 Got GitHub 存儲庫上提供的比較表中獲取見解:

從上表來看,node-fetch 是下載次數最多的軟件包,最大安裝大小為 7.45MB。 Axios 擁有最多的 GitHub 星數,達到 10.3 萬——比其他所有三個庫的總和還多。

使用 Express.js 實現 HTTP 服務

const express = require("express");
const app = express();

const PORT = process.env.PORT || 3000;

app.get("/", (req, res) => {
  res.send("Hello world!");
});

app.listen(PORT, () => {
  console.log(`Your app is listening on port ${PORT}`);
});

這就是使用 Express.js 實現基本 HTTP 服務的方式。

處理Node HTTPS POST 請求

在本節中,我們將探討如何在 Node.js 服務器中處理 POST 請求。當用戶提交 HTML 表單或發出 AJAX POST 請求時,會發生典型的 POST 請求。

當 POST 請求到達其預期端點時,您將訪問 POST 數據,在回調函數中解析它,驗證和清理數據,并可能發回響應。但是,您應該意識到,在使用普通 Node.js 服務器時,解析 HTTP 請求正文可能會很乏味。

下面的代碼是普通 Node.js HTTP 服務器的基本實現。它有一個基本的 HTML 表單,您可以使用它來發出 POST 請求。請求正文的結構取決于編碼類型。這些編碼類型包括 application/x-www-form-urlencoded 、 multipart/form-data 和 text/plain :

const http = require("http");

const html = `
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" cnotallow="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <form actinotallow="/submit-form" enctype="application/x-www-form-urlencoded" method="POST">
      <label> Enter Name: 
        <input type="text" autocomplete="name" name="name" required />
      </label>
      <input type="submit" />
    </form>
  </body>
</html>
`;
const server = http.createServer((req, res) => {
  switch (req.method) {
    case "GET":
      if (req.url === "/") {
        res.writeHead(200, { "Content-Type": "text/html" });
        res.end(html);
      } else {
        res.writeHead(404, { "Content-Type": "text/plain" });
        res.end("Page not found");
      }
      break;
    case "POST":
      if (req.url === "/submit-form") {
        let body = "";
        req.on("data", (data) => {
          body += data;
        });

        req.on("end", () => {
          console.log("Request body:  " + body);
          // Parse, validate, and sanitize
          res.writeHead(200, { "Content-Type": "application/json" });
          res.end(JSON.stringify({ body }));
        });
      } else {
        res.writeHead(404, { "Content-Type": "text/plain" });
        res.end("Page not found");
      }
      break;
    default:
      res.writeHead(405, { "Content-Type": "text/plain" });
      res.end("Method not supported");
  }
});

const PORT = process.env.PORT || 3000;

server.listen(PORT, () => {
  console.log(`Your app is listening on PORT ${PORT}`);
});

解析 POST 請求正文后,您需要驗證和清理數據。然后,您可以將數據保存在數據庫中、對用戶進行身份驗證或重定向到適當的頁面。

大多數后端框架都具有用于解析 HTTP 請求正文的內置功能。使用 Express.js,當請求正文具有 application/x-www-form-urlencoded 編碼時,您可以使用內置的 express.urlencoded() 中間件。中間件將使用請求數據的鍵值對填充 req.body :

const express = require("express");
const path = require("path");
const app = express();

const PORT = process.env.PORT || 3000;

app.use(express.static("public"));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.post("/submit-form", (req, res) => {
  console.log(req.body);
  res.json(req.body);
});

app.get("/", (req, res) => {
  res.sendFile(path.join(__dirname, "index.html"));
});

app.listen(PORT, () => {
  console.log(`Your app is listening on port ${PORT}`);
});

對于 multipart/form-data 編碼,需要使用第三方包,例如busboy、Multer或formidable。

下面的代碼說明了如何使用 Multer。由于它不是內置中間件,因此請務必首先從 npm 包注冊表安裝它:

const express = require("express");
const path = require("path");
const multer = require("multer");
const app = express();
const upload = multer();

const PORT = process.env.PORT || 3000;

app.use(express.static("public"));

app.post("/submit-form", upload.none(), (req, res) => {
  console.log("req.body: ", req.body);
  console.log("Content-Type: ", req.get("Content-Type"));
  res.json(req.body);
});

app.get("/", (req, res) => {
  res.sendFile(path.join(__dirname, "index.html"));
});

app.listen(PORT, () => {
  console.log(`Your app is listening on port ${PORT}`);
});

最后,Express還有一個內置的中間件,用于解析具有 text/plain 編碼的請求體。它的用法與我們之前看過的中間件類似。你可以像這樣安裝它:

app.use(express.text());

總結

axios比superagent的功能列表很長,盡管 node-fetch 看起來很有前途并且安裝大小很小,但我不確定該 API 是否足夠用戶友好——至少對我來說是這樣。

您可能會注意到我的討論中省略了 Request npm 包。盡管 Request 持續受歡迎,每周下載量達到 1142 萬次,但截至 2024 年 2 月已被棄用,這使其成為一個不切實際的選擇。

所有這些庫主要做同樣的事情——就像你喜歡哪個品牌的咖啡一樣,最終你仍然在喝咖啡。根據您的用例明智地選擇,并做出正確的權衡以獲得最大利益。

責任編輯:武曉燕 來源: 宇宙一碼平川
相關推薦

2017-08-17 13:56:30

JavascriptNode.jsHttp

2023-03-24 15:57:31

Node.js應用程序容器

2023-06-16 15:14:57

Node.js容器化開發

2021-10-21 08:59:17

技術HTTP攻擊

2025-03-10 00:00:22

PDF圖片表格

2021-05-11 07:45:00

HTTPNode.jsCookie

2023-06-30 23:25:46

HTTP模塊內存

2025-10-15 00:26:20

2022-01-07 08:00:00

Node.js開發Web

2023-10-04 07:35:03

2017-04-10 13:28:32

Node.jsJavaScript

2018-01-04 09:46:48

PHPHTTP

2014-03-07 13:43:32

Node.jsNode

2021-12-28 20:04:23

Node.js開發JavaScript

2021-10-03 15:02:50

HTTPNodejs

2014-09-12 10:35:09

Node.jsHTTP 206

2020-04-21 17:04:12

JavaScriptHTTP請求開發

2020-07-24 20:45:51

Spark數據集函數

2021-12-01 00:05:03

Js應用Ebpf

2021-01-27 08:05:55

本地存儲HTTP
點贊
收藏

51CTO技術棧公眾號

国内精品久久久久久久久久| 婷婷社区五月天| 美女写真久久影院| 成人动漫在线免费观看| 欧美理论电影在线精品| 色94色欧美sute亚洲线路一久| 亚洲国产成人不卡| 亚洲精品国产精品国| 鲁大师影院一区二区三区| 久久精品国产亚洲精品| 亚洲久久久久久| 日韩综合av| 五月婷婷另类国产| 亚洲综合五月天| 少妇精品视频一区二区| 麻豆视频观看网址久久| 久久免费精品日本久久中文字幕| 国产sm在线观看| 最新日韩三级| 精品久久在线播放| 中文字幕の友人北条麻妃| 深夜福利视频在线观看| 国产一区二区美女| 国产精欧美一区二区三区| 国产性猛交普通话对白| 99久久婷婷国产综合精品电影√| 日韩av在线免费| 伊人成人免费视频| 欧美日韩国产网站| 狠狠躁18三区二区一区| 日韩 欧美 视频| 麻豆av在线导航| 国产日韩欧美一区二区三区综合| 国产精品国色综合久久| 国产免费黄色录像| 久久电影国产免费久久电影| 日韩av免费在线播放| 亚洲国产精品午夜在线观看| 亚洲一区色图| www.久久久久久.com| 色欲狠狠躁天天躁无码中文字幕 | 一广人看www在线观看免费视频| 成人免费黄色在线| 亚洲欧美日韩久久| 国产亚洲精品日韩| 欧洲一级黄色片| 高潮久久久久久久久久久久久久 | 免费看日韩av| 国产成人自拍高清视频在线免费播放| 国产精品一区二区久久国产| 瑟瑟视频在线免费观看| 日日摸夜夜添夜夜添亚洲女人| 78色国产精品| 中日韩黄色大片| 国产精品入口| 欧美怡春院一区二区三区| 香蕉免费毛片视频| 亚洲少妇在线| 欧洲美女免费图片一区| www.国产高清| 老妇喷水一区二区三区| 2021国产精品视频| 精品人妻一区二区三区免费看 | 91精品国产乱码久久久久久久久 | 欧美亚男人的天堂| 在线免费观看视频黄| 成人黄页网站视频| 欧美久久一区二区| 日本wwwxx| 卡通动漫国产精品| 亚洲美女自拍视频| 少妇精品无码一区二区免费视频| 欧美一区二区三区激情视频| 日韩中文字幕在线观看| 国产又黄又爽又无遮挡| 激情欧美一区| 国产成人亚洲综合91精品| 超碰在线97观看| 极品美女销魂一区二区三区| y111111国产精品久久婷婷| 亚洲aaa在线观看| 国产亚洲va综合人人澡精品 | 免费观看成人高潮| 樱桃视频在线观看一区| 三上悠亚久久精品| 亚州一区二区三区| 欧美日韩在线观看一区二区 | 九九精品在线| 精品国产自在精品国产浪潮| 久久精品国产亚洲av麻豆色欲| 夜夜嗨网站十八久久| 国产精品美女主播| 成人午夜免费在线观看| 日本一区二区三区四区在线视频 | 欧美一区二区三区影视| 精品国产免费久久久久久婷婷| 欧美日韩看看2015永久免费 | 二级片在线观看| 暧暧视频在线免费观看| 在线欧美一区二区| 一级全黄裸体片| 精品99在线| 欧美夫妻性生活视频| 国产一卡二卡三卡| 成人免费观看av| 亚洲欧美电影在线观看| 里番在线播放| 在线不卡一区二区| 精品黑人一区二区三区观看时间| 亚洲h色精品| 国产精品69av| 蜜臀久久99精品久久久| 中文字幕亚洲一区二区av在线| 欧美又粗又长又爽做受| 日本精品裸体写真集在线观看| 日韩欧美激情一区| 黄色免费一级视频| 性xx色xx综合久久久xx| 国产精品久久久久久久久久直播 | 久久国产精品影院| 国产综合激情| 国产日韩在线免费| 国产福利电影在线| 五月天亚洲精品| 韩国三级在线看| 97精品视频在线看| 国产精品国内视频| 色中色在线视频| 亚洲一二三四区不卡| 欧美日韩久久婷婷| 精品一区二区三区中文字幕老牛| 97在线视频一区| 亚洲第一精品网站| 亚洲男人的天堂在线aⅴ视频| 欧美二区在线视频| 久久香蕉精品香蕉| 欧美激情一区二区三区在线视频观看 | 成人国产亚洲精品a区天堂华泰| 黄色美女网站在线观看| 天天免费综合色| 无码人妻精品一区二区三| 夜间精品视频| 91在线免费观看网站| 免费在线观看av| 欧美日韩免费观看一区二区三区| 37p粉嫩大胆色噜噜噜| 国产精品毛片| 日本在线视频一区| 最新日韩一区| 色哟哟网站入口亚洲精品| 日本黄色中文字幕| 国产日韩亚洲欧美综合| 亚洲不卡视频在线| 成人在线视频免费观看| 国产欧美va欧美va香蕉在线| 又爽又大又黄a级毛片在线视频| 欧美日韩一区二区三区四区| 久久一级免费视频| 国产乱码精品一区二区三区忘忧草| 天堂av免费看| 伊色综合久久之综合久久| 欧美大片欧美激情性色a∨久久| 精品人妻伦一二三区久久| 亚洲精品视频免费观看| 中文字幕人妻熟女在线| 在线午夜精品| 日韩激情久久| **国产精品| 久久久久久久久久久人体| 色婷婷av一区二区三| 色综合久久66| 娇小11一12╳yⅹ╳毛片| 国产乱子伦一区二区三区国色天香| 女女百合国产免费网站| 九九热hot精品视频在线播放| 91成人精品网站| av网站在线免费观看| 欧美一区二区三区免费在线看| 国产精品日日夜夜| 国产日韩精品久久久| 999热精品视频| 麻豆91精品| 中日韩在线视频| 高清一区二区三区| 国产精品久久久久影院日本| 污视频免费在线观看| 精品视频—区二区三区免费| 在线免费观看日韩视频| 一区二区三区四区视频精品免费| 性久久久久久久久久| 黄页网站大全一区二区| 欧美在线一区视频| 日韩欧美网址| 精品国产二区在线| 久久青草视频| 欧美亚洲激情视频| 欧美激情黑人| 亚洲精品日韩在线| 国产富婆一级全黄大片| 色拍拍在线精品视频8848| 亚洲xxxx3d动漫| 久久精品夜色噜噜亚洲a∨| 四虎1515hh.com| 日韩精品每日更新| 麻豆tv在线播放| 亚洲国产精品综合久久久| 日本不卡一区二区三区视频| 亚洲成人五区| 国产一区二区香蕉| 自拍网站在线观看| 欧美激情啊啊啊| 97电影在线看视频| 亚洲欧美中文另类| 手机在线观看免费av| 欧美一区欧美二区| 在线免费看av的网站| 色综合久久99| 亚洲一区二区91| 亚洲激情图片小说视频| 国产3级在线观看| 久久久久久影视| 日本五十肥熟交尾| 国产大陆精品国产| www.久久av.com| 可以免费看不卡的av网站| 加勒比成人在线| 欧美日韩一区自拍| japanese在线播放| 婷婷综合五月| 在线成人性视频| 日韩欧美综合| 亚洲成人网上| 精品久久视频| 日韩精品第一页| 国产一区二区三区四区二区| 久久精品午夜一区二区福利| 国内自拍欧美| 精品国产区在线| 欧美一级二级三级视频| 精品伊人久久大线蕉色首页| 农村少妇一区二区三区四区五区| 豆国产97在线| 加勒比中文字幕精品| 国产三级精品在线不卡| 欧美精品中文| 免费在线观看91| 伊人成综合网伊人222| 免费在线观看一区二区| 国产一区二区三区网| 日本一区二区三不卡| 欧美色图激情小说| 四虎永久国产精品| 91综合久久| 国产一区二区三区在线免费| 91久久夜色精品国产九色| 男人日女人逼逼| 日本va欧美va瓶| 日本黄色的视频| 国产精品一区二区在线观看不卡| 日本泡妞xxxx免费视频软件| www.激情成人| 粉嫩av蜜桃av蜜臀av| 日本一区二区综合亚洲| 亚洲精品久久久久久国| 亚洲曰韩产成在线| 中文字幕精品三级久久久| 欧美少妇bbb| 超碰人人人人人人| 亚洲精品日韩久久久| 日本在线免费中文字幕| 久久久久久久爱| 亚洲一区二区三区四区| 亚洲一区二区三区久久| 加勒比久久高清| 亚洲精品人成| 韩日精品在线| 欧美伦理片在线看| 国产精品一区不卡| 黄瓜视频污在线观看| 亚洲天堂网中文字| 五月婷婷激情网| 欧美日韩色一区| 成人午夜免费在线观看| 国产香蕉一区二区三区在线视频| h片在线免费| 欧美性在线视频| 久久久久久爱| 热舞福利精品大尺度视频| 欧美一区二区| 久久九九国产视频| 国产99一区视频免费| 欧美熟妇激情一区二区三区| 亚洲综合另类小说| 在线观看国产成人| 亚洲精品资源在线| 四虎亚洲精品| 国产欧美日韩中文字幕在线| 欧美激情网址| www.18av.com| 美女一区二区视频| 人人妻人人澡人人爽人人精品| 又紧又大又爽精品一区二区| 国产精品xxxxxx| 日韩福利视频在线观看| 在线观看h网| 国产精品一区=区| 色婷婷久久久| 日韩在线视频在线| 久久成人羞羞网站| 加勒比综合在线| 五月综合激情网| 国产肥老妇视频| 日韩一二三在线视频播| 成人小电影网站| 黄色99视频| 激情婷婷久久| 久久久精品视频国产| 国产精品美女久久久久av爽李琼| www.毛片.com| 亚洲激情久久久| 免费污视频在线| 成人免费在线视频网址| 欧美色婷婷久久99精品红桃| 毛片av免费在线观看| 99精品视频在线观看| 青青草成人免费| 日韩三级在线观看| 顶级网黄在线播放| 成人福利在线视频| 国产韩日影视精品| 亚洲va在线va天堂va偷拍| 国产精品国产三级国产aⅴ原创| 波多野结衣爱爱| 国产一区二区三区网站| 热色播在线视频| 国产专区一区二区三区| 亚洲区国产区| a级一a一级在线观看| 婷婷丁香激情综合| 五月天丁香视频| 97色伦亚洲国产| 欧美三级电影在线| 无罩大乳的熟妇正在播放| 日本在线视频网| 精品99999| av中文在线资源| 国产精品一区视频网站| 国产精品mv在线观看| 国产免费a级片| 亚洲国产精品久久久久婷婷884| 亚洲国产精品久久人人爱潘金莲| 久99久在线视频| 久久激情av| 久久黄色免费看| 日韩毛片精品高清免费| 国产av精国产传媒| 久久免费精品视频| 在线观看欧美理论a影院| 深夜黄色小视频| 樱花影视一区二区| 污视频在线免费观看| 热久久免费视频精品| 日本一区二区在线看| 三级黄色片免费看| 亚洲国产美女搞黄色| 男女污污视频在线观看| 国产女人18毛片水18精品| 欧美特黄一级| 黑人巨大精品欧美| 欧美日韩精品一区二区三区 | 久久综合欧美| 亚洲欧洲日本精品| 亚洲综合图片区| 你懂的在线播放| 成人在线小视频| 一本色道久久综合| 亚洲女人毛茸茸高潮| 欧美xfplay| 吞精囗交69激情欧美| gogogo免费高清日本写真| 99久久综合国产精品| 在线免费观看高清视频| 性色av一区二区三区在线观看| 激情综合网站| 中国男女全黄大片| 91久久精品一区二区三区| 日本色护士高潮视频在线观看| 欧美国产一二三区| 国产91对白在线观看九色| 天堂网免费视频| 久久久久久国产精品三级玉女聊斋| 精品久久久久久久久久久aⅴ| 成年人性生活视频| 欧洲精品视频在线观看| 欧美极品少妇videossex| 色姑娘综合网| 日本一区二区三区电影免费观看 | 免费成人深夜夜行视频| 黑人巨大精品欧美一区| 国产又大又粗又爽|