iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
Modern Web

就是個Go,我也可以啦!GOGO系列 第 21

2023鐵人賽Day 21 Go X Http

  • 分享至 

  • xImage
  •  

第一個go Web server

我們先來看一段最基本的web server

package main

import (
	"fmt"
	"net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "Hello World")
}

func main() {
	server := &http.Server{
		Addr: "0.0.0.0:80",
	}
	http.HandleFunc("/", hello)
	server.ListenAndServe()
}

接下來只要下以下的指令就可以看到 hello world

go run main.go

http套件

  • 提供http客戶端和伺服器端的實現
  • 可以執行http/https請求
  • 要注意的地方:呼叫者必須要在使用完畢後關閉response body
	resp, err := http.Get("http://example.com/")
	if err != nil {
		// handle error
	}
	defer resp.Body.Close()
	body, err := io.ReadAll(resp.Body)
	// ...

來看伺服器端

server := &Server{
    Addr: ":8080",
    // 其他設置...
}

http.HandleFunc("/", hello)

err := server.ListenAndServe()
if err != nil {
    // 處理錯誤
}
  • 簡單的伺服器端必備的元素
    • 註冊route: 需要使用 HandleFunc()來註冊
      • http.HandleFunc("/", hello)
    • 透過 ListenAndServe()函數開啟對client端的監聽
  • 創建伺服器端
    • server.go裡,go提供了以下的function
    • func (srv *Server) ListenAndServe() error{}
      • 在呼叫ListenAndServe()時必須是在一個Server的物件上
      • 當呼叫server.ListenAndServe()時他會監聽在":8080",也就代表srv.Addr為":8080"
    • ListenAndServe 總是返回一個非nil的錯誤
      • 通常一個函式會返回錯誤,nil代表沒有發生錯誤
      • 然而ListenAndServe一定會返回一個錯誤,即使在正常的狀況,並且永遠不會返回nil
      • shutdown或是close之後返回的錯誤是ErrServerClosed
  • 創建https
    • func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error{}
    • ListenAndServeTLS 與 ListenAndServe 功能上相同,但有以下差異和特點:
      • 預期會接收的是使用HTTPS的連接
      • 需要伺服器的證書和私鑰
        • 必須提供一個包含伺服器證書的文件和一個相匹配的私鑰文件,這些文件是建立安全連線必須的
      • 如果srv.Addr沒有指定,那預設為使用443port

來看用戶端

  • 客戶端是請求伺服器端的資源或服務的程序
  • 在go語言中Client為一個結構,用於發送HTTP請求到伺服器
type Client struct {
	Transport     RoundTripper
	CheckRedirect func(req *Request, via []*Request) error
	Jar           CookieJar
	Timeout       time.Duration
}

var DefaultClient = &Client{}

  • 應該怎麼使用
    • Client是一個為httppackage的結構
      • 先import http , import "net/http"
      • 使用 client := &http.Client{}
  • 替換預設值選項
    • Transport: 當你需要一個發動車子時,你就需要一個引擎來幫忙,在http世界裡.當你要發送一個request,或者接收資料,你就需要Transport這個引擎,然而預設的引擎是使用 Transport: http.DefaultTransport
    • CheckRedirect: 當使用http.Client進行HTTP請求時,如果收到response為重新導向(3XX),那CheckRedirect 會被呼叫,可以把它想成一個callback
      • 預設安全機制,用於防止所謂的 "重定向迴圈",遇到 10 次連續的重導向後停止重導向
    • Jar:是一個 CookieJar的類型,當response回應包含cookies時,這些cookie會被保存在CookieJar,以下為使用方式
      • 創建一個新的 CookieJar:jar, _ := cookiejar.New(nil)
      • 使用在http.Client: client := &http.Client{Jar: jar,}
    • Timeout: 設定 HTTP 請求的超時時間,包括連接、重定向和讀取響應體的時間。以下為使用方式
      • client := &http.Client{ Timeout: 5 * time.Second, // 設定 5 秒的超時}
  • 該怎麼創建簡單的客戶端
    • 建立Client結構:var DefaultClient = &Client{}
var DefaultClient = &Client{}

func Get(url string) (resp *response, err error){
  return DefaultClient.Ger(url)
}

或者用NewRequest的方式可以帶入更細節的request

func (c *Client) Get(url string) (resp *Response, err error){
  req, err := NewRequest("GET", url, nil)
  if err != nil {
    return nil, err
  }
  return c.Do(req)
}

上一篇
2023鐵人賽Day 20 Go語言解鎖:實踐並發編程的策略與技巧
下一篇
2023鐵人賽Day 22 Go X html template
系列文
就是個Go,我也可以啦!GOGO30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言