一、httplib
1、配置文件解析
這是一個用來解析文件的庫,它的設計思路來自於 database/sql
,目前支持解析的文件格式有 ini、json、xml、yaml,可以通過如下方式進行安裝:
go get github.com/astaxie/beego/config
如果你使用xml 或者 yaml 驅動就需要手工安裝引入包
go get -u github.com/astaxie/beego/config/xml
2、始何使用
首先初始化一個解析器對象
iniconf, err := NewConfig("ini", "testini.conf") if err != nil { t.Fatal(err) }
然后通過對象獲取數據
iniconf.String("appname")
解析器對象支持的函數有如下:
- Set(key, val string) error
- String(key string) string
- Int(key string) (int, error)
- Int64(key string) (int64, error)
- Bool(key string) (bool, error)
- Float(key string) (float64, error)
- DIY(key string) (interface{}, error)
ini 配置文件支持 section 操作,key通過 section::key
的方式獲取
例如下面這樣的配置文件
[demo] key1 = "asta" key2 = "xie"
那么可以通過 iniconf.String("demo::key2")
獲取值.
如何獲取環境變量
config 模塊支持環境變量配置,對應配置項 Key 格式為 ${環境變量名}
,則 Value = os.Getenv(‘環境變量名’)。
同時可配置默認值,當環境變量無此配置或者環境變量值為空時,則優先使用默認值。包含默認值的 Key 格式為 ${GOPATH||/home/workspace/go/}
,使用||
分割環境變量和默認值。
注意 獲取環境變量值僅僅是在配置文件解析時處理,而不會在調用函數獲取配置項時實時處理。
示例:
controllers/testHttpLib.go
package controllers import ( "github.com/astaxie/beego" "github.com/astaxie/beego/httplib" ) type TestHttpLibController struct { beego.Controller } func (c *TestHttpLibController) Get() { req := httplib.Get("http://www.baidu.com") str, err := req.String() if err != nil { panic(err) } //獲取網站源代碼 //c.Ctx.WriteString("start") //直接打開網站 c.Ctx.WriteString(str) }
routers/router.go
package routers import ( "web/controllers" "github.com/astaxie/beego" ) func init() { beego.Router("/", &controllers.MainController{}) beego.Router("/test_httplib", &controllers.TestHttpLibController{}, "get:Get;post:Post") }
執行結果: 直接打開網站
二、context
1、上下文模塊
上下文模塊主要是針對 HTTP 請求中,request 和 response 的進一步封裝,他包括用戶的輸入和輸出,用戶的輸入即為 request,context 模塊中提供了 Input 對象進行解析,用戶的輸出即為 response,context 模塊中提供了 Output 對象進行輸出。
2、context對象
context 對象是對 Input 和 Output 的封裝,里面封裝了幾個方法:
- Redirect
- Abort
- WriteString
- GetCookie
- SetCookie
context 對象是 Filter 函數的參數對象,這樣你就可以通過 filter 來修改相應的數據,或者提前結束整個的執行過程。
Output 對象
Output 是針對 Response 的封裝,里面提供了很多方便的方法:
-
Header
設置輸出的 header 信息,例如
Header("Server","beego")
-
Body
設置輸出的內容信息,例如
Body([]byte("astaxie"))
-
Cookie
設置輸出的 cookie 信息,例如
Cookie("sessionID","beegoSessionID")
-
Json
把 Data 格式化為 Json,然后調用 Body 輸出數據
-
Jsonp
把 Data 格式化為 Jsonp,然后調用 Body 輸出數據
-
Xml
把 Data 格式化為 Xml,然后調用 Body 輸出數據
-
Download
把 file 路徑傳遞進來,然后輸出文件給用戶
-
ContentType
設置輸出的 ContentType
-
SetStatus
設置輸出的 status
-
Session
設置在服務器端保存的值,例如
Session("username","astaxie")
,這樣用戶就可以在下次使用的時候讀取 -
IsCachable
根據 status 判斷,是否為緩存類的狀態
-
IsEmpty
根據 status 判斷,是否為輸出內容為空的狀態
-
IsOk
根據 status 判斷,是否為 200 的狀態
-
IsSuccessful
根據 status 判斷,是否為正常的狀態
-
IsRedirect
根據 status 判斷,是否為跳轉類的狀態
-
IsForbidden
根據 status 判斷,是否為禁用類的狀態
-
IsNotFound
根據 status 判斷,是否為找不到資源類的狀態
-
IsClientError
根據 status 判斷,是否為請求客戶端錯誤的狀態
-
IsServerError
根據 status 判斷,是否為服務器端錯誤的狀態
獲取IP地址和端口
示例:
controllers/testContext.go
package controllers import ( "strconv" "github.com/astaxie/beego" ) type TestContextController struct { beego.Controller } func (c *TestContextController) Get() { c.Ctx.WriteString(c.Ctx.Input.IP() + ":" + strconv.Itoa(c.Ctx.Input.Port())) }
routers/router.go
package routers import ( "web/controllers" "github.com/astaxie/beego" ) func init() { beego.Router("/", &controllers.MainController{}) beego.Router("/test_context", &controllers.TestContextController{}, "get:Get;post:Post") }
執行結果:
http://127.0.0.1:8080/test_context 返回結果: 127.0.0.1:8080
Input 對象
Input 對象是針對 request 的封裝,里面通過 reqeust 實現很多方便的方法,具體如下: Protocol 獲取用戶請求的協議,例如 HTTP/1.0 Uri 用戶請求的 RequestURI,例如 /hi?id=1001 Url 請求的 URL 地址,例如 /hi Site 請求的站點地址,scheme+doamin 的組合,例如 http://beego.me Scheme 請求的 scheme,例如 “http” 或者 “https” Domain 請求的域名,例如 beego.me Host 請求的域名,和 domain 一樣 Method 請求的方法,標准的 HTTP 請求方法,例如 GET、POST 等 Is 判斷是否是某一個方法,例如 Is("GET") 返回 true IsAjax 判斷是否是 AJAX 請求,如果是返回 true,不是返回 false IsSecure 判斷當前請求是否 HTTPS 請求,是返回 true,否返回 false IsWebsocket 判斷當前請求是否 Websocket 請求,如果是返回 true,否返回 false IsUpload 判斷當前請求是否有文件上傳,有返回 true,否返回 false IP 返回請求用戶的 IP,如果用戶通過代理,一層一層剝離獲取真實的 IP Proxy 返回用戶代理請求的所有 IP Refer 返回請求的 refer 信息 SubDomains 返回請求域名的根域名,例如請求是 blog.beego.me,那么調用該函數返回 beego.me Port 返回請求的端口,例如返回 8080 UserAgent 返回請求的 UserAgent,例如 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36 Param 在路由設置的時候可以設置參數,這個是用來獲取那些參數的,例如 Param(":id"),返回12 Query 該函數返回 Get 請求和 Post 請求中的所有數據,和 PHP 中 $_REQUEST 類似 Header 返回相應的 header 信息,例如 Header("Accept-Language"),就返回請求頭中對應的信息 zh-CN,zh;q=0.8,en;q=0.6 Cookie 返回請求中的 cookie 數據,例如 Cookie("username"),就可以獲取請求頭中攜帶的 cookie 信息中 username 對應的值 Session session 是用戶可以初始化的信息,默認采用了 beego 的 session 模塊中的 Session 對象,用來獲取存儲在服務器端中的數據。 Body 返回請求 Body 中數據,例如 API 應用中,很多用戶直接發送 json 數據包,那么通過 Query 這種函數無法獲取數據,就必須通過該函數獲取數據。該函數已經 beego 1.5 版本之后刪除,目前可以通過 RequestBody 獲取數據。 GetData 用來獲取 Input 中 Data 中的數據 SetData 用來設置 Input 中 Data 的值,上面 GetData 和這個函數都是用來方便用戶在 Filter 中傳遞數據到 Controller 中來執行
Query方法
示例:
controllers/testContext.go
package controllers import ( "strconv" "github.com/astaxie/beego" ) type TestContextController struct { beego.Controller } func (c *TestContextController) Get() { c.Ctx.WriteString(c.Ctx.Input.IP() + ":" + strconv.Itoa(c.Ctx.Input.Port())) //Query方法 c.Ctx.WriteString(c.Ctx.Input.Query("name")) //等價於php中的 $_REQUEST["name"] }
routers/router.go
package routers import ( "web/controllers" "github.com/astaxie/beego" ) func init() { beego.Router("/", &controllers.MainController{}) beego.Router("/test_context", &controllers.TestContextController{}, "get:Get;post:Post") }
執行結果:
http://127.0.0.1:8080/test_context?name=nulige 返回結果:
127.0.0.1:8080nulige
另外一種方法:
示例:
controllers/testContext.go
package controllers import ( "strconv" "github.com/astaxie/beego" ) type TestContextController struct { beego.Controller } func (c *TestContextController) Get() { c.Ctx.WriteString(c.Ctx.Input.IP() + ":" + strconv.Itoa(c.Ctx.Input.Port())) //Query方法 c.Ctx.WriteString(c.Ctx.Input.Query("name")) //等價於php中的 $_REQUEST["name"] m := make(map[string]float64) m["zhangsan"] = 98.7 c.Ctx.Output.JSON(m, false, false) }
routers/router.go
package routers import ( "web/controllers" "github.com/astaxie/beego" ) func init() { beego.Router("/", &controllers.MainController{}) beego.Router("/test_context", &controllers.TestContextController{}, "get:Get;post:Post") }
執行結果:
http://127.0.0.1:8080/test_context 返回結果:
127.0.0.1:8080{"zhangsan":98.7}