[Go]接收請求

小黑-avatar-img
發佈於後端
更新於 發佈於 閱讀時間約 10 分鐘

ServeMux

ServeMux是一個包含映射的結構,映射會將URL映射到對應的伺服器。


DefaultServeMux

DefaultServeMux是net/HTTP中預設的多工器,是ServeMux的實例。多工器要根據URL的請求導向到不同的伺服器。DefaultServeMux是一個全域變數,也就是說專案裡的任何地方都能對它做修改,因此就可能會發生處理器衝突。所以比較建議自訂多工器。


自訂多工器

package main

import (
"fmt"
"log"
"net/http"
)

func hi(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi")
}

func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", hi)

server := &http.Server{
Addr: ":8081",
Handler: mux,
}

if err := server.ListenAndServe(); err != nil {
log.Fatal(err)
}
}


HttpRouter

HttpRouter是一個高效能、可擴充的第三方套件。他尼補了net/HTTP預設路由不足的問題。

安裝

go get -u​ github.com/julienschmidt/httprouter


GET

package main

import (
"github.com/julienschmidt/httprouter"
"net/http"
)

func main() {
router := httprouter.New()
router.GET("/default", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
w.Write([]byte("default get"))
})

http.ListenAndServe(":8083", router)
}


POST

package main

import (
"github.com/julienschmidt/httprouter"
"net/http"
)

func main() {
router := httprouter.New()
router.POST("/default", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
w.Write([]byte("default post"))
})

http.ListenAndServe(":8083", router)
}


匹配方式

  • 精確匹配:/user/:name
package main

import (
"github.com/julienschmidt/httprouter"
"net/http"
)

func main() {
router := httprouter.New()

//精确匹配
router.GET("/user/name", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
w.Write([]byte("user name:" + p.ByName("name")))
})

