国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

項目實戰(zhàn):使用 Go 構建 GraphQL API

共 12125字,需瀏覽 25分鐘

 ·

2021-01-19 08:59

點擊上方藍色“Go語言中文網(wǎng)”關注,每天一起學 Go

2020/5/16 更新:大家好,我剛剛更新了該項目以使用 Go module。不幸的是,realize[1]很長時間沒有更新并且無法正常工作。如果您想使用實時重新加載器,則還有其他選擇,例如 air[2]。否則,請隨意忽略帖子中有關 realize 的任何內(nèi)容,并按通常的方式運行項目。

本博文中將使用 Go、GraphQL、PostgreSQL 創(chuàng)建一個 API。我已在項目結構上迭代幾個版本,這是我最喜歡的一個。在大部分的時間,我創(chuàng)建 web APIs 都是通過 Node.jsRuby/Rails。而第一次使用 Go 設計 Web apis 時,需要費很大的勁兒。Ben JohnsonStructuring Applications in Go[3] 文章對我有很大的幫助,本博文中的部分代碼就得益于 Ben Johnson 文章的指導,推薦閱讀。

配置

首先,從項目的配置開始。在本篇博文中,我將在 macOS 中完成,但這并不重要。如果在你的 macOS 上還沒有 GoPostGreSQLbradford-hamilton/go-graphql-api[4] 詳細講解了如何在 macOS 上配置 GoPostgreSQL.

創(chuàng)建一個新項目--go-graphal-api,整體項目結構如下:

├──?gql
│???├──?gql.go
│???├──?queries.go
│???├──?resolvers.go
│???└──?types.go
├──?main.go
├──?postgres
│???└──?postgres.go
└──?server
?└──?server.go

有一些額外依賴需要安裝。開發(fā)中熱加載的 realize[5],go-chi 的輕量級路由 chi[6] 和管理 request/response 負載的 render[7],以及 graphql-go/graphql[8]。

go?get?github.com/oxequa/realize
go?get?github.com/go-chi/chi
go?get?github.com/go-chi/render
go?get?github.com/graphql-go/graphql
go?get?github.com/lib/pq

最后,創(chuàng)建一個數(shù)據(jù)庫和一些測試使用的數(shù)據(jù),在 Postgres 的命令行中輸入 psql,創(chuàng)建一個數(shù)據(jù)庫:

CREATE?DATABASE?go_graphql_db;

然后連接上該庫:

\c?go_graphql_db

連接上后,將以下 sql 語句粘貼到命令行:

CREATE?TABLE?users?(
??id?serial?PRIMARY?KEY,
??name?VARCHAR?(50)?NOT?NULL,
??age?INT?NOT?NULL,
??profession?VARCHAR?(50)?NOT?NULL,
??friendly?BOOLEAN?NOT?NULL
);

INSERT?INTO?users?VALUES
??(1,?'kevin',?35,?'waiter',?true),
??(2,?'angela',?21,?'concierge',?true),
??(3,?'alex',?26,?'zoo?keeper',?false),
??(4,?'becky',?67,?'retired',?false),
??(5,?'kevin',?15,?'in?school',?true),
??(6,?'frankie',?45,?'teller',?true);

我們創(chuàng)建了一個基礎的用戶表并新增了 6 條新用戶數(shù)據(jù),對本博文來說已經(jīng)足夠。接下來開始構建我們的 API。

API

在這篇博文中,所有的代碼片段都會包含一些注釋,以幫助理解每一步。

main.go 開始:

package?main

import?(
?"fmt"
?"log"
?"net/http"

?"github.com/bradford-hamilton/go-graphql-api/gql"
?"github.com/bradford-hamilton/go-graphql-api/postgres"
?"github.com/bradford-hamilton/go-graphql-api/server"
?"github.com/go-chi/chi"
?"github.com/go-chi/chi/middleware"
?"github.com/go-chi/render"
?"github.com/graphql-go/graphql"
)

func?main()?{
?//?Initialize?our?API?and?return?a?pointer?to?our?router?for?http.ListenAndServe
?//?and?a?pointer?to?our?db?to?defer?its?closing?when?main()?is?finished
?router,?db?:=?initializeAPI()
?defer?db.Close()

?//?Listen?on?port?4000?and?if?there's?an?error?log?it?and?exit
?log.Fatal(http.ListenAndServe(":4000",?router))
}

func?initializeAPI()?(*chi.Mux,?*postgres.Db)?{
?//?Create?a?new?router
?router?:=?chi.NewRouter()

?//?Create?a?new?connection?to?our?pg?database
?db,?err?:=?postgres.New(
??postgres.ConnString("localhost",?5432,?"bradford",?"go_graphql_db"),
?)
?if?err?!=?nil?{
??log.Fatal(err)
?}

?//?Create?our?root?query?for?graphql
?rootQuery?:=?gql.NewRoot(db)
?//?Create?a?new?graphql?schema,?passing?in?the?the?root?query
?sc,?err?:=?graphql.NewSchema(
??graphql.SchemaConfig{Query:?rootQuery.Query},
?)
?if?err?!=?nil?{
??fmt.Println("Error?creating?schema:?",?err)
?}

?//?Create?a?server?struct?that?holds?a?pointer?to?our?database?as?well
?//?as?the?address?of?our?graphql?schema
?s?:=?server.Server{
??GqlSchema:?&sc,
?}

?//?Add?some?middleware?to?our?router
?router.Use(
??render.SetContentType(render.ContentTypeJSON),?//?set?content-type?headers?as?application/json
??middleware.Logger,??????????//?log?API?request?calls
??middleware.DefaultCompress,?//?compress?results,?mostly?gzipping?assets?and?json
??middleware.StripSlashes,????//?match?paths?with?a?trailing?slash,?strip?it,?and?continue?routing?through?the?mux
??middleware.Recoverer,???????//?recover?from?panics?without?crashing?server
?)

?//?Create?the?graphql?route?with?a?Server?method?to?handle?it
?router.Post("/graphql",?s.GraphQL())

?return?router,?db
}

