婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > golang常用庫(kù)之gorilla/mux-http路由庫(kù)使用詳解

golang常用庫(kù)之gorilla/mux-http路由庫(kù)使用詳解

熱門標(biāo)簽:福州鐵通自動(dòng)外呼系統(tǒng) 烏魯木齊人工電銷機(jī)器人系統(tǒng) 濮陽(yáng)自動(dòng)外呼系統(tǒng)代理 智能電銷機(jī)器人營(yíng)銷 廣東語(yǔ)音外呼系統(tǒng)供應(yīng)商 長(zhǎng)沙ai機(jī)器人電銷 賺地圖標(biāo)注的錢犯法嗎 澳門防封電銷卡 地圖標(biāo)注測(cè)試

golang常用庫(kù):gorilla/mux-http路由庫(kù)使用
golang常用庫(kù):配置文件解析庫(kù)-viper使用
golang常用庫(kù):操作數(shù)據(jù)庫(kù)的orm框架-gorm基本使用

一:golang自帶路由介紹

golang自帶路由庫(kù) http.ServerMux ,實(shí)際上是一個(gè) map[string]Handler,是請(qǐng)求的url路徑和該url路徑對(duì)于的一個(gè)處理函數(shù)的映射關(guān)系。這個(gè)實(shí)現(xiàn)比較簡(jiǎn)單,有一些缺點(diǎn):

不支持參數(shù)設(shè)定,例如/user/:uid 這種泛型類型匹配無法很友好的支持REST模式,無法限制訪問方法(POST,GET等)也不支持正則

二:gorilla/mux路由

github地址:https://github.com/gorilla/mux
http://www.gorillatoolkit.org/pkg/mux
https://github.com/gorilla/mux#examples

上面所指出來的glang自帶路由的缺點(diǎn),gorilla/mux 都具備,而且還兼容 http.ServerMux。除了支持路徑正則,命名路由,還支持中間件等等功能。所以mux是一個(gè)短小精悍,功能很全的路由。

1. 普通路由

示例 demo1.go

package main

import (
	"fmt"
	"github.com/gorilla/mux"
	"net/http"
)

func main() {
	r := mux.NewRouter()
	//普通路由
	r.HandleFunc("/", IndexHandler)
	r.HandleFunc("/products", ProductsHandler)

	http.ListenAndServe(":8080", r)
}

func IndexHandler(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusOK)
	fmt.Fprintf(w, "hello world")
}

func ProductsHandler(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusOK)
	fmt.Fprintf(w, "hello, Products")
}

上面mux的普通路由是不是似曾相識(shí),跟golang標(biāo)準(zhǔn)庫(kù)用法一樣

在瀏覽器訪問:http://localhost:8080/products
輸出:hello, Products

2. 參數(shù)路由

參數(shù)路由,可以是普通路由,還可以是正則匹配
示例 demo2.go:

package main

import (
	"net/http"

	"fmt"

	"github.com/gorilla/mux"
)

//路由參數(shù)
func main() {
	r := mux.NewRouter()
	//1. 普通路由參數(shù)
	// r.HandleFunc("/articles/{title}", TitleHandler)

	//2. 正則路由參數(shù),下面例子中限制為英文字母
	r.HandleFunc("/articles/{title:[a-z]+}", TitleHandler)

	http.ListenAndServe(":8080", r)
}

//https://github.com/gorilla/mux#examples
func TitleHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r) // 獲取參數(shù)
	w.WriteHeader(http.StatusOK)
	fmt.Fprintf(w, "title: %v\n", vars["title"])
}


第1個(gè)普通路由參數(shù),就是啥參數(shù)都可以,不管是字母,數(shù)字,還是中文等
第2個(gè)正則路由參數(shù),限制了只能是英文字母,否則會(huì)報(bào) 404 page not found

3. 路由匹配Matching Routes

https://github.com/gorilla/mux#matching-routes
我們也可以限制路由或者子路由。

3.1 匹配host

r := mux.NewRouter()
//只匹配 www.example.com
r.Host("www.example.com")
// 動(dòng)態(tài)匹配子路由
r.Host("{subdomain:[a-z]+}.example.com")

3.2 更多的一些其他匹配

見下面的更多匹配的例子:

r := mux.NewRouter()

r.PathPrefix("/products/") //前綴匹配
r.Methods("GET", "POST") //請(qǐng)求方法匹配
r.Schemes("https") //schemes
r.Headers("X-Requested-With", "XMLHttpRequest") //header 匹配
r.Queries("key", "value") //query的值匹配

// 用戶自定義方法 匹配
r.MatcherFunc(func(r *http.Request, rm *RouteMatch) bool { 
 return r.ProtoMajor == 0
})

把上面的聯(lián)合起來在一個(gè)單獨(dú)的route里

r.HandleFunc("/products", ProductsHandler).
 Host("www.example.com").
 Methods("GET").
 Schemes("http")

3.3 子路由匹配

Subrouter()可以設(shè)置子路由

r := mux.NewRouter()
s := r.Host("www.example.com").Subrouter()

s.HandleFunc("/products/", ProductsHandler)
s.HandleFunc("/products/{key}", ProductHandler)
s.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)

3.4 多個(gè)路由匹配的順序

如果有多個(gè)路由添加到路由器里面,那么匹配順序是怎么樣?按照添加的先后順序匹配。比如有2個(gè)路由都匹配了,那么優(yōu)先匹配第一個(gè)路由。

r := mux.NewRouter()
r.HandleFunc("/specific", specificHandler)
r.PathPrefix("/").Handler(catchAllHandler)

4. 設(shè)置路由前綴

PathPrefix()設(shè)置路由前綴

r := mux.NewRouter()

//PathPrefix() 可以設(shè)置路由前綴
product := r.PathPrefix("/products").HandleFunc("/", ProductsHandler)

路由前綴一般情況下不會(huì)單獨(dú)使用,而是和子路由結(jié)合起來用,實(shí)現(xiàn)路由分組

5. 分組路由

可以根據(jù)前面的子路由和路由前綴的功能,綜合運(yùn)用就可以設(shè)置分組路由了
實(shí)例:grouprouter.go

package main

import (
	"fmt"
	"github.com/gorilla/mux"
	"net/http"
)

//子路由, 分組路由
func main() {
	r := mux.NewRouter()

	//PathPrefix() 可以設(shè)置路由前綴,設(shè)置路由前綴為products
	products := r.PathPrefix("/products").Subrouter()
	//"http://localhost:8080/products/", 最后面的斜線一定要,不然路由不正確,頁(yè)面出現(xiàn)404
	products.HandleFunc("/", ProductsHandler)
	//"http://localhost:8080/products/{key}"
	products.HandleFunc("/{key}", ProductHandler)

	users := r.PathPrefix("/users").Subrouter()
	// "/users"
	users.HandleFunc("/", UsersHandler)
	// "/users/id/參數(shù)/name/參數(shù)"
	users.HandleFunc("/id/{id}/name/{name}", UserHandler)

	http.ListenAndServe(":8080", r)
}

func ProductsHandler(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusOK)
	fmt.Fprintf(w, "%s", "products")
}

func ProductHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r) //獲取路由的值
	fmt.Fprintf(w, "key: %s", vars["key"])
}

func UsersHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, " %s \r\n", "users handler")
}

func UserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r) //獲取值
	id := vars["id"]
	name := vars["name"]
	fmt.Fprintf(w, "id: %s, name: %s \r\n", id, name)
}

6. 路由中間件

https://github.com/gorilla/mux#middleware
Mux middlewares are defined using the de facto standard type: 在mux中路由中間件的定義

type MiddlewareFunc func(http.Handler) http.Handler