http.ListenAndServe(":8083", router)
}


  • 所有樣式:/user/*name
package main

import (
"github.com/julienschmidt/httprouter"
"net/http"
)

func main() {
router := httprouter.New()
//所有樣式
router.GET("/user/*name", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
w.Write([]byte("user name:" + p.ByName("name")))
})
http.ListenAndServe(":8083", router)
}


處理二級域名

package main

import (
"log"
"net/http"
"github.com/julienschmidt/httprouter"
)

type HostMap map[string]http.Handler

func (hs HostMap) ServeHTTP(w http.ResponseWriter, r *http.Request) {
//根據網域取得對應的Handler路由,然後呼叫處理(分發機制)
if handler := hs[r.Host]; handler != nil {
handler.ServeHTTP(w, r)
} else {
http.Error(w, "Forbidden", 403)
}
}

func main() {
userRouter := httprouter.New()
userRouter.GET("/", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
w.Write([]byte("sub1"))
})

dataRouter := httprouter.New()
dataRouter.GET("/", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
w.Write([]byte("sub2"))
})

//分別用於處理不同的二級域名
hs := make(HostMap)
hs["sub1.localhost:8888"] = userRouter
hs["sub2.localhost:8888"] = dataRouter

log.Fatal(http.ListenAndServe(":8888", hs))
}


靜態檔案服務

package main

import (
"log"
"net/http"
"github.com/julienschmidt/httprouter"
)

func main() {
router := httprouter.New()

router.ServeFiles("/static/*filepath", http.Dir("./files"))
log.Fatal(http.ListenAndServe(":8086", router))
}

ServeFiles()第一個參數路徑必須是「/static/*filepath」;第二個參數為檔案目錄。


處理器

package main

import (
"fmt"
"log"
"net/http"
)

type WelcomeHandler struct {
Language string
}

func (h WelcomeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%s", h.Language)
}

func main() {
mux := http.NewServeMux()
mux.Handle("/cn", WelcomeHandler{Language: "Go!"})

server := &http.Server {
Addr: ":8082",
Handler: mux,
}

if err := server.ListenAndServe(); err != nil {
log.Fatal(err)
}
}


處理器函數

package main

import (
"fmt"
"log"
"net/http"
)

func hi(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Go go!")
}

func main() {
http.HandleFunc("/", hi)
if err := http.ListenAndServe(":8081", nil); err != nil {
log.Fatal(err)
}
}




留言
avatar-img
留言分享你的想法!
avatar-img
小黑與程式的邂逅
8會員
123內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
2024/06/05
GOB Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。 遠端存取的要求條件 方法的類型可輸出 方法的本體可輸出 方法必須要有兩個參數是輸出或內建 方法的第二個參數是指標型 方法的返回類型為
Thumbnail
2024/06/05
GOB Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。 遠端存取的要求條件 方法的類型可輸出 方法的本體可輸出 方法必須要有兩個參數是輸出或內建 方法的第二個參數是指標型 方法的返回類型為
Thumbnail
2024/06/04
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
Thumbnail
2024/06/04
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
Thumbnail
2024/06/03
Gorm是一款性能極好的ORM,且友善,因此可以明顯的提高開發效率。 特點 全功能ORM 支持連結 支援Hook 支持預先載入 支援交易 支持復合主鍵 支持SQL生成器 支援資料庫自動遷移 支援自訂日誌 可擴充性 所有功能都被測試覆蓋 安裝 go get -u gor
Thumbnail
2024/06/03
Gorm是一款性能極好的ORM,且友善,因此可以明顯的提高開發效率。 特點 全功能ORM 支持連結 支援Hook 支持預先載入 支援交易 支持復合主鍵 支持SQL生成器 支援資料庫自動遷移 支援自訂日誌 可擴充性 所有功能都被測試覆蓋 安裝 go get -u gor
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
一、什麼是Web Service?   簡單說就是「服務」的概念,人與人間、電腦與電腦間都是一樣的,一個是人與人的一來一回交流,媒介是語言中文,另一個則是個人電腦與伺服器的交流,媒介是HTTP/Internet,那麼有了媒介,就會有共同格式才能做
Thumbnail
一、什麼是Web Service?   簡單說就是「服務」的概念,人與人間、電腦與電腦間都是一樣的,一個是人與人的一來一回交流,媒介是語言中文,另一個則是個人電腦與伺服器的交流,媒介是HTTP/Internet,那麼有了媒介,就會有共同格式才能做
Thumbnail
gRPC是一款跨平台、高性能的RPC框架,他可以在任何環境下執行,主要用於後端為服務開發。在用戶端應用程式中,可以像本地物件那樣呼叫遠端伺服器的方法,因此可以創建出分散式應用。 使用 到https://github.com/protocolbuffers/protobuf/releases下
Thumbnail
gRPC是一款跨平台、高性能的RPC框架,他可以在任何環境下執行,主要用於後端為服務開發。在用戶端應用程式中,可以像本地物件那樣呼叫遠端伺服器的方法,因此可以創建出分散式應用。 使用 到https://github.com/protocolbuffers/protobuf/releases下
Thumbnail
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
Thumbnail
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
Thumbnail
Accept:用戶端能夠接收的內容類型。 Accept: text/plain, text/html Accept-Charset:瀏覽器可以接受的字元編碼集。 Accept-Charset: utf8 Accept-Encoding:指定瀏覽器可以支援的web伺服器返回內容壓縮編碼
Thumbnail
Accept:用戶端能夠接收的內容類型。 Accept: text/plain, text/html Accept-Charset:瀏覽器可以接受的字元編碼集。 Accept-Charset: utf8 Accept-Encoding:指定瀏覽器可以支援的web伺服器返回內容壓縮編碼
Thumbnail
ServeMux ServeMux是一個包含映射的結構,映射會將URL映射到對應的伺服器。 DefaultServeMux DefaultServeMux是net/HTTP中預設的多工器,是ServeMux的實例。多工器要根據URL的請求導向到不同的伺服器。DefaultServeMux是
Thumbnail
ServeMux ServeMux是一個包含映射的結構,映射會將URL映射到對應的伺服器。 DefaultServeMux DefaultServeMux是net/HTTP中預設的多工器,是ServeMux的實例。多工器要根據URL的請求導向到不同的伺服器。DefaultServeMux是
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News