在上面導入的 gqlpostgresserver 的路徑應該是你本地的路徑,以及 postgres.ConnString() 中連接 PostgreSQL 的用戶名也應該是你自己的,和我的不一樣。

initializeAPI() 分為幾大塊主要的部分,接下來我們逐步構建每一塊。

使用 chi.NewRouter() 創(chuàng)建 router 并返回一個 mux,接下來是創(chuàng)建一個 PostgreSQL 數(shù)據(jù)庫連接。

使用 postgres.ConnString() 創(chuàng)建一個 string 類型的連接配置,并封裝到 postgres.New() 函數(shù)中。這些邏輯在我們自己包中的 postgres.go 文件中構建:

package?postgres

import?(
?"database/sql"
?"fmt"

?//?postgres?driver
?_?"github.com/lib/pq"
)

//?Db?is?our?database?struct?used?for?interacting?with?the?database
type?Db?struct?{
?*sql.DB
}

//?New?makes?a?new?database?using?the?connection?string?and
//?returns?it,?otherwise?returns?the?error
func?New(connString?string)?(*Db,?error)?{
?db,?err?:=?sql.Open("postgres",?connString)
?if?err?!=?nil?{
??return?nil,?err
?}

?//?Check?that?our?connection?is?good
?err?=?db.Ping()
?if?err?!=?nil?{
??return?nil,?err
?}

?return?&Db{db},?nil
}

//?ConnString?returns?a?connection?string?based?on?the?parameters?it's?given
//?This?would?normally?also?contain?the?password,?however?we're?not?using?one
func?ConnString(host?string,?port?int,?user?string,?dbName?string)?string?{
?return?fmt.Sprintf(
??"host=%s?port=%d?user=%s?dbname=%s?sslmode=disable",
??host,?port,?user,?dbName,
?)
}

//?User?shape
type?User?struct?{
?ID?????????int
?Name???????string
?Age????????int
?Profession?string
?Friendly???bool
}

//?GetUsersByName?is?called?within?our?user?query?for?graphql
func?(d?*Db)?GetUsersByName(name?string)?[]User?{
?//?Prepare?query,?takes?a?name?argument,?protects?from?sql?injection
?stmt,?err?:=?d.Prepare("SELECT?*?FROM?users?WHERE?name=$1")
?if?err?!=?nil?{
??fmt.Println("GetUserByName?Preperation?Err:?",?err)
?}

?//?Make?query?with?our?stmt,?passing?in?name?argument
?rows,?err?:=?stmt.Query(name)
?if?err?!=?nil?{
??fmt.Println("GetUserByName?Query?Err:?",?err)
?}

?//?Create?User?struct?for?holding?each?row's?data
?var?r?User
?//?Create?slice?of?Users?for?our?response
?users?:=?[]User{}
?//?Copy?the?columns?from?row?into?the?values?pointed?at?by?r?(User)
?for?rows.Next()?{
??err?=?rows.Scan(
???&r.ID,
???&r.Name,
???&r.Age,
???&r.Profession,
???&r.Friendly,
??)
??if?err?!=?nil?{
???fmt.Println("Error?scanning?rows:?",?err)
??}
??users?=?append(users,?r)
?}

?return?users
}

上面的思想是:創(chuàng)建數(shù)據(jù)庫的連接并返回持有該連接的Db對象。然后創(chuàng)建了一個 dbGetUserByUsername() 方法。

將關注點重新回到 main.go 文件,在 40 行處創(chuàng)建了一個 root query 用于構建 GraphQL 的 schema。我們在 gql 包下的 queries.go 中創(chuàng)建:

package?gql

import?(
?"github.com/bradford-hamilton/go-graphql-api/postgres"
?"github.com/graphql-go/graphql"
)

//?Root?holds?a?pointer?to?a?graphql?object
type?Root?struct?{
?Query?*graphql.Object
}

//?NewRoot?returns?base?query?type.?This?is?where?we?add?all?the?base?queries
func?NewRoot(db?*postgres.Db)?*Root?{
?//?Create?a?resolver?holding?our?databse.?Resolver?can?be?found?in?resolvers.go
?resolver?:=?Resolver{db:?db}

?//?Create?a?new?Root?that?describes?our?base?query?set?up.?In?this
?//?example?we?have?a?user?query?that?takes?one?argument?called?name
?root?:=?Root{
??Query:?graphql.NewObject(
???graphql.ObjectConfig{
????Name:?"Query",
????Fields:?graphql.Fields{
?????"users":?&graphql.Field{
??????//?Slice?of?User?type?which?can?be?found?in?types.go
??????Type:?graphql.NewList(User),
??????Args:?graphql.FieldConfigArgument{
???????"name":?&graphql.ArgumentConfig{
????????Type:?graphql.String,
???????},
??????},
??????Resolve:?resolver.UserResolver,
?????},
????},
???},
??),
?}
?return?&root
}

NewRoot() 方法中傳入 db,并使用該 db 創(chuàng)建一個 Resolver。在Resolver方法中對數(shù)據(jù)庫進行操作。