示例1:middleware1.go

package main

import (
	"fmt"
	"net/http"

	"github.com/gorilla/mux"
)

func main() {
	r := mux.NewRouter()
	r.HandleFunc("/", handler)

	r.Use(loggingMiddleware)

	http.ListenAndServe(":8080", r)
}

func loggingMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		//Do stuff here
		fmt.Println(r.RequestURI)
		fmt.Fprintf(w, "%s\r\n", r.URL)
		// Call the next handler, which can be another middleware in the chain, or the final handler.
		next.ServeHTTP(w, r)
	})
}

func handler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("handle middleware"))
	fmt.Println("print handler")
}

示例2:middleware2.go

在來看一個(gè)復(fù)雜點(diǎn)的例子:

package main

import (
	"fmt"
	"net/http"
	"strings"

	"github.com/gorilla/mux"
)

type authMiddleware struct {
	tokenUsers map[string]string
}

func (amw *authMiddleware) Populate() {
	amw.tokenUsers = make(map[string]string)
	amw.tokenUsers["000"] = "user0"
	amw.tokenUsers["aaa"] = "userA"
	amw.tokenUsers["05ft"] = "randomUser"
	amw.tokenUsers["deadbeef"] = "user0"
}

func (amw *authMiddleware) Middleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		token := strings.Trim(r.Header.Get("X-Session-Token"), " ")
		if token == "" {
			fmt.Fprintf(w, "token is error \r\n")
		}

		if user, found := amw.tokenUsers[token]; found {
			//we found the token in out map
			fmt.Printf("Authenticated user: %s\n", user)
			fmt.Fprintf(w, "Authenticated user: %s\n", user)
			// Pass down the request to the next middleware (or final handler)
			next.ServeHTTP(w, r)
		} else {
			// Write an error and stop the handler chain
			http.Error(w, "Forbidden", http.StatusForbidden)
		}
	})
}

func main() {
	r := mux.NewRouter()
	r.HandleFunc("/", handler)

	amw := authMiddleware{}
	amw.Populate()

	r.Use(amw.Middleware)

	http.ListenAndServe(":8080", r)
}

func handler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("handler"))
}

用 insomnia 軟件測(cè)試,如下圖:


X-Session-Token=aaa 返回時(shí)正確


那-Session-Token=aaaa 呢


返回 403 了

7. Walking Routes 遍歷注冊(cè)的所有路由

package main

import (
	"fmt"
	"net/http"
	"strings"

	"github.com/gorilla/mux"
)

func handler(w http.ResponseWriter, r *http.Request) {
	return
}

//https://github.com/gorilla/mux#walking-routes
func main() {
	r := mux.NewRouter()
	r.HandleFunc("/", handler)
	r.HandleFunc("/products", handler).Methods("POST")
	r.HandleFunc("/articles", handler).Methods("GET")
	r.HandleFunc("/articles/{id}", handler).Methods("GET", "PUT")
	r.HandleFunc("/authors", handler).Queries("surname", "{surname}")
	err := r.Walk(func(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error {
		pathTemplate, err := route.GetPathTemplate()
		if err == nil {
			fmt.Println("ROUTE:", pathTemplate)
		}
		pathRegexp, err := route.GetPathRegexp()
		if err == nil {
			fmt.Println("Path regexp:", pathRegexp)
		}
		queriesTemplates, err := route.GetQueriesTemplates()
		if err == nil {
			fmt.Println("Queries templates:", strings.Join(queriesTemplates, ","))
		}
		queriesRegexps, err := route.GetQueriesRegexp()
		if err == nil {
			fmt.Println("Queries regexps:", strings.Join(queriesRegexps, ","))
		}
		methods, err := route.GetMethods()
		if err == nil {
			fmt.Println("Methods:", strings.Join(methods, ","))
		}
		fmt.Println()
		return nil
	})

	if err != nil {
		fmt.Println(err)
	}

	http.Handle("/", r)
	http.ListenAndServe(":8080", nil)
}

8. 其他示例

請(qǐng)求方法限制

demo3.go:

package main

import (
	"fmt"
	"github.com/gorilla/mux"
	"net/http"
)

// 請(qǐng)求方法的限制, Methods()
func main() {
	r := mux.NewRouter()

	r.HandleFunc("/products", ProductsHandler).Methods("GET", "POST")

	r.Handle("/products/{id}", ProductsIdHandler{}).Methods("GET")
	http.ListenAndServe(":8080", r)
}

func ProductsHandler(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusOK)
	fmt.Fprintf(w, "hello, products! ")
}

