新聞中心
請求輸入依靠 ?ghttp.Request? 對象實現(xiàn),?ghttp.Request?繼承了底層的?http.Request?對象。?ghttp.Request?包含一個與當前請求對應的返回輸出對象?Response?,用于數(shù)據(jù)的返回處理。

相關方法: https://pkg.GO.dev/github.com/gogf/gf/v2/net/ghttp#Request
簡要說明
可以看到?Request?對象的參數(shù)獲取方法非常豐富,可以分為以下幾類:
- ?
Get?: 常用方法,簡化參數(shù)獲取,?GetRequest?的別名。 - ?
GetQuery?: 獲取?GET?方式傳遞過來的參數(shù),包括?Query String?及?Body?參數(shù)解析。 - ?
GetForm?: 獲取表單方式傳遞過來的參數(shù),表單方式提交的參數(shù)?Content-Type?往往為?application/x-www-form-urlencoded?, ?application/form-data?, ?multipart/form-data?, ?multipart/mixed?等等。 - ?
GetRequest?: 獲取客戶端提交的參數(shù),不區(qū)分提交方式。 - ?
Get*Struct?: 將指定提交類型的所有請求參數(shù)綁定到指定的?struct?對象上,注意給定的參數(shù)為對象指針。絕大部分場景中往往使用?Parse?方法將請求數(shù)據(jù)轉換為請求對象,具體詳見后續(xù)章節(jié)。 - ?
GetBody/GetBodyString?: 獲取客戶端提交的原始數(shù)據(jù),該數(shù)據(jù)是客戶端寫入到?body?中的原始數(shù)據(jù),與?HTTP Method?無關,例如客戶端提交?JSON/XML?數(shù)據(jù)格式時可以通過該方法獲取原始的提交數(shù)據(jù)。 - ?
GetJson?: 自動將原始請求信息解析為?gjson.Json?對象指針返回。 - ?
Exit*?: 用于請求流程退出控制,詳見本章后續(xù)說明;
提交方式
?GoFrame?框架的參數(shù)獲取不是通過?HTTP Method?來做區(qū)分,而是通過參數(shù)提交類型來區(qū)分。例如,分別通過?HTTP Method: POST、INPUT、DELETE?來提交表單參數(shù),在服務端獲取參數(shù)不是通過?GetPost/GetInput/GetDelete?的方式來獲取,而是統(tǒng)一通過?GetForm?方法來獲取表單參數(shù),針對其他的?HTTP Method?也是如此。
在?GoFrame?框架下,有以下幾種提交類型:
- ?
Router?: 路由參數(shù),來源于路由規(guī)則匹配。 - ?
Query?: ?URL?中的?Query String?參數(shù)解析,如:http://127.0.0.1/index?id=1&name=john 中的??id=1?&name=john?。 - ?
Form?: 表單提交參數(shù),最常見的提交方式,提交的?Content-Type?往往為:?application/x-www-form-urlencoded?、?multipart/form-data?、?multipart/mixed?。 - ?
Body?: 原始提交內容,從?Body?中獲取并解析得到的參數(shù),?JSON/XML?請求往往使用這種方式提交。 - ?
Custom?: 自定義參數(shù),往往在服務端的中間件、服務函數(shù)中通過?SetParam/GetParam?方法管理。
參數(shù)類型
獲取的參數(shù)方法可以對指定鍵名的數(shù)據(jù)進行自動類型轉換,例如:http://127.0.0.1:8199/?amount=19.66,通過?Get(xxx).String()?將會返回?19.66?的字符串類型,?Get(xxx).Float32()/Get(xxx).Float64()?將會分別返回?float32?和?float64?類型的數(shù)值?19.66?。但是,?Get(xxx).Int()/Get(xxx).Uint()?將會返回?19?(如果參數(shù)為?float?類型的字符串,將會按照向下取整進行整型轉換)。
聰明的您一定發(fā)現(xiàn)了,獲取到的參數(shù)都是泛型變量,根據(jù)該泛型變量再根據(jù)需要調用對應的方法轉換為對應的數(shù)據(jù)類型。
使用示例:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
s.BindHandler("/", func(r *ghttp.Request) {
r.Response.Writeln(r.Get("amount").String())
r.Response.Writeln(r.Get("amount").Int())
r.Response.Writeln(r.Get("amount").Float32())
})
s.SetPort(8199)
s.Run()
}執(zhí)行后我們訪問地址 http://127.0.0.1:8199/?amount=19.66 頁面輸出
19.66
19
19.66參數(shù)優(yōu)先級
我們考慮一種場景,當不同的提交方式中存在同名的參數(shù)名稱會怎么樣?在?GoFrame?框架下,我們根據(jù)不同的獲取方法,將會按照不同的優(yōu)先級進行獲取,優(yōu)先級高的方式提交的參數(shù)將會優(yōu)先覆蓋其他方式的同名參數(shù)。優(yōu)先級規(guī)則如下:
- ?
Get?及?GetRequset?方法:?Router < Query < Body < Form < Custom?,也就是說自定義參數(shù)的優(yōu)先級最高,其次是?Form?表單參數(shù),再次是?Body?提交參數(shù),以此類推。例如,?Query?和?Form?中都提交了同樣名稱的參數(shù)id,參數(shù)值分別為1和2,那么?Get("id")/GetForm("id")?將會返回2,而?GetQuery("id")?將會返回1。 - ?
GetQuery?方法:?Query > Body?,也就是說?query string?的參數(shù)將會覆蓋?Body?中提交的同名參數(shù)。例如,?Query?和?Body?中都提交了同樣名稱的參數(shù)?id?,參數(shù)值分別為1和2,那么?Get("id")?將會返回2,而?GetQuery("id")?將會返回1。 - ?
GetForm?方法:由于該類型的方法僅用于獲取?Form?表單參數(shù),因此沒什么優(yōu)先級的差別。
使用示例:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
s.BindHandler("/input", func(r *ghttp.Request) {
r.Response.Writeln(r.Get("amount"))
})
s.BindHandler("/query", func(r *ghttp.Request) {
r.Response.Writeln(r.GetQuery("amount"))
})
s.SetPort(8199)
s.Run()
}執(zhí)行后,我們通過?curl?工具進行測試:
$ curl -d "amount=1" -X POST "http://127.0.0.1:8199/input?amount=100"
1
$ curl -d "amount=1" -X POST "http://127.0.0.1:8199/query?amount=100"
100可以看到,當我們訪問?/input?路由時,該路由方法中采用了?Get?方法獲取?amount?參數(shù),按照同名優(yōu)先級的規(guī)則返回了1,即?body?中傳遞的參數(shù)。而當我們通過?/query?路由訪問時,該路由方法內部使用了?GetQuery?方法獲取?amount?參數(shù),因此獲取到的是?query string?參數(shù)中的?amount?值,返回了100。
文章名稱:創(chuàng)新互聯(lián)GoFrame教程:GoFrame請求輸入-基本介紹
鏈接分享:http://fisionsoft.com.cn/article/dhpeijo.html


咨詢
建站咨詢