然后創(chuàng)建了一個 new root 用于用戶的查詢,需要name作為查詢參數(shù)。類型是 graphql.NewListUser(切片或者數(shù)組類型),在 gql 包下的 type.go 文件中定義。如果有其他類型的查詢,就在這個 root 中增加。要把引入的 postgres 包改成自己本地的包。

接下來看一下 resolvers.go:

package?gql

import?(
?"github.com/bradford-hamilton/go-graphql-api/postgres"
?"github.com/graphql-go/graphql"
)

//?Resolver?struct?holds?a?connection?to?our?database
type?Resolver?struct?{
?db?*postgres.Db
}

//?UserResolver?resolves?our?user?query?through?a?db?call?to?GetUserByName
func?(r?*Resolver)?UserResolver(p?graphql.ResolveParams)?(interface{},?error)?{
?//?Strip?the?name?from?arguments?and?assert?that?it's?a?string
?name,?ok?:=?p.Args["name"].(string)
?if?ok?{
??users?:=?r.db.GetUsersByName(name)
??return?users,?nil
?}

?return?nil,?nil
}

這里導入的 postgres 包同樣是你本地的。在這個地方還可以增加其他需要的解析器。

接下來看 types.go

package?gql

import?"github.com/graphql-go/graphql"

//?User?describes?a?graphql?object?containing?a?User
var?User?=?graphql.NewObject(
?graphql.ObjectConfig{
??Name:?"User",
??Fields:?graphql.Fields{
???"id":?&graphql.Field{
????Type:?graphql.Int,
???},
???"name":?&graphql.Field{
????Type:?graphql.String,
???},
???"age":?&graphql.Field{
????Type:?graphql.Int,
???},
???"profession":?&graphql.Field{
????Type:?graphql.String,
???},
???"friendly":?&graphql.Field{
????Type:?graphql.Boolean,
???},
??},
?},
)

類似的,在這里添加我們不同的類型,每一個字段都指定了類型。在 main.go 文件的 42 行使用 root query 創(chuàng)建了一個新的查詢。

差不多好了

main.go 往下的 51 行處,創(chuàng)建一個新的 server,server 持有 GraphQL schema 的指針。下面是 server.go 的內(nèi)容:

package?server

import?(
?"encoding/json"
?"net/http"

?"github.com/bradford-hamilton/go-graphql-api/gql"
?"github.com/go-chi/render"
?"github.com/graphql-go/graphql"
)

//?Server?will?hold?connection?to?the?db?as?well?as?handlers
type?Server?struct?{
?GqlSchema?*graphql.Schema
}

type?reqBody?struct?{
?Query?string?`json:"query"`
}

//?GraphQL?returns?an?http.HandlerFunc?for?our?/graphql?endpoint
func?(s?*Server)?GraphQL()?http.HandlerFunc?{
?return?func(w?http.ResponseWriter,?r?*http.Request)?{
??//?Check?to?ensure?query?was?provided?in?the?request?body
??if?r.Body?==?nil?{
???http.Error(w,?"Must?provide?graphql?query?in?request?body",?400)
???return
??}

??var?rBody?reqBody
??//?Decode?the?request?body?into?rBody
??err?:=?json.NewDecoder(r.Body).Decode(&rBody)
??if?err?!=?nil?{
???http.Error(w,?"Error?parsing?JSON?request?body",?400)
??}

??//?Execute?graphql?query
??result?:=?gql.ExecuteQuery(rBody.Query,?*s.GqlSchema)

??//?render.JSON?comes?from?the?chi/render?package?and?handles
??//?marshalling?to?json,?automatically?escaping?HTML?and?setting
??//?the?Content-Type?as?application/json.
??render.JSON(w,?r,?result)
?}
}

在 server 中有一個 GraphQL 的方法,這個方法的主要作用就是處理 GraphQL 的查詢。記得將 gql 的路徑更新為你本地的路徑。

接下來看最后一個文件 gql.go

package?gql

import?(
?"fmt"

?"github.com/graphql-go/graphql"
)

//?ExecuteQuery?runs?our?graphql?queries
func?ExecuteQuery(query?string,?schema?graphql.Schema)?*graphql.Result?{
?result?:=?graphql.Do(graphql.Params{
??Schema:????????schema,
??RequestString:?query,
?})

?//?Error?check
?if?len(result.Errors)?>?0?{
??fmt.Printf("Unexpected?errors?inside?ExecuteQuery:?%v",?result.Errors)
?}

?return?result
}

這里只有一個簡單的 ExecuteQuery() 函數(shù)用來執(zhí)行 GraphQL 查詢。在這里可能會有一個類似于 ExecuteMutation() 函數(shù)用來處理 GraphQL 的 mutations。

initializeAPI() 的最后,在 router 中增加一些中間工具,以及增加處理 /graphql POSTs 請求的 GraphQL server 方法。并且在這個地方增加其他 RESTful 請求的路由,并在 server 中增加處理路由的方法。

然后在項目的根目錄運行 realize init,會有兩次提示信息并且兩次都輸入 n

下面是在你項目的根目錄下創(chuàng)建的 .realize.yaml 文件:

settings:
??legacy:
?force:?false
?interval:?0s
schema:
-?name:?go-graphql-api
??path:?.
??commands:
?run:
???status:?true
??watcher:
?extensions:
?-?go
?paths:
?-?/
?ignored_paths:
?-?.git
?-?.realize
?-?vendor