type ProductsIdHandler struct{}

func (handler *ProductsIdHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	w.WriteHeader(http.StatusOK)
	fmt.Fprintf(w, "products id: %s", vars["id"])
}

請(qǐng)求頭限制

在路由定義中可以通過Headers() 方法來限制設(shè)置請(qǐng)求頭的匹配。
demo4.go

package main

import (
	"fmt"
	"net/http"

	"github.com/gorilla/mux"
)

// 請(qǐng)求頭的限制,用Headers() 來限制
func main() {
	r := mux.NewRouter()

	r.HandleFunc("/products", func(w http.ResponseWriter, r *http.Request) {
		header := "Request-Limit-Test"
		fmt.Fprintf(w, "contain headers: %s = %s \n", header, r.Header[header])
	}).Headers("Request-Limit-Test", "RequestLimitTest").Methods("POST")

	http.ListenAndServe(":8080", r)
}

自定義匹配規(guī)

用 MatcherFunc() 來自定義規(guī)則
示例 demo5.go:**

package main

import (
	"fmt"
	"net/http"

	"github.com/gorilla/mux"
)

//自定義匹配 MatcherFunc()
func main() {
	r := mux.NewRouter()

	r.HandleFunc("/products/matcher", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "FormValue: %s ", r.FormValue("func"))
	}).MatcherFunc(func(req *http.Request, match *mux.RouteMatch) bool {
		b := false
		if req.FormValue("func") == "matcherfunc" {
			b = true
		}
		return b
	})

	http.ListenAndServe(":8080", r)
}

在瀏覽器中:http://127.0.0.1:8080/products/matcher?func=matcherfunc
輸出:FormValue: matcherfunc

命名路由Registered URLs

namerouter.go

package main

import (
	"fmt"
	"github.com/gorilla/mux"
	// "log"
	"net/http"
)

// 命名路由 Name(), 獲取路由URL, URL()
func main() {
	r := mux.NewRouter()
	r.HandleFunc("/products/{category}/{id:[0-9]+}", ProductHandler).Name("product")

	//獲取路由的URL
	url1, err := r.Get("product").URL()
	fmt.Println(err) //error: mux: number of parameters must be multiple of 2, got [/]
	if err == nil {
		fmt.Println("get URL: \r\n", url1)
	}

	//獲取路由的url后,也可以拼裝你需要的URL
	url2, err := r.Get("product").URL("category", "tech", "id", "13")
	if err == nil {
		fmt.Println("new url: ", url2) //new url: /products/tech/13
	}

	http.ListenAndServe(":8080", r)
}

func ProductHandler(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusOK)
	vars := mux.Vars(r)

	fmt.Fprintf(w, "url: %s, category: %s, id: %s", r.URL, vars["category"], vars["id"])
	//瀏覽器: http://localhost:8080/products/id/23

	//output
	//url: /products/id/23, category: id, id: 23
}

根據(jù)命名的路由來獲取路由URLr.Get("product").URL()

三:參考

https://github.com/gorilla/mux

