欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解密Golang中Request對(duì)象的操作

 更新時(shí)間:2023年05月18日 10:55:27   作者:金刀大菜牙  
這篇文章主要和大家深入探討?Golang?中的?Request?對(duì)象,并從多個(gè)方面介紹其功能、結(jié)構(gòu)和使用方法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下

在 Golang 中,net/http 包是用于構(gòu)建 HTTP 客戶端和服務(wù)器的重要包之一。在處理 HTTP 請(qǐng)求時(shí),Request 對(duì)象是不可或缺的。本文將深入探討 Golang 中的 Request 對(duì)象,并從多個(gè)方面介紹其功能、結(jié)構(gòu)和使用方法。

1. Request 對(duì)象簡(jiǎn)介

Request 對(duì)象代表一個(gè) HTTP 請(qǐng)求,它包含了請(qǐng)求的所有信息,如請(qǐng)求方法、URL、頭部信息、請(qǐng)求體等。在 Golang 中,Request 對(duì)象是通過(guò) net/http 包中的 NewRequest 函數(shù)創(chuàng)建的。我們可以通過(guò)以下方式創(chuàng)建一個(gè) Request 對(duì)象:

req, err := http.NewRequest(method, url, body)

其中,method 是一個(gè)字符串,表示 HTTP 請(qǐng)求方法,如 GET、POST、PUT 等;url 是一個(gè)字符串,表示請(qǐng)求的 URL;body 是一個(gè) io.Reader 接口類型的對(duì)象,用于提供請(qǐng)求體的內(nèi)容。這個(gè)函數(shù)返回一個(gè) Request 對(duì)象和一個(gè)錯(cuò)誤。

一旦創(chuàng)建了 Request 對(duì)象,我們就可以使用它來(lái)進(jìn)行各種操作,如設(shè)置請(qǐng)求頭、讀取請(qǐng)求參數(shù)、獲取請(qǐng)求體等。接下來(lái),我們將深入探討這些操作。

2. Request 對(duì)象的結(jié)構(gòu)

在理解 Request 對(duì)象的功能之前,我們首先來(lái)看一下它的結(jié)構(gòu)。在 Golang 中,Request 對(duì)象的定義如下:

type Request struct {
 ? ?Method ? ? ? ? ? string
 ? ?URL ? ? ? ? ? ? ?*url.URL
 ? ?Proto ? ? ? ? ? ?string
 ? ?ProtoMajor ? ? ? int
 ? ?ProtoMinor ? ? ? int
 ? ?Header ? ? ? ? ? Header
 ? ?Body ? ? ? ? ? ? io.ReadCloser
 ? ?ContentLength ? ?int64
 ? ?TransferEncoding []string
 ? ?Close ? ? ? ? ? ?bool
 ? ?Host ? ? ? ? ? ? string
 ? ?Form ? ? ? ? ? ? url.Values
 ? ?PostForm ? ? ? ? url.Values
 ? ?MultipartForm ? ?*multipart.Form
 ? ?Trailer ? ? ? ? ?Header
 ? ?RemoteAddr ? ? ? string
 ? ?RequestURI ? ? ? string
 ? ?TLS ? ? ? ? ? ? ?*tls.ConnectionState
 ? ?Cancel ? ? ? ? ? <-chan struct{}
 ? ?Response ? ? ? ? *Response
 ? ?ctx ? ? ? ? ? ? ?context.Context
}

