[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)
}
}




8會員
123內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
發表第一個留言支持創作者!
小黑與程式的邂逅 的其他內容
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 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
可免費獲得虛擬貨幣的錢包APP 馬上下載「GO!WALLET」吧! 趁現在利用下列號碼註冊APP,就可300點數喔
Thumbnail
Go out less during the pandemic avoidance time frame! Get ready nourishment for hide kids + train to go to the restroom at home   Grasp 1 rule to succ
一天傍晚和老婆散步經過一家雙語幼兒園,正巧是放學時間,父母們趕忙到園區接兒女回家。此時,聽到園區傳來廣播內容: “Go home, Ivy!” 一位老師透過廣播通知小朋友,意思對應到中文應該是:「爸媽來接你了,回家囉!」我和太太互看一眼後,不但笑了,也覺得很「三條缐」。
Thumbnail
當一顆種子天天被陽光露水,折磨在潮濕悶熱的土壤裡時,你我不會感到惋惜,因為曉得這是刺激生命更燦爛的關鍵,但倘若你我就是那顆種子,就是正被困住、被壓迫在毫無自由的階段裡,還能相信自己的未來很燦爛嗎? 圖片摘自臉書「家政夫的悄悄話」。 最近因著寒假的緣故,家政夫有機會坐在書桌前,一邊調整三条老師的錄音內
Thumbnail
我的旅行規劃方式是訂好機票跟住宿,列出想去的景點依據交通去安排路線,只要先建構出相關地理位置概念就可以了
Thumbnail
一直以來不敢踏入吃素的行列,雖然知道吃素對世界好處多多,但總覺得身體會處在長期慢性缺乏蛋白質的狀態。但事實上,我才執行兩週,好處之明顯,讓我非常興奮,不得不打在這裡跟大家分享。
Thumbnail
完整標題:go on 與「繼往走向」或「繼往開來」及「繼」、「續」、「繼續」、「接續」、「启開」、「正昂」、「發生」等的轉換密碼
Thumbnail
完整標題:go 與「之」、「至」、「至于」、「到」、「到于」、「前往」、「進往」、「步往」、「走」、「走于」、「走往」、「行」、「行于」、「行往」、「行走」、「去」、「過」、「過去」、「過于」、「步」、「步于」、「步往」、「步行」、「機遇」、「行旺」等的轉換密碼
Thumbnail
完整標題:go around 與「逛」、「觀覽」、「交往」、「相處」、「走訪」、「轉繞圓動」等的轉換密碼及「天狼星」之謎
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
可免費獲得虛擬貨幣的錢包APP 馬上下載「GO!WALLET」吧! 趁現在利用下列號碼註冊APP,就可300點數喔
Thumbnail
Go out less during the pandemic avoidance time frame! Get ready nourishment for hide kids + train to go to the restroom at home   Grasp 1 rule to succ
一天傍晚和老婆散步經過一家雙語幼兒園,正巧是放學時間,父母們趕忙到園區接兒女回家。此時,聽到園區傳來廣播內容: “Go home, Ivy!” 一位老師透過廣播通知小朋友,意思對應到中文應該是:「爸媽來接你了,回家囉!」我和太太互看一眼後,不但笑了,也覺得很「三條缐」。
Thumbnail
當一顆種子天天被陽光露水,折磨在潮濕悶熱的土壤裡時,你我不會感到惋惜,因為曉得這是刺激生命更燦爛的關鍵,但倘若你我就是那顆種子,就是正被困住、被壓迫在毫無自由的階段裡,還能相信自己的未來很燦爛嗎? 圖片摘自臉書「家政夫的悄悄話」。 最近因著寒假的緣故,家政夫有機會坐在書桌前,一邊調整三条老師的錄音內
Thumbnail
我的旅行規劃方式是訂好機票跟住宿,列出想去的景點依據交通去安排路線,只要先建構出相關地理位置概念就可以了
Thumbnail
一直以來不敢踏入吃素的行列,雖然知道吃素對世界好處多多,但總覺得身體會處在長期慢性缺乏蛋白質的狀態。但事實上,我才執行兩週,好處之明顯,讓我非常興奮,不得不打在這裡跟大家分享。
Thumbnail
完整標題:go on 與「繼往走向」或「繼往開來」及「繼」、「續」、「繼續」、「接續」、「启開」、「正昂」、「發生」等的轉換密碼
Thumbnail
完整標題:go 與「之」、「至」、「至于」、「到」、「到于」、「前往」、「進往」、「步往」、「走」、「走于」、「走往」、「行」、「行于」、「行往」、「行走」、「去」、「過」、「過去」、「過于」、「步」、「步于」、「步往」、「步行」、「機遇」、「行旺」等的轉換密碼
Thumbnail
完整標題:go around 與「逛」、「觀覽」、「交往」、「相處」、「走訪」、「轉繞圓動」等的轉換密碼及「天狼星」之謎