到此這篇關(guān)于golang常用庫(kù)之gorilla/mux-http路由庫(kù)使用詳解的文章就介紹到這了,更多相關(guān)gorilla mux-http路由庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 解決golang http重定向失效的問題
  • Golang發(fā)送http GET請(qǐng)求的示例代碼
  • 詳解golang開發(fā)中http請(qǐng)求redirect的問題
  • Golang Http 驗(yàn)證碼示例實(shí)現(xiàn)
  • 詳解Golang開啟http服務(wù)的三種方式
  • 解決golang讀取http的body時(shí)遇到的坑

標(biāo)簽:調(diào)研邀請(qǐng) 德州 貴陽(yáng) 西雙版納 慶陽(yáng) 阿克蘇 廣西 太原

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang常用庫(kù)之gorilla/mux-http路由庫(kù)使用詳解》,本文關(guān)鍵詞  golang,常用,庫(kù)之,gorilla,mux-http,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang常用庫(kù)之gorilla/mux-http路由庫(kù)使用詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于golang常用庫(kù)之gorilla/mux-http路由庫(kù)使用詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品一区二区日韩| 久久精品国产澳门| 精品国产髙清在线看国产毛片| 99久久久无码国产精品| 国产精品乱码久久久久久| 91精品中文字幕一区二区三区| 成人一区二区三区在线观看| 国产一区二区看久久| 国产乱人伦偷精品视频不卡| 国产米奇在线777精品观看| 久久99国内精品| 国产成人在线看| 北条麻妃国产九九精品视频| 成人国产精品免费网站| 成人av一区二区三区| 色综合色狠狠天天综合色| 久久欧美一区二区| 欧美性猛交一区二区三区精品| 国产偷国产偷亚洲高清人白洁| 午夜精品久久久久久久99樱桃| 欧美日韩久久久久久| 亚洲美女少妇撒尿| 国产精一区二区三区| 国产乱对白刺激视频不卡| 精品一区二区成人精品| 老司机精品视频导航| 中文字幕亚洲欧美在线不卡| 极品少妇xxxx精品少妇| 亚洲欧美激情视频在线观看一区二区三区| 国产成人午夜片在线观看高清观看| 久久免费美女视频| 成人高清免费观看| 亚洲国产精品一区二区尤物区| 精品少妇一区二区三区日产乱码 | 中文字幕av一区二区三区| 91精品国产91综合久久蜜臀| 天天做天天摸天天爽国产一区 | 91小宝寻花一区二区三区| 久久久久久夜精品精品免费| 日韩有码一区二区三区| 亚洲一区二区偷拍精品| 亚洲成a人在线观看| 亚洲男同性恋视频| 亚洲色图视频网| 久久久久国产精品麻豆| 国产日韩欧美激情| 18涩涩午夜精品.www| **欧美大码日韩| 午夜精品爽啪视频| 久久99国产精品尤物| 狠狠色丁香九九婷婷综合五月| 亚洲国产欧美日韩另类综合| 国产视频视频一区| 国产精品无遮挡| 日韩国产高清在线| 成人性生交大片免费看视频在线| 色网综合在线观看| 精品国产91亚洲一区二区三区婷婷| 国产欧美日韩三级| 91麻豆.com| 久久九九影视网| 亚州成人在线电影| 在线观看欧美日本| 日韩一级片网站| 国产精品免费久久久久| 日本一区中文字幕| 一本色道**综合亚洲精品蜜桃冫| 欧美成人午夜电影| 国产精品18久久久久久vr| 91国产成人在线| 亚洲制服丝袜一区| 欧美日韩久久久一区| 一区二区高清在线| 在线中文字幕一区| 国产女主播在线一区二区| 免费xxxx性欧美18vr| 日韩一区二区三区免费看| 亚洲女性喷水在线观看一区| 成人动漫精品一区二区| 亚洲免费高清视频在线| 懂色av一区二区在线播放| 久久精品日韩一区二区三区| 国产精品一区二区你懂的| 天堂一区二区在线| 337p日本欧洲亚洲大胆精品| 久久国产精品免费| 一级做a爱片久久| 中文字幕一区二区三区四区不卡 | 精品福利av导航| 成人理论电影网| 麻豆91精品视频| 亚洲天堂中文字幕| 3d动漫精品啪啪1区2区免费| 成人毛片视频在线观看| 国产精品一区在线| 国产蜜臀97一区二区三区| 色爱区综合激月婷婷| 成人avav影音| 久久精品国产99国产精品| 中文字幕乱码一区二区免费| 99久久精品99国产精品| 国产激情视频一区二区三区欧美| 亚洲主播在线播放| 日韩美女视频一区| 欧美日韩aaa| 波多野结衣的一区二区三区| 日韩电影一区二区三区四区| 欧美国产欧美综合| 7777精品伊人久久久大香线蕉| 欧美视频日韩视频| 色偷偷一区二区三区| 色综合天天天天做夜夜夜夜做| 激情综合网av| 色婷婷综合在线| 色呦呦国产精品| 51精品国自产在线| 欧美成人激情免费网| 日韩欧美中文一区二区| 欧美一区二区久久久| 日韩欧美亚洲国产精品字幕久久久| 99re6这里只有精品视频在线观看| 国产成人一区在线| www.亚洲色图| 色欧美日韩亚洲| 精品捆绑美女sm三区| 日韩三级av在线播放| 亚洲人成网站影音先锋播放| 亚洲靠逼com| 麻豆国产欧美日韩综合精品二区| 夜夜精品浪潮av一区二区三区| 久久国产免费看| 成人福利电影精品一区二区在线观看| 国产91露脸合集magnet| 91黄色免费网站| 精品美女被调教视频大全网站| 国产精品麻豆网站| 国产一区二区三区黄视频 | 国产呦萝稀缺另类资源| 国产日韩欧美高清| 91国模大尺度私拍在线视频| 欧美精品一区二区三区蜜桃视频 | 国产精品99久久久久久似苏梦涵| 欧美无砖专区一中文字| 亚洲图片欧美视频| 一本大道综合伊人精品热热| 亚洲三级电影全部在线观看高清| 欧美日韩另类一区| 国产自产高清不卡| 亚洲同性gay激情无套| 91精品中文字幕一区二区三区 | 欧美日韩高清一区二区不卡| 国产偷v国产偷v亚洲高清| 国产一区高清在线| 久久久99精品久久| 成人免费视频免费观看| 欧美国产激情二区三区| 国产福利精品一区| 国产精品不卡在线观看| 日韩一级大片在线观看| 亚洲精品一二三区| 欧美疯狂性受xxxxx喷水图片| 日韩av高清在线观看| 欧美精品乱人伦久久久久久| 免费欧美高清视频| 午夜欧美一区二区三区在线播放| 99精品视频在线观看免费| 一区二区在线免费| 91精品在线麻豆| 国产一区在线精品| 一区二区三区视频在线看| 欧美性大战久久久久久久| 无码av免费一区二区三区试看| 欧美片在线播放| 国产成人自拍在线| 国产一区二区三区精品欧美日韩一区二区三区 | 成人小视频免费在线观看| 99久久综合国产精品| 一本久久a久久免费精品不卡| 欧美国产一区在线| 91超碰这里只有精品国产| 寂寞少妇一区二区三区| 视频一区视频二区中文| 国产精品久久毛片av大全日韩| 欧美一级在线观看| 欧美精品一二三四| 成人免费观看视频| 风间由美性色一区二区三区| 另类的小说在线视频另类成人小视频在线 | 成人免费精品视频| 不卡的av在线| www.66久久| 成人精品在线视频观看| 国产一区 二区 三区一级| 午夜私人影院久久久久| 日韩精品久久理论片| 美女网站色91| 国产精品99久久久久久似苏梦涵 | 看国产成人h片视频| 国产风韵犹存在线视精品| 久久91精品国产91久久小草|