Request 對(duì)象的結(jié)構(gòu)中包含了多個(gè)字段,每個(gè)字段都承載著不同的信息。下面我們將逐一介紹這些字段的含義和用法。

  • Method 字段表示請(qǐng)求的方法,如 GET、POST、PUT 等??梢酝ㄟ^(guò) req.Method 獲取該字段的值。
  • URL 字段表示請(qǐng)求的 URL??梢酝ㄟ^(guò) req.URL 獲取該字段的值,它是一個(gè)指向 url.URL 類型的指針。url.URL 類型提供了一系列方法來(lái)獲取 URL 的各個(gè)部分,如 Scheme、Host、Path 等。
  • Proto 字段表示 HTTP 協(xié)議的版本,如 "HTTP/1.1"??梢酝ㄟ^(guò) req.Proto 獲取該字段的值。
  • ProtoMajor 和 ProtoMinor 字段表示 HTTP 協(xié)議版本的主要和次要版本號(hào),如 1 和 1??梢酝ㄟ^(guò) req.ProtoMajor 和 req.ProtoMinor 獲取這兩個(gè)字段的值。
  • Header 字段表示請(qǐng)求頭信息,它是一個(gè) http.Header 類型的對(duì)象。我們可以使用 req.Header 對(duì)象來(lái)設(shè)置、獲取和刪除請(qǐng)求頭的各個(gè)字段。
  • Body 字段表示請(qǐng)求體,它是一個(gè)實(shí)現(xiàn)了 io.ReadCloser 接口的對(duì)象??梢酝ㄟ^(guò) req.Body 獲取該字段的值,并使用相應(yīng)的方法來(lái)讀取請(qǐng)求體的內(nèi)容。
  • ContentLength 字段表示請(qǐng)求體的長(zhǎng)度,單位是字節(jié)??梢酝ㄟ^(guò) req.ContentLength 獲取該字段的值。
  • TransferEncoding 字段表示請(qǐng)求體的傳輸編碼方式,如 "chunked"。可以通過(guò) req.TransferEncoding 獲取該字段的值。
  • Close 字段表示請(qǐng)求是否需要關(guān)閉連接??梢酝ㄟ^(guò) req.Close 獲取該字段的值。
  • Host 字段表示請(qǐng)求的主機(jī)名??梢酝ㄟ^(guò) req.Host 獲取該字段的值。
  • Form 和 PostForm 字段用于存儲(chǔ)請(qǐng)求的表單數(shù)據(jù)。它們都是 url.Values 類型的對(duì)象,提供了一系列方法來(lái)獲取表單數(shù)據(jù)。
  • MultipartForm 字段用于存儲(chǔ)請(qǐng)求的多部分表單數(shù)據(jù)。它是一個(gè) multipart.Form 類型的指針,提供了一系列方法來(lái)獲取多部分表單數(shù)據(jù)。
  • Trailer 字段表示請(qǐng)求尾部的頭部信息。它是一個(gè) http.Header 類型的對(duì)象,與 Header 字段類似。
  • RemoteAddr 字段表示請(qǐng)求的遠(yuǎn)程地址??梢酝ㄟ^(guò) req.RemoteAddr 獲取該字段的值。
  • RequestURI 字段表示請(qǐng)求的 URI??梢酝ㄟ^(guò) req.RequestURI 獲取該字段的值。
  • TLS 字段表示請(qǐng)求的 TLS 連接狀態(tài)。它是一個(gè) *tls.ConnectionState 類型的指針,可以用于獲取有關(guān) TLS 連接的信息。
  • Cancel 字段表示一個(gè)通道,用于取消請(qǐng)求??梢酝ㄟ^(guò) req.Cancel 獲取該字段的值。
  • Response 字段表示與請(qǐng)求關(guān)聯(lián)的響應(yīng)對(duì)象。它是一個(gè) *http.Response 類型的指針。
  • ctx 字段表示請(qǐng)求的上下文。可以通過(guò) req.Context() 獲取該字段的值。

以上就是 Request 對(duì)象的結(jié)構(gòu)及其各個(gè)字段的含義。接下來(lái),我們將介紹如何使用 Request 對(duì)象進(jìn)行操作。

3. Request 對(duì)象的操作

3.1 請(qǐng)求 URL

Request 對(duì)象中的 URL 屬性表示請(qǐng)求的 URL。它是一個(gè)指向 url.URL 類型的指針,用于存儲(chǔ)和操作 URL 相關(guān)的信息。

url.URL 類型是 Golang 標(biāo)準(zhǔn)庫(kù)中的一個(gè)結(jié)構(gòu)體,它包含了 URL 的各個(gè)組成部分,如協(xié)議 scheme、主機(jī) host、路徑 path、查詢參數(shù) query 等。url.URL 類型提供了一系列方法來(lái)訪問(wèn)和修改 URL 的各個(gè)部分。