這段配置對于監(jiān)控你項目里面的改變非常重要,如果檢測到有改變,將自動重啟 server 并重新運行 main.go 文件。

有一些開發(fā) GraphQL API 非常好的工具,比如:graphiql[9]、insomnia[10]graphql-playground[11],還可以發(fā)送一個 application/json 請求體的 POST 請求,比如:

{
?"query":?"{users(name:\"kevin\"){id,?name,?age}}"
}

Postman[12] 里像下面這樣:

在查詢中可以只請求一個屬性或者多個屬性的組合。在 GraphQL 的正式版中,可以只請求我們希望通過網(wǎng)絡發(fā)送的信息。

很成功

大功告成!希望這篇博文對你在 Go 中編寫 GraphQL API 有幫助。我嘗試將功能分解到不同的包或文件中,使其更容易擴展,而且每一塊也很容易測試。


via: https://medium.com/@bradford_hamilton/building-an-api-with-graphql-and-go-9350df5c9356

作者:Bradford Lamson-Scribner[13]譯者:HelloJavaWorld123[14]校對:polaris1119[15]

本文由 GCTT[16] 原創(chuàng)編譯,Go 中文網(wǎng)[17] 榮譽推出

參考資料

[1]

realize: https://github.com/oxequa/realize

[2]

air: https://github.com/cosmtrek/air

[3]

Structuring Applications in Go: https://medium.com/@benbjohnson/structuring-applications-in-go-3b04be4ff091

[4]

bradford-hamilton/go-graphql-api: https://github.com/github.com/bradford-hamilton/go-graphql-api

[5]

realize: https://github.com/oxequa/realize

[6]

chi: https://github.com/go-chi/chi

[7]

render: https://github.com/go-chi/render

[8]

graphql-go/graphql: https://github.com/graphql-go/graphql

[9]

graphiql: https://github.com/graphql/graphiql

[10]

insomnia: https://insomnia.rest/

[11]

graphql-playground: https://github.com/prisma/graphql-playground

[12]

Postman: https://www.getpostman.com/

[13]

Bradford Lamson-Scribner: https://medium.com/@bradford_hamilton

[14]

HelloJavaWorld123: https://github.com/HelloJavaWorld123

[15]

polaris1119: https://github.com/polaris1119

[16]

GCTT: https://github.com/studygolang/GCTT

[17]

Go 中文網(wǎng): https://studygolang.com/



推薦閱讀


福利

我為大家整理了一份從入門到進階的Go學習資料禮包,包含學習建議:入門看什么,進階看什么。關注公眾號 「polarisxu」,回復 ebook 獲取;還可以回復「進群」,和數(shù)萬 Gopher 交流學習。

