[Go]接收請求

閱讀時間約 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
8會員
123內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
小黑與程式的邂逅 的其他內容
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(
你可能也想看
Google News 追蹤
2024年底,回顧了過去兩年。 那天在山上跟竹說:不知道為什麼,我覺得這兩年對我來說是生命的一格刻度。 2023、2024這兩年發生了很多事,大三大四對很多人來說都是轉變的時間點,我也不例外。和小時候比起來,更多陌生未知的痛苦,但也有更多不可計量的快樂體驗。擁有更多更多的朋友,卻比過去知道如何與
Google與Anthropic合作,將Claude模型應用於Gemini AI,以提升其性能和安全性,這一行為引發了業界對商業倫理、競爭公平性及知識產權的激烈討論。未來,如何平衡創新與監管將是行業發展的重要議題。
跟著意志與心之所向行事,向來都是困難的。會考慮太多世俗的眼光,旁人的意見,所以保持安靜是必要的。不需要向其他人解釋與說明,自己想要達成的事,只需要自己努力便是。安靜地看著,用著力氣做著自己的事就好。有許多事,不需要明白地說明,因為能懂的只有自己。工作,家人,情人,都好。彷彿只有自己的時候,才能想透徹
Thumbnail
探索由小芝風花主演的感人日劇《GO HOME 警視廳身份不明者諮詢室》,溫情推理揭開死者身份之謎,每集都是一次觸動人心的旅程。
Thumbnail
Go Jira社群即將在新竹舉辦實體日活動,邀請所有對Jira工具有興趣的朋友們參加。活動將包括輕鬆茶話會、Jira使用者交流和新竹小夥伴見面。想參加或想了解更多Jira相關內容的朋友們歡迎點擊報名連結提供意見。
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
一、什麼是Web Service?   簡單說就是「服務」的概念,人與人間、電腦與電腦間都是一樣的,一個是人與人的一來一回交流,媒介是語言中文,另一個則是個人電腦與伺服器的交流,媒介是HTTP/Internet,那麼有了媒介,就會有共同格式才能做
xhr 在下面的例子裡,我們首先建立了一個 XMLHttpRequest 物件,並使用 .open() 開啟一個 URL,最後使用 .send() 發出 request。 具體來說步驟有四個: 建立XMLHttpReque 開啟一個請求。 送出請求。 拿到回應後去處理畫面要如何呈現。
2024年底,回顧了過去兩年。 那天在山上跟竹說:不知道為什麼,我覺得這兩年對我來說是生命的一格刻度。 2023、2024這兩年發生了很多事,大三大四對很多人來說都是轉變的時間點,我也不例外。和小時候比起來,更多陌生未知的痛苦,但也有更多不可計量的快樂體驗。擁有更多更多的朋友,卻比過去知道如何與
Google與Anthropic合作,將Claude模型應用於Gemini AI,以提升其性能和安全性,這一行為引發了業界對商業倫理、競爭公平性及知識產權的激烈討論。未來,如何平衡創新與監管將是行業發展的重要議題。
跟著意志與心之所向行事,向來都是困難的。會考慮太多世俗的眼光,旁人的意見,所以保持安靜是必要的。不需要向其他人解釋與說明,自己想要達成的事,只需要自己努力便是。安靜地看著,用著力氣做著自己的事就好。有許多事,不需要明白地說明,因為能懂的只有自己。工作,家人,情人,都好。彷彿只有自己的時候,才能想透徹
Thumbnail
探索由小芝風花主演的感人日劇《GO HOME 警視廳身份不明者諮詢室》,溫情推理揭開死者身份之謎,每集都是一次觸動人心的旅程。
Thumbnail
Go Jira社群即將在新竹舉辦實體日活動,邀請所有對Jira工具有興趣的朋友們參加。活動將包括輕鬆茶話會、Jira使用者交流和新竹小夥伴見面。想參加或想了解更多Jira相關內容的朋友們歡迎點擊報名連結提供意見。
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
一、什麼是Web Service?   簡單說就是「服務」的概念,人與人間、電腦與電腦間都是一樣的,一個是人與人的一來一回交流,媒介是語言中文,另一個則是個人電腦與伺服器的交流,媒介是HTTP/Internet,那麼有了媒介,就會有共同格式才能做
xhr 在下面的例子裡,我們首先建立了一個 XMLHttpRequest 物件,並使用 .open() 開啟一個 URL,最後使用 .send() 發出 request。 具體來說步驟有四個: 建立XMLHttpReque 開啟一個請求。 送出請求。 拿到回應後去處理畫面要如何呈現。