下面我們來(lái)看一下 url.URL 類型的定義:

type URL struct {
 ? ?Scheme ? ? string
 ? ?Opaque ? ? string ? ?// 不透明的部分,用于協(xié)議特定的解析
 ? ?User ? ? ? *Userinfo // 用戶名和密碼信息
 ? ?Host ? ? ? string ? ?// 主機(jī)(host 或 host:port)
 ? ?Path ? ? ? string ? ?// 路徑
 ? ?RawPath ? ?string ? ?// 編碼的路徑(含特殊字符)
 ? ?RawQuery ? string ? ?// 編碼的查詢參數(shù)(含特殊字符)
 ? ?Fragment ? string ? ?// 片段標(biāo)識(shí)符
 ? ?ForceQuery bool ? ? ?// 強(qiáng)制使用查詢參數(shù)
}

URL 結(jié)構(gòu)體中的字段表示了 URL 的各個(gè)部分,下面我們逐一介紹這些字段的含義和用法:

  • Scheme 字段表示 URL 的協(xié)議部分,如 http、https 等。可以通過(guò) url.Scheme 來(lái)獲取或設(shè)置該字段的值。
  • Opaque 字段用于協(xié)議特定的解析,一般用于非標(biāo)準(zhǔn)協(xié)議。對(duì)于常見(jiàn)的 HTTP 和 HTTPS 協(xié)議,該字段為空字符串。
  • User 字段表示 URL 中的用戶名和密碼信息,是一個(gè)指向 url.Userinfo 類型的指針。可以通過(guò) url.User 來(lái)獲取或設(shè)置該字段的值。
  • Host 字段表示 URL 的主機(jī)部分,可以包含主機(jī)名和端口號(hào)??梢酝ㄟ^(guò) url.Host 來(lái)獲取或設(shè)置該字段的值。
  • Path 字段表示 URL 的路徑部分,如 /path/to/resource??梢酝ㄟ^(guò) url.Path 來(lái)獲取或設(shè)置該字段的值。
  • RawPath 字段表示編碼后的路徑部分,包含特殊字符的轉(zhuǎn)義表示??梢酝ㄟ^(guò) url.RawPath 來(lái)獲取或設(shè)置該字段的值。
  • RawQuery 字段表示編碼后的查詢參數(shù)部分,包含特殊字符的轉(zhuǎn)義表示??梢酝ㄟ^(guò) url.RawQuery 來(lái)獲取或設(shè)置該字段的值。
  • Fragment 字段表示 URL 的片段標(biāo)識(shí)符,如 #fragment??梢酝ㄟ^(guò) url.Fragment 來(lái)獲取或設(shè)置該字段的值。
  • ForceQuery 字段表示是否強(qiáng)制使用查詢參數(shù)。當(dāng)該字段為 true 時(shí),即使沒(méi)有查詢參數(shù),URL 也會(huì)以 ? 開頭。默認(rèn)情況下,該字段為 false。

過(guò) URL 結(jié)構(gòu)體的字段,我們可以輕松地訪問(wèn)和操作 URL 的各個(gè)部分。這在處理請(qǐng)求中的 URL 參數(shù)、構(gòu)建新的 URL 等場(chǎng)景中非常有用。

下面是一些示例代碼,展示了如何使用 URL 屬性的不同方法:

package main
?
import (
    "fmt"
    "net/http"
)
?
func main() {
    // 創(chuàng)建一個(gè) GET 請(qǐng)求
    req, err := http.NewRequest("GET", "https://example.com/path?param=value", nil)
    if err != nil {
        fmt.Println("創(chuàng)建請(qǐng)求失敗:", err)
        return
    }
?
    // 獲取 URL 的各個(gè)部分
    fmt.Println("協(xié)議:", req.URL.Scheme) ? ? ? ? ? ? // 輸出: https
    fmt.Println("主機(jī):", req.URL.Host) ? ? ? ? ? ? ? // 輸出: example.com
    fmt.Println("路徑:", req.URL.Path) ? ? ? ? ? ? ? // 輸出: /path
    fmt.Println("查詢參數(shù):", req.URL.RawQuery) ? ? ? // 輸出: param=value
    fmt.Println("片段標(biāo)識(shí)符:", req.URL.Fragment) ? ? // 輸出: 空字符串
    fmt.Println("用戶名:", req.URL.User.Username()) // 輸出: 空字符串
?
    // 修改 URL 的部分內(nèi)容
    req.URL.Scheme = "http"
    req.URL.Host = "google.com"
    req.URL.Path = "/search"
    req.URL.RawQuery = "q=golang"
    req.URL.Fragment = "top"
?
    // 獲取修改后的 URL
    fmt.Println("修改后的 URL:", req.URL.String()) // 輸出: http://google.com/search?q=golang#top
}

在上述示例中,我們首先創(chuàng)建了一個(gè) GET 請(qǐng)求對(duì)象 req,其 URL 為 example.com/path?param=…。然后,我們使用 req.URL 屬性來(lái)訪問(wèn)和操作 URL 的各個(gè)部分。通過(guò) req.URL.Scheme、req.URL.Host、req.URL.Path、req.URL.RawQuery 和 req.URL.Fragment,我們分別獲取了 URL 的協(xié)議、主機(jī)、路徑、查詢參數(shù)和片段標(biāo)識(shí)符的值。此外,我們還通過(guò) req.URL.User.Username() 獲取了 URL 中的用戶名(在這個(gè)示例中為空字符串)。

接下來(lái),我們對(duì) URL 的各個(gè)部分進(jìn)行了修改。通過(guò)賦值操作,我們改變了 URL 的協(xié)議為 http,主機(jī)為 google.com,路徑為 /search,查詢參數(shù)為 q=golang,片段標(biāo)識(shí)符為 top。最后,我們使用 req.URL.String() 方法獲取修改后的 URL 的字符串表示。

3.2 設(shè)置請(qǐng)求頭

Request 對(duì)象的 Header 字段用于存儲(chǔ)請(qǐng)求頭信息。我們可以使用該字段來(lái)設(shè)置、獲取和刪除請(qǐng)求頭的各個(gè)字段。

req.Header.Set("Content-Type", "application/json")
req.Header.Add("Authorization", "Bearer token")
req.Header.Del("User-Agent")

上述代碼示例中,Set 方法用于設(shè)置指定字段的值,Add 方法用于添加新的字段和值,Del 方法用于刪除指定字段。通過(guò)這些方法,我們可以輕松地操作請(qǐng)求頭信息。

以下是一個(gè)示例代碼,演示如何處理請(qǐng)求頭:

import (
 ? ?"net/http"
 ? ?"fmt"
)
?
func main() {
 ? ?req, err := http.NewRequest("GET", "https://example.com", nil)
 ? ?if err != nil {
 ? ? ? ?fmt.Println("創(chuàng)建請(qǐng)求失?。?, err)
 ? ? ? ?return
 ?  }
?
 ? ?req.Header.Set("Content-Type", "application/json")
 ? ?req.Header.Add("Authorization", "Bearer mytoken")
?
 ? ?fmt.Println("Content-Type:", req.Header.Get("Content-Type"))
 ? ?fmt.Println("Authorization:", req.Header.Get("Authorization"))
?
 ? ?// 處理請(qǐng)求...
}

在上述代碼中,我們首先使用 Set 方法設(shè)置了 Content-Type 和 Authorization 兩個(gè)請(qǐng)求頭的值。然后使用 Get 方法獲取了這兩個(gè)請(qǐng)求頭的值,并打印輸出。

3.3 讀取請(qǐng)求參數(shù)

在 HTTP 請(qǐng)求中,參數(shù)通常以查詢字符串或表單的形式發(fā)送。我們可以通過(guò) URL 字段來(lái)獲取請(qǐng)求的查詢參數(shù),通過(guò) Form 和 PostForm 字段來(lái)獲取表單參數(shù)。

query := req.URL.Query().Get("key")
formValue := req.Form.Get("field")
postFormValue := req.PostForm.Get("field")

以上代碼示例演示了如何讀取請(qǐng)求的查詢參數(shù)、表單參數(shù)和 POST 表單參數(shù)的值。通過(guò)這些方法,我們可以方便地處理請(qǐng)求中的參數(shù)。

3.4 獲取請(qǐng)求體內(nèi)容

有些 HTTP 請(qǐng)求需要在請(qǐng)求體中傳輸數(shù)據(jù),例如 POST 請(qǐng)求。Request 對(duì)象的 Body 屬性是一個(gè) io.ReadCloser 類型,顧名思義,這個(gè)類型實(shí)現(xiàn)了 io.Reader 和 io.Closer 接口,表示請(qǐng)求的主體數(shù)據(jù)。我們可以通過(guò) Body 屬性來(lái)讀取請(qǐng)求體的內(nèi)容。以下是一個(gè)示例代碼:

import (
 ? ?"net/http"
 ? ?"fmt"
 ? ?"io/ioutil"
)
?
func main() {
 ? ?req, err := http.NewRequest("POST", "https://example.com", nil)
 ? ?if err != nil {
 ? ? ? ?fmt.Println("創(chuàng)建請(qǐng)求失?。?, err)
 ? ? ? ?return
 ?  }
?
 ? ?req.Header.Set("Content-Type", "application/json")
?
 ? ?// 模擬請(qǐng)求體數(shù)據(jù)
 ? ?requestBody := `{"name": "John", "age": 30}`
 ? ?req.Body = ioutil.NopCloser(strings.NewReader(requestBody))
?
 ? ?// 讀取請(qǐng)求體
 ? ?body, err := ioutil.ReadAll(req.Body)
 ? ?if err != nil {
 ? ? ? ?fmt.Println("讀取請(qǐng)求體失?。?, err)
 ? ? ? ?return
 ?  }
?
 ? ?fmt.Println("請(qǐng)求體:", string(body))
?
 ? ?// 處理請(qǐng)求...
}

在上述代碼中,我們首先使用 ioutil.NopCloser 函數(shù)將請(qǐng)求體數(shù)據(jù)封裝成一個(gè) io.ReadCloser 類型,然后將其賦值給 Request 對(duì)象的 Body 屬性。接著使用 ioutil.ReadAll 函數(shù)讀取請(qǐng)求體的內(nèi)容,并打印輸出。

3.5 其他操作

除了上述介紹的操作之外,Request 對(duì)象還提供了其他一些方法和字段,如:

  • WithContext 方法用于返回一個(gè)新的 Request 對(duì)象,該對(duì)象與原始請(qǐng)求對(duì)象共享相同的上下文。
  • WithCancel 方法用于返回一個(gè)新的 Request 對(duì)象,該對(duì)象與原始請(qǐng)求對(duì)象共享相同的取消通道。
  • WithContext 和 WithCancel 方法可以用于處理請(qǐng)求的上下文和取消操作。
  • Close 方法用于關(guān)閉請(qǐng)求的主體。當(dāng)不再需要讀取請(qǐng)求主體時(shí),我們可以調(diào)用該方法來(lái)關(guān)閉連接。
  • ParseMultipartForm 方法用于解析多部分表單數(shù)據(jù)。在處理包含文件上傳的表單時(shí),我們可以使用該方法來(lái)解析請(qǐng)求體。
  • FormFile 方法用于獲取上傳的文件。在處理包含文件上傳的表單時(shí),我們可以使用該方法來(lái)獲取上傳的文件。
  • Referer 和 UserAgent 字段分別表示請(qǐng)求的引用頁(yè)面和用戶代理信息。
  • 通過(guò)上述方法和字段,我們可以更靈活地操作和處理 Request 對(duì)象。

4. 總結(jié)

通過(guò)本文的介紹,我們從多個(gè)方面深入理解了 Golang 中的 Request 對(duì)象。我們?cè)敿?xì)介紹了 Request 對(duì)象的結(jié)構(gòu)、字段含義和用法,并演示了如何設(shè)置請(qǐng)求頭、讀取請(qǐng)求參數(shù)和獲取請(qǐng)求體內(nèi)容。此外,我們還通過(guò)源碼分析的方式進(jìn)一步了解了 Request 對(duì)象的實(shí)現(xiàn)原理。

Request 對(duì)象在 Golang 的 HTTP 編程中起著重要的作用,它提供了處理和操作 HTTP 請(qǐng)求的豐富功能。深入理解 Request 對(duì)象將幫助我們更好地使用 Golang 構(gòu)建高效的 HTTP 客戶端和服務(wù)器。

到此這篇關(guān)于解密Golang中Request對(duì)象的操作的文章就介紹到這了,更多相關(guān)Golang Request對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go 讀取BMP文件頭二進(jìn)制讀取方式

    go 讀取BMP文件頭二進(jìn)制讀取方式

    這篇文章主要介紹了go 讀取BMP文件頭二進(jìn)制讀取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • golang?gorm框架數(shù)據(jù)庫(kù)的連接操作示例

    golang?gorm框架數(shù)據(jù)庫(kù)的連接操作示例

    這篇文章主要為大家介紹了golang?gorm框架數(shù)據(jù)庫(kù)操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • golang map的基本操作及定義方式

    golang map的基本操作及定義方式

    這篇文章主要介紹了golang-map的基本操作,由于map是引用類型,所以在操作的時(shí)候,必須先初始化,本文通過(guò)多種方式給大家講解map的定義方式,需要的朋友可以參考下
    2022-08-08
  • go語(yǔ)言題解LeetCode1275找出井字棋的獲勝者示例

    go語(yǔ)言題解LeetCode1275找出井字棋的獲勝者示例

    這篇文章主要為大家介紹了go語(yǔ)言題解LeetCode1275找出井字棋的獲勝者示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 詳解go語(yǔ)言的并發(fā)

    詳解go語(yǔ)言的并發(fā)

    這篇文章主要介紹了go語(yǔ)言并發(fā)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用golang,感興趣的朋友可以了解下
    2021-03-03
  • intelliJ?idea安裝go開發(fā)環(huán)境并搭建go項(xiàng)目(打包)全過(guò)程

    intelliJ?idea安裝go開發(fā)環(huán)境并搭建go項(xiàng)目(打包)全過(guò)程

    最近在配置idea開發(fā)go語(yǔ)言時(shí)碰到很多問(wèn)題,所以這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于intelliJ?idea安裝go開發(fā)環(huán)境并搭建go項(xiàng)目(打包)的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • 詳解Go 結(jié)構(gòu)體格式化輸出

    詳解Go 結(jié)構(gòu)體格式化輸出

    這篇文章主要介紹了Go 結(jié)構(gòu)體格式化輸出的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)go語(yǔ)言,感興趣的朋友可以了解下
    2020-08-08
  • 十個(gè)示例帶你深入了解Go語(yǔ)言中的接口

    十個(gè)示例帶你深入了解Go語(yǔ)言中的接口

    這篇文章主要是通過(guò)十個(gè)簡(jiǎn)單的示例帶大家深入了解一下Go語(yǔ)言中接口的使用,文中的示例代碼簡(jiǎn)潔易懂,具有一定的學(xué)習(xí)價(jià)值,需要的可以了解一下
    2023-02-02
  • golang 執(zhí)行命令行的實(shí)現(xiàn)

    golang 執(zhí)行命令行的實(shí)現(xiàn)

    本文主要介紹了golang 執(zhí)行命令行的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 快速升級(jí)Go版本(幾分鐘就搞定了)

    快速升級(jí)Go版本(幾分鐘就搞定了)

    go現(xiàn)在的更新速度是非常的快啊,用著用著網(wǎng)上的教程就不配套了,下面這篇文章主要給大家介紹了關(guān)于快速升級(jí)Go版本的相關(guān)資料,文中介紹的方法幾分鐘就搞定了,需要的朋友可以參考下
    2024-05-05

最新評(píng)論