我們先來看一段最基本的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
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 {
// 處理錯誤
}
HandleFunc()
來註冊
http.HandleFunc("/", hello)
ListenAndServe()
函數開啟對client
端的監聽server.go
裡,go提供了以下的functionfunc (srv *Server) ListenAndServe() error{}
Server
的物件上server.ListenAndServe()
時他會監聽在":8080",也就代表srv.Addr
為":8080"ListenAndServe
總是返回一個非nil的錯誤
ListenAndServe
一定會返回一個錯誤,即使在正常的狀況,並且永遠不會返回nil
shutdown
或是close
之後返回的錯誤是ErrServerClosed
func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error{}
srv.Addr
沒有指定,那預設為使用443
portClient
為一個結構,用於發送HTTP請求到伺服器type Client struct {
Transport RoundTripper
CheckRedirect func(req *Request, via []*Request) error
Jar CookieJar
Timeout time.Duration
}
var DefaultClient = &Client{}
Client
是一個為http
package的結構
import "net/http"
client := &http.Client{}
Transport
這個引擎,然而預設的引擎是使用 Transport: http.DefaultTransport
http.Client
進行HTTP請求時,如果收到response
為重新導向(3XX),那CheckRedirect
會被呼叫,可以把它想成一個callback
CookieJar
的類型,當response回應包含cookies時,這些cookie會被保存在CookieJar
,以下為使用方式
jar, _ := cookiejar.New(nil)
http.Client
: client := &http.Client{Jar: jar,}
client := &http.Client{ Timeout: 5 * time.Second, // 設定 5 秒的超時}
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)
}