瀏覽 79
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 欧美日逼小视频| 婷婷五月丁香在线| 色淫视频| 中文字幕一区二区三区四区| 免费观看黄色片| 特级西西444WWW无码视频兔费看| 无码三级在线播放| 麻豆蜜桃wwww精品无码| 91色色色| 97热热| 视频一区二区三| 9色在线| 操操操操一本到| 日韩精品成人| 狠狠撸狠狠干| 国产精品成人无码a无码| 大香蕉a片| 人妻少妇综合| 国产一区2区| 长泽梓黑人初解禁BDD07| 日韩激情| 99热偷拍| 中文字幕乱码中文字幕电视剧| 天天操天天日天天操| 人人操人人干人人妻| 日本伊人在线综合视频| 操逼视频国产| 国产福利在线观看| 久久久久久毛片| 日韩有码中文字幕在线观看| 中国操逼毛片| 伊人三级网| 久操伊人大香蕉| 狼友视频在线观看18| 无码a区| 久操视频网站| 手机av在线观看| 国产精品久久久久无码AV| 成人黄网站免费观看| 国产精品色在线回看| 无码人妻一区二区| 操操影视| 91中文字幕+乱码| WWWA片| 日韩免费视频观看| 久久怡春院| 翔田千里无码免费播放| www.seses| 国产激情视频在线免费观看| 日韩高清国产一区在线| 四虎精品一区二区三区| 亚洲区视频| 东京热无码免费视频| 激情五月天视频| 色播一区| 日本A片免费| 成人丁香五月天| 东方AV免费在线观看| S牛牛AV| 一级黄色毛片| 天天操综合网| 国产高清无码在线| 日韩爱爱视频| 少妇搡BBBB搡BBB搡造水爽| 天天想夜夜操| 国产精品秘久久久久久1-~/\v7-/ 囯产精品一区二区三区线一牛影视1 | 在线观看国产欧美| 午夜亚洲国产一区视频网站| 亚洲AV无码乱码| 国产性爱在线| 人妻视频在线| 免费一区| 午夜免费视频1000| 日逼免费视频| 国产在线观看黄色| 嫩BBB槡BBBB槡BBBB撒尿| 日皮视频在线看| 日产精品久久久久| 先锋资源一区| 成人午夜在线视频| 亚洲二区在线| 亚洲精选一区二区三区| 91精品无码一区二区| 97精品人妻一区二区| 亚洲AV无码乱码国产精品黑人| 国产美女在线观看| 91偷拍与自偷拍精品无码| 狠狠色噜噜狠狠狠7777米奇网| 足交 | 黄色视频在线观看地址| 午夜激情国产| 97亚洲国产| 欧一美一婬一伦一区二区三区自慰国 | 欧美色图俺去了| 亚洲AV电影在线| 黃色毛片A片AAAA级20| 国产91www| 青操在线| 天天操大香蕉| 婷婷五月激情小说| 国产A片一区| 嫩BBB槡BBBB槡BBBB| 国产高清精品在线| av色欲| 成人影片在线观看18| 性欧美一区二区| 高清色视频| 国精产品一区二区三区在线观看 | 国产变态另类| 久久亚洲Aⅴ成人无码国产丝袜 | 美女被操网站免费| 91欧美精品成人综合在线观看| 久久久永久免费视频| 欧美精品久久久久久久久| 丁香五月在线播放| 一区黄片| 欧美小黄片| 爆操欧美| 欧美熟妇BBB搡BBB| 国产精品污www在线观看| 午夜成人福利剧场| 911国产精品| av在线免费观看网站| 怡春院亚洲| 一区二区三区四区高清无码| 色欲亚洲| 在线观看黄网| 日本女人操逼视频| 一区二区三区四区精品| 樱桃AV| 91成人片| 五月天婷婷在线无码| 日韩无码专区电影| 微拍福利一区二区| 日韩最新无码发布| 中文免费高清在线| 中文字幕日本成人| 无码欧美成人AAAA三区在线| 高潮流水视频| 国产在线无码观看| 91九色视频| 足浴店少妇69XXX| 一级黄色视频网站| 人人爽人人爽| 男女操逼视频网站免费观看| 久久人妻视频| 激情二区| 一级AV在线| 97精品人妻一区二区三区香蕉| 日本AAAA片| 安微妇搡BBBB搡BBBB| A级黄色电影| 亚洲另类色图| 日韩成人综合| 少妇无码| 水果派解说A∨无码区| 三级不卡视频| 人人摸人人爱人人操| 91网站在线观看视频| 无码蜜桃一区二区| 亚洲有码中文字幕| 午夜福利爱爱视频| 久久区| 日韩成人在线播放| 中文无码AV| 久久亚洲日韩天天做日日做综合亚洲 | 无码人妻AV一区| 在线视频你懂| 操屄小视频| 欧美夜夜| 午夜国产在线观看| 国产视频一区二区三区四区| 日本不卡一区二区三区四区| 久久精品无码一区二区无码性色 | 日韩AV无码高清| 欧美三级欧美三级三级| 99reav| 亚州天堂| 亚洲日韩中文无码| 奇米久久| 成人在线18禁| www99精品| 日韩激情在线观看| 无码无码一区二区三区| 免费中文字幕AV| 99色热| 久久久一区二区三区四区免费听| 五月六月丁香激情视频| 无码人妻av一区| 粉嫩av一区二区白浆| 亚洲丁香网| 91九色91蝌蚪91窝成人| 在线黄色网| 五月婷婷俺來也| 欧美裸体视频| 青青草小视频| 艳妇乳肉豪妇荡乳AV无码福利| 男人天堂社区| 乱伦天堂| 北条麻妃视频在线播放| 啪啪动漫| 欧美日韩免费在线| 美女被操91| 在线播放你懂的| aaa免费| 少妇搡BBBB搡BBB搡18禁| 国产成人午夜高潮毛片| 日逼91| 国产精品性爱| 青青草无码在线视频| 精品国产999久久久免费| 91香蕉国产视频| 欧美久久性爱| 97色色超碰| 久久久久免费视频| 色94色.欧美.setu| 大香蕉大香蕉免费网| 悠悠久久久| 久久久久久久精| 国产精品久久久久永久免费看| 国产精品剧情| 无码欧精品亚洲日韩一区| 亚洲男人的天堂网| 亚洲高清无码中文字幕| 亚洲麻豆| 久久综合婷婷| 五月天精品视频| 99热免费观看| 99热综合| 国产成人精品国内自产拍免费看 | 成人免费视频一区二区三区 | 久久爱91| 韩国成人无码| 一区二区三区精品视频| 日韩人妻精品中文字幕免费| 久久燥| 久久久久久久伊人| 日韩精品91| 黄色无码视频| 日韩精品免费一区二区在线观看| 久久国产精品免费视频| 激情开心五月天| 青青在线| 97人人爽人人爽人人爽| 亚洲性爱在线播放| 成人在线一区二区| 蜜臀99| 18害羞勿进网站国产| 日韩大香蕉在线| 亚洲AV免费在线观看| 黄网91| 久久午夜无码鲁丝片主演是谁| 亚洲xxxxx| 久色视频福利| 欧美日韩北条麻妃视频在线观看| 影音先锋av资源在线| 国产精品秘久久久久久99| 国产日本在线视频| 亚洲成a人| 综合色播| 91成人电影| 国产精品女人777777| 久久极品| 人人草人人干| 成人视频毛片| 麻豆一区二区三区四区| 午夜探花| 欧洲无码一区二区三区| 亚洲成人视频在线免费观看| 一级黄色电影网站| 亚洲九九在线| 美女福利视频| 欧美精品成人| 一本免费视频| 在线免费观看无码视频| 久久人妻熟女中文字幕av蜜芽| 国产小视频免费在线观看| 97大香蕉在线视频| 人人澡人人澡人人澡| 国产精品91久久久| 成人在线综合| 亚洲性爱中文字幕| 99er这里只有精品| 久久久成人免费视频| 国产一区免费| 麻豆蜜桃91无码| 亚洲视频网站在线观看| 国产精品毛片久久久久久久| 精品吃奶一区二区三区视频| 91人妻综合| 亚洲AV无码国产精品| 操逼手机视频| 凹凸熟女凹凸BBWBBW| 在线观看国产| 18禁网站免费观看| 国产精品一区二| 超碰天天干天天摸| 日韩精品成人免费观看视频| 熟妇自拍| www.777熟女人妻| 曰逼视频| 中字无码| 伊人成人免费视频| 午夜理论片| 欧美性之站| 无码草逼| 国产激情在线视频| 亚洲天堂AV在线观看| 性日韩| 人妻丝袜蕾丝高跟双飞| 欧美老妇操逼视频| 日日撸| 99久免费视频| 激情五月天黄色| 精品自拍偷拍| 欧美v在线| 久久精品国产视频| 欧美v在线| 国产三级| 99久久综合国产精品二区| 日韩一区二区高清无码| 成人无码免费一区二区中文| 天天舔天天日| 日韩国产在线| WW免费视频| 国产成人福利| 精品久久一区二区| 在线看黄片| 亚洲婷婷三级成人网| 蜜桃无码视频小说网站| 182在线视频| 五月丁香免费视频| 五月天堂网| 欧美日本激情| 国产精品囯产三级囯产AV野外| 亚洲AV免费电影| 国产永久免费| 国产AV自拍-久| 色噜噜狠狠一区二区三区| 成人中文字幕在线观看| 三级黄视频| 狠狠躁夜夜躁人人爽人妻| 豆花成人网站在线看| 午夜爽爽爽| 日韩久久精品| 日本久久精品| 亚洲黄色免费观看| 亚洲xxxxx| 欧美日逼视频| 丁香五月在线播放| 操逼网首页| 91免费视频网站| 国产精品一级A片| 久久9久| 大香蕉精品视频| 国产精品后入| 黄色视频免费网站| 成人无码区免费| 污污的网站18| 欧美性爱成人| 日韩免费在线观看视频| 色欧美大香蕉| 青春草在线免费观看| 日韩无码中文字幕视频| 99综合网| 国产一区视频18| 特级西西444www精品视频| 五月AV| 高清无码视频直接看| 日日爽| 国产三级片在线观看| 国产精品自拍在线观看| 欧美V| 国产不卡网| 免费高清无码| 亚洲综合图区| 夜夜夜夜骑| 伊人看片| 午夜毛片| 国产视频入口| 无码中文av| 色婷婷AV在线| 天天想夜夜操| 久久亚洲日韩天天做日日做综合亚洲 | 蜜桃av秘无码一区二区三区| 色色色免费视频| 成全在线观看高清的| 午夜成人福利视频在线观看| 欧美熟妇BBB搡BBB| 在线观看日韩| 新超碰97| 久久99久久99久久99国内少妇精品 | 无码婷婷| 亚洲午夜久久久| 五月丁香婷婷色| 日韩欧美性爱网站| 国产美女av| 99成人精品| 天堂中文资源库| 撸撸操在线视频观看只有精品| 中国熟女HD| 伊人黄色| 亚洲AV成人无码精品| 操逼在线观看| 精品成人在线视频| 午夜无码视频| 亚洲无码av在线观看| 中文字幕91| 亚洲一卡二卡三卡四卡免| 天天拍夜夜操| 久久久激情| 偷拍三区| 成年人免费视频在线观看| www久久久| 午夜福利播放| 国产精品无毛五区六区| 嫩BX区二区三区的区别| 佳佳女王footjob超级爽 | 免费观看黄片网站| 麻豆一区二区| 成人免费A片在线观看直播96 | 人妻天天干| 精品国产乱码一区二区| 日韩中文无| 欧美不卡在线视频| 少妇高潮无码| 高清人妻无码| 99久久久久久| 欧美极品少妇| 色五月激情五月| 久久精品久| 99在线免费视频| 俺去也www俺去也com| 国产成人精品八戒| 精品黄色片| 蜜臀99| 中文字幕在线观看网址最新地址| 亚洲中文字幕无码在线观看| 国产无套视频| 成人丁香五月天| 91免费在线| 国产l精品久久久久久久久久 | 国产欧美日韩一区| 国产午夜无码福利视频| 亚洲无码高清在线视频| 成人免费视频性爱| 精品成人一区二区三区| 高清无码一区二区在线| 日韩黄色AV| 亚洲三级电影在线观看| 大香蕉现在视频中心一| 国产办公室丝袜人妖| 伊人9| jiujiuav| 日本成人电影一区二区三区 | 人人射人人| 成人精品一区日本无码网站suv | 国产777777| 精品动漫一区二区三区| 久久久桃色| 亚洲AV秘无码苍井空| 欧美最猛黑A片黑人猛交蜜桃视频| 国产传媒自拍| 制服无码| 日逼无码视频| 狠狠操av| 成人高清无码在线观看| 亚洲欧美激情小说另类| 日本中文字幕无码| 午夜资源网| 国产精品欧美综合亚洲| 中国一级A片| 国产不卡在线视频| 思思热这里只有精品| 欧美三级在线视频| 成人免费A片喷| 伊人网视频在线播放| 99精品久久| 国产伦精一品二品三品app| 先锋资源日韩| 国产96在线亚洲| 色欲av伊人久久大香线蕉影院| 一级特黄A片| 欧美亚洲成人精品| 日日夜夜天天| 大香蕉综合视频| 天天操视频网站| 久草在线| 人人干人人干人人| 十八女人高潮A片免费| 一道本视频在线免费观看| 久久精品视频在线观看| 人人草人人摸人人看| 免费在线a视频| 九七影院第二页| 国产精品6| 日本中文字幕不卡| 黄色大片视频| 黑人干亚洲人| 香蕉视频色| 婷婷精品在线| 激情爱爱网| 中国免费毛片| 欧美亚洲综合手机在线| sesese999| 久久538| 亚洲无码av中文字幕| 久久久女女女女999久久| 色中文字幕| 福利毛片| 免费中文字幕av| 成人毛片一区二区三区无码| 国产欧美综合在线三区| 俺去也视频| 黄色成人网站在线播放| 九九韩剧网最新电视剧免费观看 | 人人干人人看| 另类激情| 伊人小视频| 亚洲秘av无码一区二区| 你懂的在线免费观看| 操日视频| 亚洲猛男操逼欧美国产视频| 亚洲无码三区| 国产精品热| 日本欧美一级| 亚洲无码AV一区二区| 91日韩高清| 亚洲Av在线观看| 久久嫩草在线影院| 三级片中文字幕| 国产91福利| 色婷婷视频网站| 成人在线综合| 伊人伊人网| 亚洲无码成人AV| 日本黄色影视| 国产精品视频免费观看| 狠狠操在线视频| 中文字幕有码在线视频| 成人无码交配视频国产网站 | 无码人妻av黄色一区二区三区 | 又色又爽| 久久九一| 久久青青操| 国产无码a| 一本久道综合| 在线观看AV91| www.91av| 日本在线免费| 91综合娱乐| 欧美激情五月天| 天天操一操| 免费69视频| 国产嫩草精品A88AV| 肏逼网址| 免费国产A片| 欧美区亚洲区| 99久久国产热无码精品免费| 成人AV午夜福利| 亚洲成人在线视频免费观看| 蜜桃无码视频小说网站| 一级A片黃色A片| zzjicom| 一道本视频在线免费观看| 丁香婷婷五月综合影院| 一区二区三区视屏| 少妇激情网站| 五月天亚洲激情| 精品少妇视频| 国产精品三级在线| 国产亚洲99久久精品| 亚洲成人中文字幕在线| 好吊视频一区二区三区红桃视频you| 99青草在线视频| 操碧一区| 竹菊影视一区二区三区| 俺来也俺去也www色| 一本一道vs波多野结衣| 欧美性极品少妇精品网站| 中文无码精品欧美日韩| 亚洲婷婷小说| 少妇搡BBBB搡BBB搡毛片| 人人操天天| 日韩色图在线观看| 国产三级图片| 欧美极品少妇| 国产酒店自拍| 91超碰在线播放| 懂色AV一区二区三区国产中文在线 | 中文字幕网站在线观看| 免费看黄色电影| 免费无码婬片AAAAA片| 91人妻人人澡人人爽人人DVD| 欧美三级欧美三级三级| 豆花视频在线看| 国产成人精品av在线观看| 中文字幕第10页| 成人av中文字幕| 国产日韩在线视频| 色噜噜在线| 日韩无码一级| 老女人操逼| 色福利网| 人人操夜夜爽| 青草青在线| 天天看A片| 久草大| a视频免费在线观看| 午夜香蕉| 国产激情无码| 国产免费一区二区三区四区| 成年人黄色视频免费观看| 97资源在线视频| 内射老熟女| 无码人妻精品一区二区三区蜜臀百度 | 国产免费av在线| 黄色成人网址| 亚洲无码电影网站| 99综合网| 日本久久久久久久久视频在线观看 | 在线一区观看| 成人午夜无码| 日韩婬乱片A片AAA真人视频| 中文在线字幕高清电视剧| 99综合网| 欧美亚洲色色网视频| 刘玥91精品一区二区三区| 亚洲第一网无码性色| 蜜桃视频免费网站| 91天天| 午夜在线观看视频| 欧美性受XXXX爽XYX熟99| 免费成人黄片| 国产黄色大片| 一区二区小视频| 动漫精品一区二区| 日韩大香蕉在线| 俺去夜| 翔田千里高潮90分钟| 日本黄色大片网站| 中文字幕在线视频第一页| 91精品久久久久久粉嫩| 欧美中文字幕在线观看| 69av电影| 99久久国产精| 牛牛精品视频| 亚洲中文无码视频| 日韩美女做爱| 免费黄色成人| 欧美黄片免费在线观看| 国产黄片在线免费观看| 伊人久久AV诱惑悠悠| 尻屄视频免费| 中文无码播放| 色人人| 91美女操逼视频| 久久er99| 精东影业秘国产传媒| aa无码视频| 国产丰满大乳无码免费播放| 成人在线免费电影| 日韩国产av| 国内自拍99| 久久午夜无码鲁丝片主演是谁| 黄色成人网站免费在线观看| 92午夜福利天堂视频2019| 狠狠操免费| 欧美一区二区在线视频| 天天做天天干| 欧美香蕉在线| 中文字幕永久在线观看| 伊人网大香蕉| 噜噜噜AV| 99ri国产| 激情一区| 日韩视频二区| 中文字幕AⅤ在线| 中文字幕在线看成人电影| 荫蒂添的高潮免费视频| 无码人妻中文字幕| 亚洲欧洲有码在线| 亚洲A∨无码无在线观看| 日韩成人A片| 操碧一区| 国产主播第一页| 免费亲子乱婬一级A片| 蜜臀AV成人| 高清无码免费看| 99久久九九| 五月婷婷视频在线观看| 国产精品1区| 日韩欧美综合一区| 蜜桃久久av一区| 先锋影音av在线| 日本操屄视频| 麻豆传媒在线播放| 人妻无码视频| 极品少妇久久久| 水果派解说在线观看| 男人天堂网AV| 不卡的av在线| 51XX嘿嘿午夜| 91福利视频在线观看| 日韩不卡在线| 性爱91视频| 欧美后门菊门交| 久久免费毛片| 99爱在线观看| 国产精品国产三级片| a级网站| 懂色午夜福利一区二区三区| 色婷婷18正码国产| 殴美老妇BBBBBBBBB| 日韩成人免费在线| 五月婷婷深深爱| 大香焦伊人国产| 大荫蒂hd大荫蒂视频| 91成人毛片| 欧美成人毛片一级A片| 成人视频123| 一本无码中文字幕| 激情婷婷五月天| 国产精品V亚洲精品V日韩精品| 人人草人人干| 日韩专区在线观看| 乱伦自拍| 亚洲无码AV网站| 97爱爱| 河南熟妇搡BBBB搡BBBB| 精品网站999www| 尤物91| 国产A片录制现场妹子都很多| 一区二区无码精品| 五月天激情爱爱| 亚洲中文欧美| 91人妻无码一区二区久久| 久热福利视频| 北条麻妃视频在线播放| 大黑人荫蒂BBBBBBBBB| 好爽~要尿了~要喷了~同桌| 国精产品一二四区黑人| 欧美日韩综合| 色播五月婷婷| 国产精品久久久久久99| 国产成人aV| 男人天堂视频网站| 99热免费| 水果派中文解说AⅤ| 国产精品一品二区三区的使用体验| 91精品免费视频| 91在线欧美| www.高清无码| 成人免费A片在线观看直播96 | 97色在线| 999这里只有精品| 天天综合色| 丝袜一区二区三区| 亚洲国产剧情| 美日韩中文字幕| 一本一道久久综合| 99视频免费看| 人人看人人爱| 久草中文在线视频| 日本免费黄色片| 中文字幕在线免费观看电影| 91在线免费视频| 中文字幕无码日韩| 最新激情网站| 欧美丰满人妻免费视频人| 国产高清无码在线观看视频| 日韩中文字幕一区二区三区| 青青草亚洲| 国产又爽又黄视频在线看| 天天澡天天爽日日AV| 最新日韩无码| 水蜜桃一区二区三区| 国产一区二区三区在线| 婷婷色AV| 欧美色图俺去了| 黄片网址| 国产在线h| 日本精品在线播放| 久久亚洲中文| 亚洲中文字幕免费观看| 黄片中文字幕| 人人人妻人人人操| 亚洲三级免费| 国产剧情91| 色婷婷中文在线| 国产性爱在线| 激情五月天黄色| 国产欧美日韩一区| 日本一级A片| 国产一a毛一a毛A免费| 亚洲黄色一级电影| 天天摸天天添| 色婷五月天| 97人妻天天摸天天爽天天| av视屏| AV无码毛片| 日韩毛片在线观看| 91超碰在线免费观看| 欧美aaa视频| 国产成人综合电影| 国产精品扒开腿| 亚洲免费在线视频| 国产suv精品一区二区| 午夜精品影院| av性爱在线| 伊人综合电影| 午夜无码福利| 激情无码一区二区| 亚洲美女网站免费观看网址| 国产免费黄色av| 丁香五月中文字幕| 久青草资源福利视频| 色婷婷一二三精品A片| 三级网址大全| 九九色综合| 三级片91| 波多无码在线| www.xxx国产| 欧美在线日韩在线| 国产亚洲久一区二区| 高清无码三级| 亚洲视频一区二区三区四区娇小视频在线观看视频 | 2018中文字幕第一页| 国产高清无码免费视频| 午夜性爱福利| 五月开心婷婷| 日本AⅤ在线观看| 日本男人天堂| 丝袜久久| 久久中文字幕无码| 五月天青青草超碰免费公开在线观看| 黄片大全在线观看| 亚洲AV秘无码苍井空| 操比视频在线观看| 91精品国产成人做爰观看奶头| 苍井空精毛片精品久久久| 日韩字幕| 一区二区亚洲| 婷婷av在线| 免费看黄片,在线观看| 国产黄色视频在线观看免费| 2025无码视频| 无码人妻一区二区三一区免费n狂飙 | 在线观看国产黄色| 亚洲精品一二三区| 免费观看黄色小视频| 亚洲精品一二| 中文字幕12页| 婷婷色色五月| 淫色综合| 日韩美女做爱| 中文字幕在线观看1| 麻豆成人91精品二区三区| 国产一区在线视频| 69国产精品成人无码| 欧美性爱视频在线观看| 国产无码操逼| 日韩欧美成人网站| 97国产在线观看| 永久m3u8在线观看| 美日韩一区| 2018天天日天天操| 狼友免费视频| 大香蕉99热| 夜夜夜操操操| 免费性网| 日韩网站在线| 亚洲国产精品成人网站| 欧美综合亚洲图片综合区| www.97yy| 欧美高清在线综合| 亚洲无码影院| 青青草无码成人AV片| 一区二区三区免费观看| 欧美一区二区在线观看| 午夜aaa| 内射毛片| 成人三区| 亚洲AV无码乱码| 中文字幕在线无码| 91无码人妻| 欧美一区二区三区婷婷五月| 婷婷视频| 中字无码| 亚洲无码在线观看视频| 狼友视频一国产| 中文字幕激情精品| 久久香蕉综合在线| 大黑逼网| 不卡一二三区| 黄色电影毛片| 狼人综合影院| 日本中文字幕乱伦| 国产日韩欧美久久| 18网站视频|