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

欧美日韩另类图片| 国产不卡一区二区在线观看| 久久综合久久综合这里只有精品| 成人做爰69片免网站| ,一级淫片a看免费| 成人中文字幕视频| 国产精品免费丝袜| 91禁外国网站| 久久久精品视频国产| 毛片在线免费| 91九色丨porny丨国产jk| 免费在线观看av网址| 天天免费亚洲黑人免费| 国产成人一级电影| 一区二区亚洲欧洲国产日韩| 欧美一卡2卡3卡4卡| 国产欧美在线观看| 粉嫩av蜜桃av蜜臀av| 激情网站在线| 99国产精品久久久久久久| 制服视频三区第一页精品| 日韩久久不卡| 无码人妻久久一区二区三区不卡| 精品亚洲自拍| 亚洲成人动漫在线观看| 2020国产精品久久精品不卡| 色欲一区二区三区精品a片| 欧美性片在线观看| 久久九九国产精品| 欧美与欧洲交xxxx免费观看| 在线观看亚洲免费视频| 日本三级韩国三级欧美三级| 国内精品伊人久久久久影院对白| 中文字幕自拍vr一区二区三区| 亚洲精品无码久久久久久| 天天干天天摸天天操| 亚洲国产三级| 亚洲国产成人精品久久久国产成人一区 | 免费在线观看污网站| 久草福利在线视频| 久久综合伊人| 国产一区二区三区在线观看网站| 欧美女人性生活视频| 亚洲av成人无码久久精品老人 | 精品国产乱码一区二区三区四区| 国产亚洲欧美精品久久久久久| 欧美国产亚洲精品| 亚洲一二三区不卡| 国产综合色一区二区三区| 日本少妇在线观看| 一区二区小说| 在线看国产一区| 一区二区三视频| 国产suv一区二区| 欧美精品播放| 亚洲激情电影中文字幕| 欧美 国产 日本| 蜜桃传媒在线观看免费进入| 亚洲男同性恋视频| 国产女人水真多18毛片18精品 | 国产精品专区h在线观看| 国产一区在线观看免费| 日韩成人精品| 天天综合天天做天天综合| 久久精品久久精品国产大片| 国产亚洲久一区二区| 一精品久久久| 日韩精品免费一线在线观看| 日韩精品一区中文字幕| 日本最黄一级片免费在线| 国产成人精品免费在线| 日韩暖暖在线视频| 亚洲国产精品免费在线观看| 欧美jizz19性欧美| 欧美精品一区二区久久婷婷| 成人观看免费完整观看| 黑人巨大亚洲一区二区久| 亚洲色图在线播放| 欧美精品中文字幕一区二区| 97超碰国产在线| 奇米影视在线99精品| 欧美激情中文字幕乱码免费| 国产熟女一区二区| 国产96在线亚洲| 色综合天天性综合| 免费的一级黄色片| 国产一级在线观看| 中文字幕的久久| 肥熟一91porny丨九色丨| 亚洲国产视频一区二区三区| 日日摸夜夜添夜夜添亚洲女人| 美女啪啪无遮挡免费久久网站| 无码人妻精品一区二区三区温州 | 国产精品专区一| 国产又粗又黄又爽的视频| 国产精品自拍三区| 日本一本a高清免费不卡| 国产精品传媒在线观看| 国产中文字幕精品| 国产精品对白刺激| 中文字幕第15页| 中文不卡在线| 午夜精品久久久99热福利| 日本黄色片免费观看| 欧美精品福利| 欧美综合第一页| 久久9999久久免费精品国产| 久久久久久久久国产一区| 亚洲视频综合网| 日韩片在线观看| av一区二区高清| 亚洲精品色婷婷福利天堂| 稀缺呦国内精品呦| 国产一区精品二区| 欧美日本在线视频| 美女喷白浆视频| 亚洲最大成人| 91精品国产欧美一区二区18| 91传媒理伦片在线观看| jizzjizz欧美69巨大| 精品中文字幕视频| 久久久久亚洲av片无码| 日韩视频一区| 91久久久久久久久久久久久| 亚洲天堂中文网| 久久性色av| 亚洲综合一区二区不卡| av资源免费看| 久久精品网站免费观看| 欧美做受777cos| 久久久久久国产精品免费无遮挡| 最新欧美精品一区二区三区| 最新中文字幕久久| 超鹏97在线| 亚洲综合图片区| 男人添女荫道口女人有什么感觉| 欧美理论片在线播放| 精品视频一区 二区 三区| 日日噜噜噜噜久久久精品毛片| jizz国产精品| 麻豆乱码国产一区二区三区| 久久久久久久久久久久久女过产乱| 亚洲欧美日韩国产综合精品二区| 日本电影亚洲天堂| 黄色av网址在线| 99热精品国产| 任我爽在线视频精品一| av在线免费观看网站| 亚洲欧洲日产国产综合网| 免费裸体美女网站| 色先锋久久影院av| 中文字幕精品久久| 国产精品熟女视频| 久久久久久久久伊人| 无码人妻丰满熟妇区96| 国产成人精品一区二三区在线观看 | 亚洲乱码一区av黑人高潮| 色婷婷av777| 91久久夜色精品国产按摩| 欧美激情网友自拍| www.四虎在线观看| 久久久久久免费网| 99爱视频在线| 性欧美lx╳lx╳| 97久久伊人激情网| 手机av免费在线观看| 午夜激情一区二区三区| 538任你躁在线精品免费| 视频欧美一区| 欧美高清视频在线| 亚洲av无码不卡| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美精品在线观看播放| 国产污在线观看| 一区福利视频| 国产欧美日韩中文| 日本韩国在线视频爽| 欧美久久久久免费| 日本a级片视频| 国产成人在线电影| 欧美三级一级片| 久久av免费看| 欧美高跟鞋交xxxxxhd| 亚洲av综合色区无码一二三区| 一二三区精品视频| 野花视频免费在线观看| 精品一区av| 国产在线播放不卡| 日本性爱视频在线观看| 亚洲加勒比久久88色综合 | 日本精品视频一区二区| 日本中文字幕精品| 亚洲黄色毛片| 欧洲一区二区日韩在线视频观看免费| 亚州一区二区三区| 日韩精品日韩在线观看| 无码人妻精品一区二区三区9厂| 日本一区二区视频在线| 国自产拍偷拍精品啪啪一区二区| 亚洲图片小说区| 亚洲色图国产精品| 亚洲午夜精品久久久| 尤物在线观看一区| 国产成人美女视频| 精品久久久久中文字幕小说| 成人黄色生活片| www.91在线| 日韩一区二区三区免费观看| 91视频免费看片| 蜜桃伊人久久| 久久99精品久久久久子伦| yw.尤物在线精品视频| 欧美激情18p| 高清毛片在线看| 一本久道久久综合中文字幕| 日本裸体美女视频| 99久久精品国产观看| 天天夜碰日日摸日日澡性色av| 国产一区二区三区电影在线观看 | 久久精品综合一区| 国产激情综合| 日韩美女免费观看| 超碰97国产精品人人cao| 中文字幕精品—区二区| 亚洲aⅴ乱码精品成人区| 日韩一区二区三免费高清| 人人妻人人爽人人澡人人精品| 亚洲综合色婷婷| 国产精品久久久免费看| 久久久久久久久久久久久久久99| 中文字幕一区二区三区人妻在线视频 | 亚洲一区 二区| 欧美成人免费全部| 国产乱视频在线观看| 亚洲国产日韩欧美在线动漫| av片免费播放| 欧美日韩国产精品成人| 伊人中文字幕在线观看| 久久久久久亚洲综合| 欧美双性人妖o0| 久久国产主播| 免费看黄在线看| 国产一区久久| 久久久福利视频| 97久久综合区小说区图片区| 成人欧美一区二区三区在线湿哒哒| 性欧美hd调教| 欧美一区二区三区精品电影| 国产乱码午夜在线视频| 国产亚洲精品久久久优势| 香蕉视频免费在线看| 精品国产乱码久久久久久牛牛| 国产99视频在线| 日韩一区国产二区欧美三区| 99久久久国产精品无码免费| 亚洲成在人线在线播放| 久久久精品人妻一区二区三区四| 成人欧美一区二区三区在线播放| 香蕉成人在线视频| 中文字幕一区二区三区乱码在线| 亚洲一区二区三区三州| 国产真实乱子伦精品视频| 日本高清久久久| 国产在线一区二区综合免费视频| 亚洲va综合va国产va中文| 狠狠色狠狠色综合日日91app| 精品综合久久久久| 国产一区日韩二区欧美三区| 杨幂一区二区国产精品| 国产69精品久久久久毛片| 中文字幕在线观看91| av在线一区二区三区| av网站免费在线播放| 久久久久国产免费免费 | 看黄色一级大片| 欧美性一区二区| 久久久99精品| 亚洲国产成人av好男人在线观看| 日本视频www| 色偷偷88欧美精品久久久| 一区二区三区在线免费观看视频| 亚洲国产aⅴ天堂久久| 国产成人精品a视频一区| 国产精品国产自产拍在线| 黄色录像免费观看| 久久久噜噜噜久久人人看 | 六月丁香久久丫| 日产精品一线二线三线芒果| 国产高清一区| 欧美xxxx黑人又粗又长密月| 国产一区二区三区探花 | 欧美一区免费| 图片区小说区区亚洲五月| 北条麻妃一区二区三区在线| 激情视频一区二区| 日本高清免费电影一区| 美女精品国产| 日韩在线视屏| 欧美色图亚洲自拍| 午夜精品一区二区三区国产| 97干在线视频| 91精品精品| 日韩国产一级片| 久久国产福利国产秒拍| 男女曰b免费视频| 久久电影网电视剧免费观看| 国产原创剧情av| 欧美国产1区2区| 精品午夜福利视频| 欧美日韩在线亚洲一区蜜芽| 亚洲第一天堂影院| 中文欧美在线视频| 国产无遮挡裸体视频在线观看| 国产精品久久久久久久一区探花| 伊人色综合一区二区三区影院视频| 国产精品揄拍一区二区| 久久免费视频66| 热这里只有精品| 久久最新视频| 国产又粗又猛又色| 99久久免费精品高清特色大片| 免费在线观看a视频| 亚洲国产精品久久艾草纯爱| 亚洲一区 中文字幕| 日韩激情av在线播放| 羞羞电影在线观看www| 国产精品女视频| 小说区图片区色综合区| 免费特级黄色片| 国内精品写真在线观看| 国内精品卡一卡二卡三| 精品国产999| 99久久夜色精品国产亚洲| 一区二区三区动漫| 亚洲国产成人二区| 国产成人精品免费视频| 国产a亚洲精品| 国产欧美亚洲视频| 视频国产一区| jizzjizz国产精品喷水| 懂色av中文字幕一区二区三区| 秋霞欧美一区二区三区视频免费| 色噜噜狠狠成人网p站| 香蕉视频黄色片| 97在线视频精品| 国产精品17p| 日韩成人三级视频| 国产xxx精品视频大全| 色婷婷在线视频观看| 欧美精品少妇一区二区三区 | 成人精品视频.| 日本丰满少妇裸体自慰| 亚洲国产三级在线| www国产在线| 欧美日韩xxxxx| 视频一区视频二区欧美| 久久久天堂国产精品| 国产一区二区三区不卡在线观看| 中文字幕资源站| 7777精品伊人久久久大香线蕉的| 日本蜜桃在线观看| 亚洲一区制服诱惑| 欧美三级网页| 中文字幕天堂av| 偷拍一区二区三区| 天天操天天干天天| 欧美在线视频在线播放完整版免费观看 | 欧美亚洲国产一区| 农村妇女精品一二区| 久久精品在线观看| 这里只有久久精品视频| 中文字幕成人精品久久不卡 | 一本色道综合亚洲| 成人在线视频成人| 成人免费自拍视频| 欧美黄污视频| 国产极品一区二区| 91高清在线观看| 免费在线午夜视频| 久久免费少妇高潮久久精品99| 日韩精品第一| 亚洲一区二区三区乱码| 国产偷自视频区视频一区二区| 亚洲一区二区中文字幕在线观看| 91美女在线视频| 麻豆国产尤物av尤物在线观看 | 超碰在线97免费| 中文字幕一区二区三区av| www国产一区| 欧洲永久精品大片ww免费漫画| 日本电影一区二区| 色婷婷狠狠18禁久久| 粉嫩av一区二区三区免费野| 国产精品国产一区二区三区四区 | 日韩精品――色哟哟| 精品久久久久久久久久久久久久| 国产69精品久久app免费版| av蓝导航精品导航| 婷婷六月综合| 91精品啪在线观看国产|