import "net/http" html
http包提供了HTTP客戶端和服務端的實現。 程序員
Get、Head、Post和PostForm函數發出HTTP/ HTTPS請求。 web
resp, err := http.Get("http://example.com/") ... resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf) ... resp, err := http.PostForm("http://example.com/form", url.Values{"key": {"Value"}, "id": {"123"}})
程序在使用完回覆後必須關閉回覆的主體。 算法
resp, err := http.Get("http://example.com/") if err != nil { // handle error } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) // ...
要管理HTTP客戶端的頭域、重定向策略和其餘設置,建立一個Client: 緩存
client := &http.Client{ CheckRedirect: redirectPolicyFunc, } resp, err := client.Get("http://example.com") // ... req, err := http.NewRequest("GET", "http://example.com", nil) // ... req.Header.Add("If-None-Match", `W/"wyzzy"`) resp, err := client.Do(req) // ...
要管理代理、TLS配置、keep-alive、壓縮和其餘設置,建立一個Transport: 安全
tr := &http.Transport{ TLSClientConfig: &tls.Config{RootCAs: pool}, DisableCompression: true, } client := &http.Client{Transport: tr} resp, err := client.Get("https://example.com")
Client和Transport類型均可以安全的被多個go程同時使用。出於效率考慮,應該一次創建、儘可能重用。 服務器
ListenAndServe使用指定的監聽地址和處理器啓動一個HTTP服務端。處理器參數一般是nil,這表示採用包變量DefaultServeMux做爲處理器。Handle和HandleFunc函數能夠向DefaultServeMux添加處理器。 cookie
http.Handle("/foo", fooHandler) http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) }) log.Fatal(http.ListenAndServe(":8080", nil))
要管理服務端的行爲,能夠建立一個自定義的Server: 網絡
s := &http.Server{ Addr: ":8080", Handler: myHandler, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, MaxHeaderBytes: 1 << 20, } log.Fatal(s.ListenAndServe())
const ( StatusContinue = 100 StatusSwitchingProtocols = 101 StatusOK = 200 StatusCreated = 201 StatusAccepted = 202 StatusNonAuthoritativeInfo = 203 StatusNoContent = 204 StatusResetContent = 205 StatusPartialContent = 206 StatusMultipleChoices = 300 StatusMovedPermanently = 301 StatusFound = 302 StatusSeeOther = 303 StatusNotModified = 304 StatusUseProxy = 305 StatusTemporaryRedirect = 307 StatusBadRequest = 400 StatusUnauthorized = 401 StatusPaymentRequired = 402 StatusForbidden = 403 StatusNotFound = 404 StatusMethodNotAllowed = 405 StatusNotAcceptable = 406 StatusProxyAuthRequired = 407 StatusRequestTimeout = 408 StatusConflict = 409 StatusGone = 410 StatusLengthRequired = 411 StatusPreconditionFailed = 412 StatusRequestEntityTooLarge = 413 StatusRequestURITooLong = 414 StatusUnsupportedMediaType = 415 StatusRequestedRangeNotSatisfiable = 416 StatusExpectationFailed = 417 StatusTeapot = 418 StatusInternalServerError = 500 StatusNotImplemented = 501 StatusBadGateway = 502 StatusServiceUnavailable = 503 StatusGatewayTimeout = 504 StatusHTTPVersionNotSupported = 505 )
HTTP狀態碼,參見RFC 2616 多線程
const DefaultMaxHeaderBytes = 1 << 20 // 1 MB
DefaultMaxHeaderBytes是HTTP請求的頭域最大容許長度。能夠經過設置Server.MaxHeaderBytes字段來覆蓋。
const DefaultMaxIdleConnsPerHost = 2
DefaultMaxIdleConnsPerHost是Transport的MaxIdleConnsPerHost的默認值。
const TimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT"
TimeFormat是當解析或生產HTTP頭域中的時間時,用與time.Parse或time.Format函數的時間格式。這種格式相似time.RFC1123但強制採用GMT時區。
var ( ErrHeaderTooLong = &ProtocolError{"header too long"} ErrShortBody = &ProtocolError{"entity body too short"} ErrNotSupported = &ProtocolError{"feature not supported"} ErrUnexpectedTrailer = &ProtocolError{"trailer header without chunked transfer encoding"} ErrMissingContentLength = &ProtocolError{"missing ContentLength in HEAD response"} ErrNotMultipart = &ProtocolError{"request Content-Type isn't multipart/form-data"} ErrMissingBoundary = &ProtocolError{"no multipart boundary param in Content-Type"} )
HTTP請求的解析錯誤。
var ( ErrWriteAfterFlush = errors.New("Conn.Write called after Flush") ErrBodyNotAllowed = errors.New("http: request method or response status code does not allow body") ErrHijacked = errors.New("Conn has been hijacked") ErrContentLength = errors.New("Conn.Write wrote more than the declared Content-Length") )
會被HTTP服務端返回的錯誤。
var DefaultClient = &Client{}
DefaultClient是用於包函數Get、Head和Post的默認Client。
var DefaultServeMux = NewServeMux()
DefaultServeMux是用於Serve的默認ServeMux。
var ErrBodyReadAfterClose = errors.New("http: invalid Read on closed Body")
在Resquest或Response的Body字段已經關閉後,試圖從中讀取時,就會返回ErrBodyReadAfterClose。這個錯誤通常發生在:HTTP處理器中調用完ResponseWriter 接口的WriteHeader或Write後從請求中讀取數據的時候。
var ErrHandlerTimeout = errors.New("http: Handler timeout")
在處理器超時之後調用ResponseWriter接口的Write方法,就會返回ErrHandlerTimeout。
var ErrLineTooLong = errors.New("header line too long")
var ErrMissingFile = errors.New("http: no such file")
當請求中沒有提供給FormFile函數的文件字段名,或者該字段名不是文件字段時,該函數就會返回ErrMissingFile。
var ErrNoCookie = errors.New("http: named cookie not present")
var ErrNoLocation = errors.New("http: no Location header in response")
type ProtocolError struct { ErrorString string }
HTTP請求解析錯誤。
func (err *ProtocolError) Error() string
func CanonicalHeaderKey(s string) string
CanonicalHeaderKey函數返回頭域(表示爲Header類型)的鍵s的規範化格式。規範化過程當中讓單詞首字母和'-'後的第一個字母大寫,其他字母小寫。例如,"accept-encoding"規範化爲"Accept-Encoding"。
func DetectContentType(data []byte) string
DetectContentType函數實現了http://mimesniff.spec.whatwg.org/描述的算法,用於肯定數據的Content-Type。函數老是返回一個合法的MIME類型;若是它不能肯定數據的類型,將返回"application/octet-stream"。它最多檢查數據的前512字節。
func ParseHTTPVersion(vers string) (major, minor int, ok bool)
ParseHTTPVersion解析HTTP版本字符串。如"HTTP/1.0"返回(1, 0, true)。
func ParseTime(text string) (t time.Time, err error)
ParseTime用3種格式TimeFormat, time.RFC850和time.ANSIC嘗試解析一個時間頭的值(如Date: header)。
func StatusText(code int) string
StatusText返回HTTP狀態碼code對應的文本,如220對應"OK"。若是code是未知的狀態碼,會返回""。
type ConnState int
ConnState表明一個客戶端到服務端的鏈接的狀態。本類型用於可選的Server.ConnState回調函數。
const ( // StateNew表明一個新的鏈接,將要馬上發送請求。 // 鏈接從這個狀態開始,而後轉變爲StateAlive或StateClosed。 StateNew ConnState = iota // StateActive表明一個已經讀取了請求數據1到多個字節的鏈接。 // 用於StateAlive的Server.ConnState回調函數在將鏈接交付給處理器以前被觸發, // 等到請求被處理完後,Server.ConnState回調函數再次被觸發。 // 在請求被處理後,鏈接狀態改變爲StateClosed、StateHijacked或StateIdle。 StateActive // StateIdle表明一個已經處理完了請求、處在閒置狀態、等待新請求的鏈接。 // 鏈接狀態能夠從StateIdle改變爲StateActive或StateClosed。 StateIdle // 表明一個被劫持的鏈接。這是一個終止狀態,不會轉變爲StateClosed。 StateHijacked // StateClosed表明一個關閉的鏈接。 // 這是一個終止狀態。被劫持的鏈接不會轉變爲StateClosed。 StateClosed )
func (c ConnState) String() string
type Header map[string][]string
Header表明HTTP頭域的鍵值對。
func (h Header) Get(key string) string
Get返回鍵對應的第一個值,若是鍵不存在會返回""。如要獲取該鍵對應的值切片,請直接用規範格式的鍵訪問map。
func (h Header) Set(key, value string)
Set添加鍵值對到h,如鍵已存在則會用只有新值一個元素的切片取代舊值切片。
func (h Header) Add(key, value string)
Add添加鍵值對到h,如鍵已存在則會將新的值附加到舊值切片後面。
func (h Header) Del(key string)
Del刪除鍵值對。
func (h Header) Write(w io.Writer) error
Write以有線格式將頭域寫入w。
func (h Header) WriteSubset(w io.Writer, exclude map[string]bool) error
WriteSubset以有線格式將頭域寫入w。當exclude不爲nil時,若是h的鍵值對的鍵在exclude中存在且其對應值爲真,該鍵值對就不會被寫入w。
type Cookie struct { Name string Value string Path string Domain string Expires time.Time RawExpires string // MaxAge=0表示未設置Max-Age屬性 // MaxAge<0表示馬上刪除該cookie,等價於"Max-Age: 0" // MaxAge>0表示存在Max-Age屬性,單位是秒 MaxAge int Secure bool HttpOnly bool Raw string Unparsed []string // 未解析的「屬性-值」對的原始文本 }
Cookie表明一個出如今HTTP回覆的頭域中Set-Cookie頭的值裏或者HTTP請求的頭域中Cookie頭的值裏的HTTP cookie。
func (c *Cookie) String() string
String返回該cookie的序列化結果。若是隻設置了Name和Value字段,序列化結果可用於HTTP請求的Cookie頭或者HTTP回覆的Set-Cookie頭;若是設置了其餘字段,序列化結果只能用於HTTP回覆的Set-Cookie頭。
type CookieJar interface { // SetCookies管理從u的回覆中收到的cookie // 根據其策略和實現,它能夠選擇是否存儲cookie SetCookies(u *url.URL, cookies []*Cookie) // Cookies返回發送請求到u時應使用的cookie // 本方法有責任遵照RFC 6265規定的標準cookie限制 Cookies(u *url.URL) []*Cookie }
CookieJar管理cookie的存儲和在HTTP請求中的使用。CookieJar的實現必須能安全的被多個go程同時使用。
net/http/cookiejar包提供了一個CookieJar的實現。
type Request struct { // Method指定HTTP方法(GET、POST、PUT等)。對客戶端,""表明GET。 Method string // URL在服務端表示被請求的URI,在客戶端表示要訪問的URL。 // // 在服務端,URL字段是解析請求行的URI(保存在RequestURI字段)獲得的, // 對大多數請求來講,除了Path和RawQuery以外的字段都是空字符串。 // (參見RFC 2616, Section 5.1.2) // // 在客戶端,URL的Host字段指定了要鏈接的服務器, // 而Request的Host字段(可選地)指定要發送的HTTP請求的Host頭的值。 URL *url.URL // 接收到的請求的協議版本。本包生產的Request老是使用HTTP/1.1 Proto string // "HTTP/1.0" ProtoMajor int // 1 ProtoMinor int // 0 // Header字段用來表示HTTP請求的頭域。若是頭域(多行鍵值對格式)爲: // accept-encoding: gzip, deflate // Accept-Language: en-us // Connection: keep-alive // 則: // Header = map[string][]string{ // "Accept-Encoding": {"gzip, deflate"}, // "Accept-Language": {"en-us"}, // "Connection": {"keep-alive"}, // } // HTTP規定頭域的鍵名(頭名)是大小寫敏感的,請求的解析器經過規範化頭域的鍵名來實現這點。 // 在客戶端的請求,可能會被自動添加或重寫Header中的特定的頭,參見Request.Write方法。 Header Header // Body是請求的主體。 // // 在客戶端,若是Body是nil表示該請求沒有主體買入GET請求。 // Client的Transport字段會負責調用Body的Close方法。 // // 在服務端,Body字段老是非nil的;但在沒有主體時,讀取Body會馬上返回EOF。 // Server會關閉請求的主體,ServeHTTP處理器不須要關閉Body字段。 Body io.ReadCloser // ContentLength記錄相關內容的長度。 // 若是爲-1,表示長度未知,若是>=0,表示能夠從Body字段讀取ContentLength字節數據。 // 在客戶端,若是Body非nil而該字段爲0,表示不知道Body的長度。 ContentLength int64 // TransferEncoding按從最外到最裏的順序列出傳輸編碼,空切片表示"identity"編碼。 // 本字段通常會被忽略。當發送或接受請求時,會自動添加或移除"chunked"傳輸編碼。 TransferEncoding []string // Close在服務端指定是否在回覆請求後關閉鏈接,在客戶端指定是否在發送請求後關閉鏈接。 Close bool // 在服務端,Host指定URL會在其上尋找資源的主機。 // 根據RFC 2616,該值能夠是Host頭的值,或者URL自身提供的主機名。 // Host的格式能夠是"host:port"。 // // 在客戶端,請求的Host字段(可選地)用來重寫請求的Host頭。 // 如過該字段爲"",Request.Write方法會使用URL字段的Host。 Host string // Form是解析好的表單數據,包括URL字段的query參數和POST或PUT的表單數據。 // 本字段只有在調用ParseForm後纔有效。在客戶端,會忽略請求中的本字段而使用Body替代。 Form url.Values // PostForm是解析好的POST或PUT的表單數據。 // 本字段只有在調用ParseForm後纔有效。在客戶端,會忽略請求中的本字段而使用Body替代。 PostForm url.Values // MultipartForm是解析好的多部件表單,包括上傳的文件。 // 本字段只有在調用ParseMultipartForm後纔有效。 // 在客戶端,會忽略請求中的本字段而使用Body替代。 MultipartForm *multipart.Form // Trailer指定了會在請求主體以後發送的額外的頭域。 // // 在服務端,Trailer字段必須初始化爲只有trailer鍵,全部鍵都對應nil值。 // (客戶端會聲明哪些trailer會發送) // 在處理器從Body讀取時,不能使用本字段。 // 在從Body的讀取返回EOF後,Trailer字段會被更新完畢幷包含非nil的值。 // (若是客戶端發送了這些鍵值對),此時才能夠訪問本字段。 // // 在客戶端,Trail必須初始化爲一個包含將要發送的鍵值對的映射。(值能夠是nil或其終值) // ContentLength字段必須是0或-1,以啓用"chunked"傳輸編碼發送請求。 // 在開始發送請求後,Trailer能夠在讀取請求主體期間被修改, // 一旦請求主體返回EOF,調用者就不可再修改Trailer。 // // 不多有HTTP客戶端、服務端或代理支持HTTP trailer。 Trailer Header // RemoteAddr容許HTTP服務器和其餘軟件記錄該請求的來源地址,通常用於日誌。 // 本字段不是ReadRequest函數填寫的,也沒有定義格式。 // 本包的HTTP服務器會在調用處理器以前設置RemoteAddr爲"IP:port"格式的地址。 // 客戶端會忽略請求中的RemoteAddr字段。 RemoteAddr string // RequestURI是被客戶端發送到服務端的請求的請求行中未修改的請求URI // (參見RFC 2616, Section 5.1) // 通常應使用URI字段,在客戶端設置請求的本字段會致使錯誤。 RequestURI string // TLS字段容許HTTP服務器和其餘軟件記錄接收到該請求的TLS鏈接的信息 // 本字段不是ReadRequest函數填寫的。 // 對啓用了TLS的鏈接,本包的HTTP服務器會在調用處理器以前設置TLS字段,不然將設TLS爲nil。 // 客戶端會忽略請求中的TLS字段。 TLS *tls.ConnectionState }
Request類型表明一個服務端接受到的或者客戶端發送出去的HTTP請求。
Request各字段的意義和用途在服務端和客戶端是不一樣的。除了字段自己上方文檔,還可參見Request.Write方法和RoundTripper接口的文檔。
func NewRequest(method, urlStr string, body io.Reader) (*Request, error)
NewRequest使用指定的方法、網址和可選的主題建立並返回一個新的*Request。
若是body參數實現了io.Closer接口,Request返回值的Body 字段會被設置爲body,並會被Client類型的Do、Post和PostFOrm方法以及Transport.RoundTrip方法關閉。
func ReadRequest(b *bufio.Reader) (req *Request, err error)
ReadRequest從b讀取並解析出一個HTTP請求。(本函數主要用在服務端從下層獲取請求)
func (r *Request) ProtoAtLeast(major, minor int) bool
ProtoAtLeast報告該請求使用的HTTP協議版本至少是major.minor。
func (r *Request) UserAgent() string
UserAgent返回請求中的客戶端用戶代理信息(請求的User-Agent頭)。
func (r *Request) Referer() string
Referer返回請求中的訪問來路信息。(請求的Referer頭)
Referer在請求中就是拼錯了的,這是HTTP早期就有的錯誤。該值也能夠從用Header["Referer"]獲取; 讓獲取Referer字段變成方法的好處是,編譯器能夠診斷使用正確單詞拼法的req.Referrer()的程序,但卻不能診斷使用Header["Referrer"]的程序。
func (r *Request) AddCookie(c *Cookie)
AddCookie向請求中添加一個cookie。按照RFC 6265 section 5.4的跪地,AddCookie不會添加超過一個Cookie頭字段。這表示全部的cookie都寫在同一行,用分號分隔(cookie內部用逗號分隔屬性)。
func (r *Request) SetBasicAuth(username, password string)
SetBasicAuth使用提供的用戶名和密碼,採用HTTP基本認證,設置請求的Authorization頭。HTTP基本認證會明碼傳送用戶名和密碼。
func (r *Request) Write(w io.Writer) error
Write方法以有線格式將HTTP/1.1請求寫入w(用於將請求寫入下層TCPConn等)。本方法會考慮請求的以下字段:
Host URL Method (defaults to "GET") Header ContentLength TransferEncoding Body
若是存在Body,ContentLength字段<= 0且TransferEncoding字段未顯式設置爲["identity"],Write方法會顯式添加"Transfer-Encoding: chunked"到請求的頭域。Body字段會在發送完請求後關閉。
func (r *Request) WriteProxy(w io.Writer) error
WriteProxy相似Write但會將請求以HTTP代理指望的格式發送。
尤爲是,按照RFC 2616 Section 5.1.2,WriteProxy會使用絕對URI(包括協議和主機名)來初始化請求的第1行(Request-URI行)。不管何種狀況,WriteProxy都會使用r.Host或r.URL.Host設置Host頭。
func (r *Request) Cookies() []*Cookie
Cookies解析並返回該請求的Cookie頭設置的cookie。
func (r *Request) Cookie(name string) (*Cookie, error)
Cookie返回請求中名爲name的cookie,若是未找到該cookie會返回nil, ErrNoCookie。
func (r *Request) ParseForm() error
ParseForm解析URL中的查詢字符串,並將解析結果更新到r.Form字段。
對於POST或PUT請求,ParseForm還會將body看成表單解析,並將結果既更新到r.PostForm也更新到r.Form。解析結果中,POST或PUT請求主體要優先於URL查詢字符串(同名變量,主體的值在查詢字符串的值前面)。
若是請求的主體的大小沒有被MaxBytesReader函數設定限制,其大小默認限制爲開頭10MB。
ParseMultipartForm會自動調用ParseForm。重複調用本方法是無心義的。
func (r *Request) ParseMultipartForm(maxMemory int64) error
ParseMultipartForm將請求的主體做爲multipart/form-data解析。請求的整個主體都會被解析,獲得的文件記錄最多maxMemery字節保存在內存,其他部分保存在硬盤的temp文件裏。若是必要,ParseMultipartForm會自行調用ParseForm。重複調用本方法是無心義的。
func (r *Request) FormValue(key string) string
FormValue返回key爲鍵查詢r.Form字段獲得結果[]string切片的第一個值。POST和PUT主體中的同名參數優先於URL查詢字符串。若是必要,本函數會隱式調用ParseMultipartForm和ParseForm。
func (r *Request) PostFormValue(key string) string
PostFormValue返回key爲鍵查詢r.PostForm字段獲得結果[]string切片的第一個值。若是必要,本函數會隱式調用ParseMultipartForm和ParseForm。
func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error)
FormFile返回以key爲鍵查詢r.MultipartForm字段獲得結果中的第一個文件和它的信息。若是必要,本函數會隱式調用ParseMultipartForm和ParseForm。查詢失敗會返回ErrMissingFile錯誤。
func (r *Request) MultipartReader() (*multipart.Reader, error)
若是請求是multipart/form-data POST請求,MultipartReader返回一個multipart.Reader接口,不然返回nil和一個錯誤。使用本函數代替ParseMultipartForm,能夠將r.Body做爲流處理。
type Response struct { Status string // 例如"200 OK" StatusCode int // 例如200 Proto string // 例如"HTTP/1.0" ProtoMajor int // 例如1 ProtoMinor int // 例如0 // Header保管頭域的鍵值對。 // 若是回覆中有多個頭的鍵相同,Header中保存爲該鍵對應用逗號分隔串聯起來的這些頭的值 // (參見RFC 2616 Section 4.2) // 被本結構體中的其餘字段複製保管的頭(如ContentLength)會從Header中刪掉。 // // Header中的鍵都是規範化的,參見CanonicalHeaderKey函數 Header Header // Body表明回覆的主體。 // Client類型和Transport類型會保證Body字段老是非nil的,即便回覆沒有主體或主體長度爲0。 // 關閉主體是調用者的責任。 // 若是服務端採用"chunked"傳輸編碼發送的回覆,Body字段會自動進行解碼。 Body io.ReadCloser // ContentLength記錄相關內容的長度。 // 其值爲-1表示長度未知(採用chunked傳輸編碼) // 除非對應的Request.Method是"HEAD",其值>=0表示能夠從Body讀取的字節數 ContentLength int64 // TransferEncoding按從最外到最裏的順序列出傳輸編碼,空切片表示"identity"編碼。 TransferEncoding []string // Close記錄頭域是否指定應在讀取完主體後關閉鏈接。(即Connection頭) // 該值是給客戶端的建議,Response.Write方法的ReadResponse函數都不會關閉鏈接。 Close bool // Trailer字段保存和頭域相同格式的trailer鍵值對,和Header字段相同類型 Trailer Header // Request是用來獲取此回覆的請求 // Request的Body字段是nil(由於已經被用掉了) // 這個字段是被Client類型發出請求並得到回覆後填充的 Request *Request // TLS包含接收到該回復的TLS鏈接的信息。 對未加密的回覆,本字段爲nil。 // 返回的指針是被(同一TLS鏈接接收到的)回覆共享的,不該被修改。 TLS *tls.ConnectionState }
Response表明一個HTTP請求的回覆。
func ReadResponse(r *bufio.Reader, req *Request) (*Response, error)
ReadResponse從r讀取並返回一個HTTP 回覆。req參數是可選的,指定該回復對應的請求(便是對該請求的回覆)。若是是nil,將假設請求是GET請求。客戶端必須在結束resp.Body的讀取後關閉它。讀取完畢並關閉後,客戶端能夠檢查resp.Trailer字段獲取回覆的trailer的鍵值對。(本函數主要用在客戶端從下層獲取回覆)
func (r *Response) ProtoAtLeast(major, minor int) bool
ProtoAtLeast報告該回復使用的HTTP協議版本至少是major.minor。
func (r *Response) Cookies() []*Cookie
Cookies解析並返回該回復中的Set-Cookie頭設置的cookie。
func (r *Response) Location() (*url.URL, error)
Location返回該回復的Location頭設置的URL。相對地址的重定向會相對於該回復對應的請求來肯定絕對地址。若是回覆中沒有Location頭,會返回nil, ErrNoLocation。
func (r *Response) Write(w io.Writer) error
Write以有線格式將回複寫入w(用於將回複寫入下層TCPConn等)。本方法會考慮以下字段:
StatusCode ProtoMajor ProtoMinor Request.Method TransferEncoding Trailer Body ContentLength Header(不規範的鍵名和它對應的值會致使不可預知的行爲)
Body字段在發送完回覆後會被關閉。
type ResponseWriter interface { // Header返回一個Header類型值,該值會被WriteHeader方法發送。 // 在調用WriteHeader或Write方法後再改變該對象是沒有意義的。 Header() Header // WriteHeader該方法發送HTTP回覆的頭域和狀態碼。 // 若是沒有被顯式調用,第一次調用Write時會觸發隱式調用WriteHeader(http.StatusOK) // WriterHeader的顯式調用主要用於發送錯誤碼。 WriteHeader(int) // Write向鏈接中寫入做爲HTTP的一部分回覆的數據。 // 若是被調用時還未調用WriteHeader,本方法會先調用WriteHeader(http.StatusOK) // 若是Header中沒有"Content-Type"鍵, // 本方法會使用包函數DetectContentType檢查數據的前512字節,將返回值做爲該鍵的值。 Write([]byte) (int, error) }
ResponseWriter接口被HTTP處理器用於構造HTTP回覆。
type Flusher interface { // Flush將緩衝中的全部數據發送到客戶端 Flush() }
HTTP處理器ResponseWriter接口參數的下層若是實現了Flusher接口,可讓HTTP處理器將緩衝中的數據發送到客戶端。
注意:即便ResponseWriter接口的下層支持Flush方法,若是客戶端是經過HTTP代理鏈接的,緩衝中的數據也可能直到回覆完畢才被傳輸到客戶端。
type CloseNotifier interface { // CloseNotify返回一個通道,該通道會在客戶端鏈接丟失時接收到惟一的值 CloseNotify() <-chan bool }
HTTP處理器ResponseWriter接口參數的下層若是實現了CloseNotifier接口,可讓用戶檢測下層的鏈接是否中止。若是客戶端在回覆準備好以前關閉了鏈接,該機制能夠用於取消服務端耗時較長的操做。
type Hijacker interface { // Hijack讓調用者接管鏈接,返回鏈接和關聯到該鏈接的一個緩衝讀寫器。 // 調用本方法後,HTTP服務端將再也不對鏈接進行任何操做, // 調用者有責任管理、關閉返回的鏈接。 Hijack() (net.Conn, *bufio.ReadWriter, error) }
HTTP處理器ResponseWriter接口參數的下層若是實現了Hijacker接口,可讓HTTP處理器接管該鏈接。
type RoundTripper interface { // RoundTrip執行單次HTTP事務,接收併發揮請求req的回覆。 // RoundTrip不該試圖解析/修改獲得的回覆。 // 尤爲要注意,只要RoundTrip得到了一個回覆,無論該回復的HTTP狀態碼如何, // 它必須將返回值err設置爲nil。 // 非nil的返回值err應該留給獲取回覆失敗的狀況。 // 相似的,RoundTrip不能試圖管理高層次的細節,如重定向、認證、cookie。 // // 除了從請求的主體讀取並關閉主體以外,RoundTrip不該修改請求,包括(請求的)錯誤。 // RoundTrip函數接收的請求的URL和Header字段能夠保證是(被)初始化了的。 RoundTrip(*Request) (*Response, error) }
RoundTripper接口是具備執行單次HTTP事務的能力(接收指定請求的回覆)的接口。
RoundTripper接口的類型必須能夠安全的被多線程同時使用。
type Transport struct { // Proxy指定一個對給定請求返回代理的函數。 // 若是該函數返回了非nil的錯誤值,請求的執行就會中斷並返回該錯誤。 // 若是Proxy爲nil或返回nil的*URL置,將不使用代理。 Proxy func(*Request) (*url.URL, error) // Dial指定建立TCP鏈接的撥號函數。若是Dial爲nil,會使用net.Dial。 Dial func(network, addr string) (net.Conn, error) // TLSClientConfig指定用於tls.Client的TLS配置信息。 // 若是該字段爲nil,會使用默認的配置信息。 TLSClientConfig *tls.Config // TLSHandshakeTimeout指定等待TLS握手完成的最長時間。零值表示不設置超時。 TLSHandshakeTimeout time.Duration // 若是DisableKeepAlives爲真,會禁止不一樣HTTP請求之間TCP鏈接的重用。 DisableKeepAlives bool // 若是DisableCompression爲真,會禁止Transport在請求中沒有Accept-Encoding頭時, // 主動添加"Accept-Encoding: gzip"頭,以獲取壓縮數據。 // 若是Transport本身請求gzip並獲得了壓縮後的回覆,它會主動解壓縮回復的主體。 // 但若是用戶顯式的請求gzip壓縮數據,Transport是不會主動解壓縮的。 DisableCompression bool // 若是MaxIdleConnsPerHost!=0,會控制每一個主機下的最大閒置鏈接。 // 若是MaxIdleConnsPerHost==0,會使用DefaultMaxIdleConnsPerHost。 MaxIdleConnsPerHost int // ResponseHeaderTimeout指定在發送完請求(包括其可能的主體)以後, // 等待接收服務端的回覆的頭域的最大時間。零值表示不設置超時。 // 該時間不包括獲取回覆主體的時間。 ResponseHeaderTimeout time.Duration // 內含隱藏或非導出字段 }
Transport類型實現了RoundTripper接口,支持http、https和http/https代理。Transport類型能夠緩存鏈接以在將來重用。
var DefaultTransport RoundTripper = &Transport{ Proxy: ProxyFromEnvironment, Dial: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }).Dial, TLSHandshakeTimeout: 10 * time.Second, }
DefaultTransport是被包變量DefaultClient使用的默認RoundTripper接口。它會根據須要建立網絡鏈接,並緩存以便在以後的請求中重用這些鏈接。它使用環境變量$HTTP_PROXY和$NO_PROXY(或$http_proxy和$no_proxy)指定的HTTP代理。
func (t *Transport) RegisterProtocol(scheme string, rt RoundTripper)
RegisterProtocol註冊一個新的名爲scheme的協議。t會將使用scheme協議的請求轉交給rt。rt有責任模擬HTTP請求的語義。
RegisterProtocol能夠被其餘包用於提供"ftp"或"file"等協議的實現。
func (t *Transport) RoundTrip(req *Request) (resp *Response, err error)
RoundTrip方法實現了RoundTripper接口。
高層次的HTTP客戶端支持(如管理cookie和重定向)請參見Get、Post等函數和Client類型。
func (t *Transport) CloseIdleConnections()
CloseIdleConnections關閉全部以前的請求創建但目前處於閒置狀態的鏈接。本方法不會中斷正在使用的鏈接。
func (t *Transport) CancelRequest(req *Request)
CancelRequest經過關閉請求所在的鏈接取消一個執行中的請求。
type Client struct { // Transport指定執行獨立、單次HTTP請求的機制。 // 若是Transport爲nil,則使用DefaultTransport。 Transport RoundTripper // CheckRedirect指定處理重定向的策略。 // 若是CheckRedirect不爲nil,客戶端會在執行重定向以前調用本函數字段。 // 參數req和via是將要執行的請求和已經執行的請求(切片,越新的請求越靠後)。 // 若是CheckRedirect返回一個錯誤,本類型的Get方法不會發送請求req, // 而是返回以前獲得的最後一個回覆和該錯誤。(包裝進url.Error類型裏) // // 若是CheckRedirect爲nil,會採用默認策略:連續10此請求後中止。 CheckRedirect func(req *Request, via []*Request) error // Jar指定cookie管理器。 // 若是Jar爲nil,請求中不會發送cookie,回覆中的cookie會被忽略。 Jar CookieJar // Timeout指定本類型的值執行請求的時間限制。 // 該超時限制包括鏈接時間、重定向和讀取回復主體的時間。 // 計時器會在Head、Get、Post或Do方法返回後繼續運做並在超時後中斷回覆主體的讀取。 // // Timeout爲零值表示不設置超時。 // // Client實例的Transport字段必須支持CancelRequest方法, // 不然Client會在試圖用Head、Get、Post或Do方法執行請求時返回錯誤。 // 本類型的Transport字段默認值(DefaultTransport)支持CancelRequest方法。 Timeout time.Duration }
Client類型表明HTTP客戶端。它的零值(DefaultClient)是一個可用的使用DefaultTransport的客戶端。
Client的Transport字段通常會含有內部狀態(緩存TCP鏈接),所以Client類型值應儘可能被重用而不是每次須要都建立新的。Client類型值能夠安全的被多個go程同時使用。
Client類型的層次比RoundTripper接口(如Transport)高,還會管理HTTP的cookie和重定向等細節。
func (c *Client) Do(req *Request) (resp *Response, err error)
Do方法發送請求,返回HTTP回覆。它會遵照客戶端c設置的策略(如重定向、cookie、認證)。
若是客戶端的策略(如重定向)返回錯誤或存在HTTP協議錯誤時,本方法將返回該錯誤;若是迴應的狀態碼不是2xx,本方法並不會返回錯誤。
若是返回值err爲nil,resp.Body老是非nil的,調用者應該在讀取完resp.Body後關閉它。若是返回值resp的主體未關閉,c下層的RoundTripper接口(通常爲Transport類型)可能沒法重用resp主體下層保持的TCP鏈接去執行以後的請求。
請求的主體,若是非nil,會在執行後被c.Transport關閉,即便出現錯誤。
通常應使用Get、Post或PostForm方法代替Do方法。
func (c *Client) Head(url string) (resp *Response, err error)
Head向指定的URL發出一個HEAD請求,若是迴應的狀態碼以下,Head會在調用c.CheckRedirect後執行重定向:
301 (Moved Permanently) 302 (Found) 303 (See Other) 307 (Temporary Redirect)
func (c *Client) Get(url string) (resp *Response, err error)
Get向指定的URL發出一個GET請求,若是迴應的狀態碼以下,Get會在調用c.CheckRedirect後執行重定向:
301 (Moved Permanently) 302 (Found) 303 (See Other) 307 (Temporary Redirect)
若是c.CheckRedirect執行失敗或存在HTTP協議錯誤時,本方法將返回該錯誤;若是迴應的狀態碼不是2xx,本方法並不會返回錯誤。若是返回值err爲nil,resp.Body老是非nil的,調用者應該在讀取完resp.Body後關閉它。
func (c *Client) Post(url string, bodyType string, body io.Reader) (resp *Response, err error)
Post向指定的URL發出一個POST請求。bodyType爲POST數據的類型, body爲POST數據,做爲請求的主體。若是參數body實現了io.Closer接口,它會在發送請求後被關閉。調用者有責任在讀取完返回值resp的主體後關閉它。
func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error)
PostForm向指定的URL發出一個POST請求,url.Values類型的data會被編碼爲請求的主體。POST數據的類型通常會設爲"application/x-www-form-urlencoded"。若是返回值err爲nil,resp.Body老是非nil的,調用者應該在讀取完resp.Body後關閉它。
type Handler interface { ServeHTTP(ResponseWriter, *Request) }
實現了Handler接口的對象能夠註冊到HTTP服務端,爲特定的路徑及其子樹提供服務。
ServeHTTP應該將回復的頭域和數據寫入ResponseWriter接口而後返回。返回標誌着該請求已經結束,HTTP服務端能夠轉移向該鏈接上的下一個請求。
func NotFoundHandler() Handler
NotFoundHandler返回一個簡單的請求處理器,該處理器會對每一個請求都回復"404 page not found"。
func RedirectHandler(url string, code int) Handler
RedirectHandler返回一個請求處理器,該處理器會對每一個請求都使用狀態碼code重定向到網址url。
func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler
TimeoutHandler返回一個採用指定時間限制的請求處理器。
返回的Handler會調用h.ServeHTTP去處理每一個請求,但若是某一次調用耗時超過了時間限制,該處理器會回覆請求狀態碼503 Service Unavailable,並將msg做爲回覆的主體(若是msg爲空字符串,將發送一個合理的默認信息)。在超時後,h對它的ResponseWriter接口參數的寫入操做會返回ErrHandlerTimeout。
func StripPrefix(prefix string, h Handler) Handler
StripPrefix返回一個處理器,該處理器會將請求的URL.Path字段中給定前綴prefix去除後再交由h處理。StripPrefix會向URL.Path字段中沒有給定前綴的請求回覆404 page not found。
type HandlerFunc func(ResponseWriter, *Request)
HandlerFunc type是一個適配器,經過類型轉換讓咱們能夠將普通的函數做爲HTTP處理器使用。若是f是一個具備適當簽名的函數,HandlerFunc(f)經過調用f實現了Handler接口。
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request)
ServeHTTP方法會調用f(w, r)
type ServeMux struct { // 內含隱藏或非導出字段 }
ServeMux類型是HTTP請求的多路轉接器。它會將每個接收的請求的URL與一個註冊模式的列表進行匹配,並調用和URL最匹配的模式的處理器。
模式是固定的、由根開始的路徑,如"/favicon.ico",或由根開始的子樹,如"/images/"(注意結尾的斜槓)。較長的模式優先於較短的模式,所以若是模式"/images/"和"/images/thumbnails/"都註冊了處理器,後一個處理器會用於路徑以"/images/thumbnails/"開始的請求,前一個處理器會接收到其他的路徑在"/images/"子樹下的請求。
注意,由於以斜槓結尾的模式表明一個由根開始的子樹,模式"/"會匹配全部的未被其餘註冊的模式匹配的路徑,而不只僅是路徑"/"。
模式也能(可選地)以主機名開始,表示只匹配該主機上的路徑。指定主機的模式優先於通常的模式,所以一個註冊了兩個模式"/codesearch"和"codesearch.google.com/"的處理器不會接管目標爲"http://www.google.com/"的請求。
ServeMux還會注意到請求的URL路徑的無害化,將任何路徑中包含"."或".."元素的請求重定向到等價的沒有這兩種元素的URL。(參見path.Clean函數)
func NewServeMux() *ServeMux
NewServeMux建立並返回一個新的*ServeMux
func (mux *ServeMux) Handle(pattern string, handler Handler)
Handle註冊HTTP處理器handler和對應的模式pattern。若是該模式已經註冊有一個處理器,Handle會panic。
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request))
HandleFunc註冊一個處理器函數handler和對應的模式pattern。
func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string)
Handler根據r.Method、r.Host和r.URL.Path等數據,返回將用於處理該請求的HTTP處理器。它老是返回一個非nil的處理器。若是路徑不是它的規範格式,將返回內建的用於重定向到等價的規範路徑的處理器。
Handler也會返回匹配該請求的的已註冊模式;在內建重定向處理器的狀況下,pattern會在重定向後進行匹配。若是沒有已註冊模式能夠應用於該請求,本方法將返回一個內建的"404 page not found"處理器和一個空字符串模式。
func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request)
ServeHTTP將請求派遣到與請求的URL最匹配的模式對應的處理器。
type Server struct { Addr string // 監聽的TCP地址,若是爲空字符串會使用":http" Handler Handler // 調用的處理器,如爲nil會調用http.DefaultServeMux ReadTimeout time.Duration // 請求的讀取操做在超時前的最大持續時間 WriteTimeout time.Duration // 回覆的寫入操做在超時前的最大持續時間 MaxHeaderBytes int // 請求的頭域最大長度,如爲0則用DefaultMaxHeaderBytes TLSConfig *tls.Config // 可選的TLS配置,用於ListenAndServeTLS方法 // TLSNextProto(可選地)指定一個函數來在一個NPN型協議升級出現時接管TLS鏈接的全部權。 // 映射的鍵爲商談的協議名;映射的值爲函數,該函數的Handler參數應處理HTTP請求, // 而且初始化Handler.ServeHTTP的*Request參數的TLS和RemoteAddr字段(若是未設置)。 // 鏈接在函數返回時會自動關閉。 TLSNextProto map[string]func(*Server, *tls.Conn, Handler) // ConnState字段指定一個可選的回調函數,該函數會在一個與客戶端的鏈接改變狀態時被調用。 // 參見ConnState類型和相關常數獲取細節。 ConnState func(net.Conn, ConnState) // ErrorLog指定一個可選的日誌記錄器,用於記錄接收鏈接時的錯誤和處理器不正常的行爲。 // 若是本字段爲nil,日誌會經過log包的標準日誌記錄器寫入os.Stderr。 ErrorLog *log.Logger // 內含隱藏或非導出字段 }
Server類型定義了運行HTTP服務端的參數。Server的零值是合法的配置。
func (s *Server) SetKeepAlivesEnabled(v bool)
SetKeepAlivesEnabled控制是否容許HTTP閒置鏈接重用(keep-alive)功能。默認該功能老是被啓用的。只有資源很是緊張的環境或者服務端在關閉進程中時,才應該關閉該功能。
func (srv *Server) Serve(l net.Listener) error
Serve會接手監聽器l收到的每個鏈接,併爲每個鏈接建立一個新的服務go程。該go程會讀取請求,而後調用srv.Handler回覆請求。
func (srv *Server) ListenAndServe() error
ListenAndServe監聽srv.Addr指定的TCP地址,而且會調用Serve方法接收到的鏈接。若是srv.Addr爲空字符串,會使用":http"。
func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error
ListenAndServeTLS監聽srv.Addr肯定的TCP地址,而且會調用Serve方法處理接收到的鏈接。必須提供證書文件和對應的私鑰文件。若是證書是由權威機構簽發的,certFile參數必須是順序串聯的服務端證書和CA證書。若是srv.Addr爲空字符串,會使用":https"。
type File interface { io.Closer io.Reader Readdir(count int) ([]os.FileInfo, error) Seek(offset int64, whence int) (int64, error) Stat() (os.FileInfo, error) }
File是被FileSystem接口的Open方法返回的接口類型,能夠被FileServer等函數用於文件訪問服務。
該接口的方法的行爲應該和*os.File類型的同名方法相同。
type FileSystem interface { Open(name string) (File, error) }
FileSystem接口實現了對一系列命名文件的訪問。文件路徑的分隔符爲'/',無論主機操做系統的慣例如何。
type Dir string
Dir使用限制到指定目錄樹的本地文件系統實現了http.FileSystem接口。空Dir被視爲".",即表明當前目錄。
func (d Dir) Open(name string) (File, error)
func NewFileTransport(fs FileSystem) RoundTripper
NewFileTransport返回一個RoundTripper接口,使用FileSystem接口fs提供文件訪問服務。 返回的RoundTripper接口會忽略接收的請求的URL主機及其餘絕大多數屬性。
NewFileTransport函數的典型使用狀況是給Transport類型的值註冊"file"協議,以下所示:
t := &http.Transport{} t.RegisterProtocol("file", http.NewFileTransport(http.Dir("/"))) c := &http.Client{Transport: t} res, err := c.Get("file:///etc/passwd") ...
func FileServer(root FileSystem) Handler
FileServer返回一個使用FileSystem接口root提供文件訪問服務的HTTP處理器。要使用操做系統的FileSystem接口實現,可以使用http.Dir:
http.Handle("/", http.FileServer(http.Dir("/tmp")))
func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL, error)
ProxyURL返回一個代理函數(用於Transport類型),該函數老是返回同一個URL。
func ProxyFromEnvironment(req *Request) (*url.URL, error)
ProxyFromEnvironment使用環境變量$HTTP_PROXY和$NO_PROXY(或$http_proxy和$no_proxy)的配置返回用於req的代理。若是代理環境不合法將返回錯誤;若是環境未設定代理或者給定的request不該使用代理時,將返回(nil, nil);若是req.URL.Host字段是"localhost"(能夠有端口號,也能夠沒有),也會返回(nil, nil)。
func SetCookie(w ResponseWriter, cookie *Cookie)
SetCookie在w的頭域中添加Set-Cookie頭,該HTTP頭的值爲cookie。
func Redirect(w ResponseWriter, r *Request, urlStr string, code int)
Redirect回覆請求一個重定向地址urlStr和狀態碼code。該重定向地址能夠是相對於請求r的相對地址。
func NotFound(w ResponseWriter, r *Request)
NotFound回覆請求404狀態碼(not found:目標未發現)。
func Error(w ResponseWriter, error string, code int)
Error使用指定的錯誤信息和狀態碼回覆請求,將數據寫入w。錯誤信息必須是明文。
func ServeContent(w ResponseWriter, req *Request, name string, modtime time.Time, content io.ReadSeeker)
ServeContent使用提供的ReadSeeker的內容回覆請求。ServeContent比起io.Copy函數的主要優勢,是能夠處理範圍類請求(只要一部份內容)、設置MIME類型,處理If-Modified-Since請求。
若是未設定回覆的Content-Type頭,本函數首先會嘗試從name的文件擴展名推斷數據類型;若是失敗,會用讀取content的第1塊數據並提供給DetectContentType推斷類型;以後會設置Content-Type頭。參數name不會用於別的地方,甚至於它能夠是空字符串,也永遠不會發送到回覆裏。
若是modtime不是Time零值,函數會在回覆的頭域裏設置Last-Modified頭。若是請求的頭域包含If-Modified-Since頭,本函數會使用modtime參數來肯定是否應該發送內容。若是調用者設置了w的ETag頭,ServeContent會使用它處理包含If-Range頭和If-None-Match頭的請求。
參數content的Seek方法必須有效:函數使用Seek來肯定它的大小。
注意:本包File接口和*os.File類型都實現了io.ReadSeeker接口。
func ServeFile(w ResponseWriter, r *Request, name string)
ServeFile回覆請求name指定的文件或者目錄的內容。
func MaxBytesReader(w ResponseWriter, r io.ReadCloser, n int64) io.ReadCloser
MaxBytesReader相似io.LimitReader,但它是用來限制接收到的請求的Body的大小的。不一樣於io.LimitReader,本函數返回一個ReadCloser,返回值的Read方法在讀取的數據超過大小限制時會返回非EOF錯誤,其Close方法會關閉下層的io.ReadCloser接口r。
MaxBytesReader預防客戶端由於意外或者蓄意發送的「大」請求,以免尺寸過大的請求浪費服務端資源。
func Head(url string) (resp *Response, err error)
Head向指定的URL發出一個HEAD請求,若是迴應的狀態碼以下,Head會在調用c.CheckRedirect後執行重定向:
301 (Moved Permanently) 302 (Found) 303 (See Other) 307 (Temporary Redirect)
Head是對包變量DefaultClient的Head方法的包裝。
func Get(url string) (resp *Response, err error)
Get向指定的URL發出一個GET請求,若是迴應的狀態碼以下,Get會在調用c.CheckRedirect後執行重定向:
301 (Moved Permanently) 302 (Found) 303 (See Other) 307 (Temporary Redirect)
若是c.CheckRedirect執行失敗或存在HTTP協議錯誤時,本方法將返回該錯誤;若是迴應的狀態碼不是2xx,本方法並不會返回錯誤。若是返回值err爲nil,resp.Body老是非nil的,調用者應該在讀取完resp.Body後關閉它。
Get是對包變量DefaultClient的Get方法的包裝。
func Post(url string, bodyType string, body io.Reader) (resp *Response, err error)
Post向指定的URL發出一個POST請求。bodyType爲POST數據的類型, body爲POST數據,做爲請求的主體。若是參數body實現了io.Closer接口,它會在發送請求後被關閉。調用者有責任在讀取完返回值resp的主體後關閉它。
Post是對包變量DefaultClient的Post方法的包裝。
func PostForm(url string, data url.Values) (resp *Response, err error)
PostForm向指定的URL發出一個POST請求,url.Values類型的data會被編碼爲請求的主體。若是返回值err爲nil,resp.Body老是非nil的,調用者應該在讀取完resp.Body後關閉它。
PostForm是對包變量DefaultClient的PostForm方法的包裝。
func Handle(pattern string, handler Handler)
Handle註冊HTTP處理器handler和對應的模式pattern(註冊到DefaultServeMux)。若是該模式已經註冊有一個處理器,Handle會panic。ServeMux的文檔解釋了模式的匹配機制。
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
HandleFunc註冊一個處理器函數handler和對應的模式pattern(註冊到DefaultServeMux)。ServeMux的文檔解釋了模式的匹配機制。
func Serve(l net.Listener, handler Handler) error
Serve會接手監聽器l收到的每個鏈接,併爲每個鏈接建立一個新的服務go程。該go程會讀取請求,而後調用handler回覆請求。handler參數通常會設爲nil,此時會使用DefaultServeMux。
func ListenAndServe(addr string, handler Handler) error
ListenAndServe監聽TCP地址addr,而且會使用handler參數調用Serve函數處理接收到的鏈接。handler參數通常會設爲nil,此時會使用DefaultServeMux。
一個簡單的服務端例子:
package main import ( "io" "net/http" "log" ) // hello world, the web server func HelloServer(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "hello, world!\n") } func main() { http.HandleFunc("/hello", HelloServer) err := http.ListenAndServe(":12345", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } }
func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error
ListenAndServeTLS函數和ListenAndServe函數的行爲基本一致,除了它指望HTTPS鏈接以外。此外,必須提供證書文件和對應的私鑰文件。若是證書是由權威機構簽發的,certFile參數必須是順序串聯的服務端證書和CA證書。若是srv.Addr爲空字符串,會使用":https"。
一個簡單的服務端例子:
import ( "log" "net/http" ) func handler(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "text/plain") w.Write([]byte("This is an example server.\n")) } func main() { http.HandleFunc("/", handler) log.Printf("About to listen on 10443. Go to https://127.0.0.1:10443/") err := http.ListenAndServeTLS(":10443", "cert.pem", "key.pem", nil) if err != nil { log.Fatal(err) } }
程序員可使用crypto/tls包的generate_cert.go文件來生成cert.pem和key.pem兩個文件。