W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
?GoFrame
?是一款基礎(chǔ)設(shè)施建設(shè)比較完善的模塊化框架,?WebServer
?模塊是其中比較核心的模塊,我們這里將Web服務開發(fā)作為框架入門的選擇,便于大家更容易學習和理解。
?GoFrame
?框架提供了非常強大的?WebServer
?,由?ghttp
?模塊實現(xiàn)。實現(xiàn)了豐富完善的相關(guān)組件,例如:?Router
?、?Cookie
?、?Session
?、路由注冊、配置管理、模板引擎、緩存控制等等,支持熱重啟、熱更新、多域名、多端口、多實例、?HTTPS
?、?Rewrite
?、?PProf
?等等特性。
接口文檔地址:
https://pkg.go.dev/github.com/gogf/gf/v2/net/ghttp
老規(guī)矩,我們先來一個?Hello World
?:
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.Write("哈嘍世界!")
})
s.Run()
}
這便是一個最簡單的服務,默認情況下它不支持靜態(tài)文件處理,只有一個功能,訪問 ?http://127.0.0.1/
? 的時候,它會返回哈嘍世界!。
任何時候,您都可以通過?g.Server()
?方法獲得一個默認的?Server
?對象,該方法采用單例模式設(shè)計,也就是說,多次調(diào)用該方法,返回的是同一個?Server
?對象。通過?Run()
?方法執(zhí)行?Server
?的監(jiān)聽運行,在沒有任何額外設(shè)置的情況下,它默認監(jiān)聽?80
?端口。
關(guān)于其中的路由注冊,我們將會在后續(xù)的章節(jié)中介紹,我們繼續(xù)來看看如何創(chuàng)建一個支持靜態(tài)文件的?Server
?。
創(chuàng)建并運行一個支持靜態(tài)文件的?WebServer
?:
package main
import (
"github.com/gogf/gf/v2/frame/g"
)
func main() {
s := g.Server()
s.SetIndexFolder(true)
s.SetServerRoot("/home/www/")
s.Run()
}
創(chuàng)建了?Server
?對象之后,我們可以使用?Set*
?方法來設(shè)置?Server
?的屬性,我們這里的示例中涉及到了兩個屬性設(shè)置方法:
SetIndexFolder
?用來設(shè)置是否允許列出?Server
?主目錄的文件列表(默認為?false
?)。
SetServerRoot
?用來設(shè)置?Server
?的主目錄(類似?nginx
?中的?root
?配置,默認為空)。
?Server
?默認情況下是沒有任何主目錄的設(shè)置,只有設(shè)置了主目錄,才支持對應主目錄下的靜態(tài)文件的訪問。
?Server
?同時支持多端口監(jiān)聽,只需要往?SetPort
?參數(shù)設(shè)置多個端口號即可(當然,針對于?HTTPS
?服務,我們也同樣可以通過?SetHTTPSPort
?來設(shè)置綁定并支持多個端口號的監(jiān)聽,?HTTPS
?服務的介紹請參看后續(xù)對應章節(jié))。
我們來看一個例子:
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("go frame!")
})
s.SetPort(8100, 8200, 8300)
s.Run()
}
執(zhí)行以上示例后,我們訪問以下URL將會得到期望的相同結(jié)果:
http://127.0.0.1:8100/
http://127.0.0.1:8200/
http://127.0.0.1:8300/
?Server
?支持同一進程多實例運行,下面我們來看一個例子:
package main
import (
"github.com/gogf/gf/v2/frame/g"
)
func main() {
s1 := g.Server("s1")
s1.SetPort(8080)
s1.SetIndexFolder(true)
s1.SetServerRoot("/home/www/static1")
s1.Start()
s2 := g.Server("s2")
s2.SetPort(8088)
s2.SetIndexFolder(true)
s2.SetServerRoot("/home/www/static2")
s2.Start()
g.Wait()
}
可以看到我們在支持多個?Server
?的語句中,給?g.Server
?方法傳遞了不同的單例名稱參數(shù),該參數(shù)用于標識不同的?Server
?實例,因此需要保證唯一性。如果需要獲取同一個?Server
?實例,那么傳入同一個名稱即可。例如在多個?goroutine
?中,或者不同的模塊中,都可以通過?g.Server
?獲取到同一個?Server
?實例。
?Server
?支持多域名綁定,并且不同的域名可以綁定不同的服務。
我們來看一個簡單的例子:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func Hello1(r *ghttp.Request) {
r.Response.Write("127.0.0.1: Hello1!")
}
func Hello2(r *ghttp.Request) {
r.Response.Write("localhost: Hello2!")
}
func main() {
s := g.Server()
s.Domain("127.0.0.1").BindHandler("/", Hello1)
s.Domain("localhost").BindHandler("/", Hello2)
s.Run()
}
我們訪問 http://127.0.0.1/ 和 http://localhost/ 可以看輸出不同的內(nèi)容。
此外,?Domain
?方法支持多個域名參數(shù),使用英文“?,
?”號分隔,例如:
s.Domain("localhost1,localhost2,localhost3").BindHandler("/", Hello2)
這條語句的表示將?Hello2
?方法注冊到指定的3個域名中(?localhost1~3
?),對其他域名不可見。
需要注意的是:?Domain
?方法的參數(shù)必須是準確的域名,不支持泛域名形式,例如:?*.goframe.org
?或者?.goframe.org
?是不支持的,?api.goframe.org
?或者?goframe.org
?才被認為是正確的域名參數(shù)。
?Server
?提供了非常出色的路由特性,我們先來看一個簡單的示例:
package main
import (
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/frame/g"
)
func main() {
s := g.Server()
s.BindHandler("/{class}-{course}/:name/*act", func(r *ghttp.Request) {
r.Response.Writef(
"%v %v %v %v",
r.Get("class"),
r.Get("course"),
r.Get("name"),
r.Get("act"),
)
})
s.SetPort(8199)
s.Run()
}
這是一個混合的路由規(guī)則示例,用于展示某個班級、某個學科、某個學生、對應的操作,運行后,我們可以通過例如該地址: http://127.0.0.1:8199/class3-math/john/score 看到測試結(jié)果。在頁面上你可以看得到對應的路由規(guī)則都被一一解析,業(yè)務層可以根據(jù)解析的參數(shù)進行對應的業(yè)務邏輯處理。
?GoFrame
?的核心組件均實現(xiàn)了便捷的配置管理特性,僅需通過配置文件的修改即可實現(xiàn)組件的功能配置。大多數(shù)的場景中我們推薦使用配置文件來管理組件的配置。
?Server
?內(nèi)置支持平滑重啟特性。
?Server
?支持?HTTPS
?服務,并且也同時支持單進程提供?HTTP
?&?HTTPS
?服務。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: