Go語言之高級篇beego框架之config、httplib、context


一、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}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM