golang的net/http包

package http

import "net/http" html

http包提供了HTTP客戶端和服務端的實現。 程序員

GetHeadPostPostForm函數發出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")

ClientTransport類型均可以安全的被多個go程同時使用。出於效率考慮,應該一次創建、儘可能重用。 服務器

ListenAndServe使用指定的監聽地址和處理器啓動一個HTTP服務端。處理器參數一般是nil,這表示採用包變量DefaultServeMux做爲處理器。HandleHandleFunc函數能夠向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())

Index

Examples

Constants

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

DefaultMaxHeaderBytesHTTP請求的頭域最大容許長度。能夠經過設置Server.MaxHeaderBytes字段來覆蓋。

const DefaultMaxIdleConnsPerHost = 2

DefaultMaxIdleConnsPerHostTransportMaxIdleConnsPerHost的默認值。

const TimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT"

TimeFormat是當解析或生產HTTP頭域中的時間時,用與time.Parsetime.Format函數的時間格式。這種格式相似time.RFC1123但強制採用GMT時區。

Variables

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是用於包函數GetHeadPost的默認Client

var DefaultServeMux = NewServeMux()

DefaultServeMux是用於Serve的默認ServeMux

var ErrBodyReadAfterClose = errors.New("http: invalid Read on closed Body")

ResquestResponseBody字段已經關閉後,試圖從中讀取時,就會返回ErrBodyReadAfterClose。這個錯誤通常發生在:HTTP處理器中調用完ResponseWriter 接口的WriteHeaderWrite後從請求中讀取數據的時候。

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

type ProtocolError struct { ErrorString string }

HTTP請求解析錯誤。

func (*ProtocolError) Error

func (err *ProtocolError) Error() string

func CanonicalHeaderKey

func CanonicalHeaderKey(s string) string

CanonicalHeaderKey函數返回頭域(表示爲Header類型)的鍵s的規範化格式。規範化過程當中讓單詞首字母和'-'後的第一個字母大寫,其他字母小寫。例如,"accept-encoding"規範化爲"Accept-Encoding"

func DetectContentType

func DetectContentType(data []byte) string

DetectContentType函數實現了http://mimesniff.spec.whatwg.org/描述的算法,用於肯定數據的Content-Type。函數老是返回一個合法的MIME類型;若是它不能肯定數據的類型,將返回"application/octet-stream"。它最多檢查數據的前512字節。

func ParseHTTPVersion

func ParseHTTPVersion(vers string) (major, minor int, ok bool)

ParseHTTPVersion解析HTTP版本字符串。如"HTTP/1.0"返回(1, 0, true)

func ParseTime

func ParseTime(text string) (t time.Time, err error)

ParseTime3種格式TimeFormat, time.RFC850time.ANSIC嘗試解析一個時間頭的值(如Date: header)。

func StatusText

func StatusText(code int) string

StatusText返回HTTP狀態碼code對應的文本,如220對應"OK"。若是code是未知的狀態碼,會返回""

type ConnState

type ConnState int

ConnState表明一個客戶端到服務端的鏈接的狀態。本類型用於可選的Server.ConnState回調函數。

const ( // StateNew表明一個新的鏈接,將要馬上發送請求。 // 鏈接從這個狀態開始,而後轉變爲StateAliveStateClosed StateNew ConnState = iota // StateActive表明一個已經讀取了請求數據1到多個字節的鏈接。 // 用於StateAliveServer.ConnState回調函數在將鏈接交付給處理器以前被觸發, // 等到請求被處理完後,Server.ConnState回調函數再次被觸發。 // 在請求被處理後,鏈接狀態改變爲StateClosedStateHijackedStateIdle StateActive // StateIdle表明一個已經處理完了請求、處在閒置狀態、等待新請求的鏈接。 // 鏈接狀態能夠從StateIdle改變爲StateActiveStateClosed StateIdle // 表明一個被劫持的鏈接。這是一個終止狀態,不會轉變爲StateClosed StateHijacked // StateClosed表明一個關閉的鏈接。 // 這是一個終止狀態。被劫持的鏈接不會轉變爲StateClosed StateClosed )

func (ConnState) String

func (c ConnState) String() string

type Header

type Header map[string][]string

Header表明HTTP頭域的鍵值對。

func (Header) Get

func (h Header) Get(key string) string

Get返回鍵對應的第一個值,若是鍵不存在會返回""。如要獲取該鍵對應的值切片,請直接用規範格式的鍵訪問map

func (Header) Set

func (h Header) Set(key, value string)

Set添加鍵值對到h,如鍵已存在則會用只有新值一個元素的切片取代舊值切片。

func (Header) Add

func (h Header) Add(key, value string)

Add添加鍵值對到h,如鍵已存在則會將新的值附加到舊值切片後面。

func (Header) Del

func (h Header) Del(key string)

Del刪除鍵值對。

func (Header) Write

func (h Header) Write(w io.Writer) error

Write以有線格式將頭域寫入w

func (Header) WriteSubset

func (h Header) WriteSubset(w io.Writer, exclude map[string]bool) error

WriteSubset以有線格式將頭域寫入w。當exclude不爲nil時,若是h的鍵值對的鍵在exclude中存在且其對應值爲真,該鍵值對就不會被寫入w

type Cookie

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 (*Cookie) String

func (c *Cookie) String() string

String返回該cookie的序列化結果。若是隻設置了NameValue字段,序列化結果可用於HTTP請求的Cookie頭或者HTTP回覆的Set-Cookie頭;若是設置了其餘字段,序列化結果只能用於HTTP回覆的Set-Cookie頭。

type CookieJar

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

type Request struct { // Method指定HTTP方法(GETPOSTPUT等)。對客戶端,""表明GET Method string // URL在服務端表示被請求的URI,在客戶端表示要訪問的URL // // 在服務端,URL字段是解析請求行的URI(保存在RequestURI字段)獲得的, // 對大多數請求來講,除了PathRawQuery以外的字段都是空字符串。 // (參見RFC 2616, Section 5.1.2 // // 在客戶端,URLHost字段指定了要鏈接的服務器, // 而RequestHost字段(可選地)指定要發送的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是請求的主體。 // // 在客戶端,若是Bodynil表示該請求沒有主體買入GET請求。 // ClientTransport字段會負責調用BodyClose方法。 // // 在服務端,Body字段老是非nil的;但在沒有主體時,讀取Body會馬上返回EOF // Server會關閉請求的主體,ServeHTTP處理器不須要關閉Body字段。 Body io.ReadCloser // ContentLength記錄相關內容的長度。 // 若是爲-1,表示長度未知,若是>=0,表示能夠從Body字段讀取ContentLength字節數據。 // 在客戶端,若是Bodynil而該字段爲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參數和POSTPUT的表單數據。 // 本字段只有在調用ParseForm後纔有效。在客戶端,會忽略請求中的本字段而使用Body替代。 Form url.Values // PostForm是解析好的POSTPUT的表單數據。 // 本字段只有在調用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字段,不然將設TLSnil // 客戶端會忽略請求中的TLS字段。 TLS *tls.ConnectionState }

Request類型表明一個服務端接受到的或者客戶端發送出去的HTTP請求。

Request各字段的意義和用途在服務端和客戶端是不一樣的。除了字段自己上方文檔,還可參見Request.Write方法和RoundTripper接口的文檔。

func NewRequest

func NewRequest(method, urlStr string, body io.Reader) (*Request, error)

NewRequest使用指定的方法、網址和可選的主題建立並返回一個新的*Request

若是body參數實現了io.Closer接口,Request返回值的Body 字段會被設置爲body,並會被Client類型的DoPostPostFOrm方法以及Transport.RoundTrip方法關閉。

func ReadRequest

func ReadRequest(b *bufio.Reader) (req *Request, err error)

ReadRequestb讀取並解析出一個HTTP請求。(本函數主要用在服務端從下層獲取請求)

func (*Request) ProtoAtLeast

func (r *Request) ProtoAtLeast(major, minor int) bool

ProtoAtLeast報告該請求使用的HTTP協議版本至少是major.minor

func (*Request) UserAgent

func (r *Request) UserAgent() string

UserAgent返回請求中的客戶端用戶代理信息(請求的User-Agent頭)。

func (*Request) Referer

func (r *Request) Referer() string

Referer返回請求中的訪問來路信息。(請求的Referer頭)

Referer在請求中就是拼錯了的,這是HTTP早期就有的錯誤。該值也能夠從用Header["Referer"]獲取; 讓獲取Referer字段變成方法的好處是,編譯器能夠診斷使用正確單詞拼法的req.Referrer()的程序,但卻不能診斷使用Header["Referrer"]的程序。

func (*Request) AddCookie

func (r *Request) AddCookie(c *Cookie)

AddCookie向請求中添加一個cookie。按照RFC 6265 section 5.4的跪地,AddCookie不會添加超過一個Cookie頭字段。這表示全部的cookie都寫在同一行,用分號分隔(cookie內部用逗號分隔屬性)。

func (*Request) SetBasicAuth

func (r *Request) SetBasicAuth(username, password string)

SetBasicAuth使用提供的用戶名和密碼,採用HTTP基本認證,設置請求的Authorization頭。HTTP基本認證會明碼傳送用戶名和密碼。

func (*Request) Write

func (r *Request) Write(w io.Writer) error

Write方法以有線格式將HTTP/1.1請求寫入w(用於將請求寫入下層TCPConn等)。本方法會考慮請求的以下字段:

Host
URL
Method (defaults to "GET")
Header
ContentLength
TransferEncoding
Body

若是存在BodyContentLength字段<= 0TransferEncoding字段未顯式設置爲["identity"]Write方法會顯式添加"Transfer-Encoding: chunked"到請求的頭域。Body字段會在發送完請求後關閉。

func (*Request) WriteProxy

func (r *Request) WriteProxy(w io.Writer) error

WriteProxy相似Write但會將請求以HTTP代理指望的格式發送。

尤爲是,按照RFC 2616 Section 5.1.2WriteProxy會使用絕對URI(包括協議和主機名)來初始化請求的第1行(Request-URI行)。不管何種狀況,WriteProxy都會使用r.Hostr.URL.Host設置Host頭。

func (*Request) Cookies

func (r *Request) Cookies() []*Cookie

Cookies解析並返回該請求的Cookie頭設置的cookie

func (*Request) Cookie

func (r *Request) Cookie(name string) (*Cookie, error)

Cookie返回請求中名爲namecookie,若是未找到該cookie會返回nil, ErrNoCookie

func (*Request) ParseForm

func (r *Request) ParseForm() error

ParseForm解析URL中的查詢字符串,並將解析結果更新到r.Form字段。

對於POSTPUT請求,ParseForm還會將body看成表單解析,並將結果既更新到r.PostForm也更新到r.Form。解析結果中,POSTPUT請求主體要優先於URL查詢字符串(同名變量,主體的值在查詢字符串的值前面)。

若是請求的主體的大小沒有被MaxBytesReader函數設定限制,其大小默認限制爲開頭10MB

ParseMultipartForm會自動調用ParseForm。重複調用本方法是無心義的。

func (*Request) ParseMultipartForm

func (r *Request) ParseMultipartForm(maxMemory int64) error

ParseMultipartForm將請求的主體做爲multipart/form-data解析。請求的整個主體都會被解析,獲得的文件記錄最多maxMemery字節保存在內存,其他部分保存在硬盤的temp文件裏。若是必要,ParseMultipartForm會自行調用ParseForm。重複調用本方法是無心義的。

func (*Request) FormValue

func (r *Request) FormValue(key string) string

FormValue返回key爲鍵查詢r.Form字段獲得結果[]string切片的第一個值。POSTPUT主體中的同名參數優先於URL查詢字符串。若是必要,本函數會隱式調用ParseMultipartFormParseForm

func (*Request) PostFormValue

func (r *Request) PostFormValue(key string) string

PostFormValue返回key爲鍵查詢r.PostForm字段獲得結果[]string切片的第一個值。若是必要,本函數會隱式調用ParseMultipartFormParseForm

func (*Request) FormFile

func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error)

FormFile返回以key爲鍵查詢r.MultipartForm字段獲得結果中的第一個文件和它的信息。若是必要,本函數會隱式調用ParseMultipartFormParseForm。查詢失敗會返回ErrMissingFile錯誤。

func (*Request) MultipartReader

func (r *Request) MultipartReader() (*multipart.Reader, error)

若是請求是multipart/form-data POST請求,MultipartReader返回一個multipart.Reader接口,不然返回nil和一個錯誤。使用本函數代替ParseMultipartForm,能夠將r.Body做爲流處理。

type Response

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是用來獲取此回覆的請求 // RequestBody字段是nil(由於已經被用掉了) // 這個字段是被Client類型發出請求並得到回覆後填充的 Request *Request // TLS包含接收到該回復的TLS鏈接的信息。 對未加密的回覆,本字段爲nil // 返回的指針是被(同一TLS鏈接接收到的)回覆共享的,不該被修改。 TLS *tls.ConnectionState }

Response表明一個HTTP請求的回覆。

func ReadResponse

func ReadResponse(r *bufio.Reader, req *Request) (*Response, error)

ReadResponser讀取並返回一個HTTP 回覆。req參數是可選的,指定該回復對應的請求(便是對該請求的回覆)。若是是nil,將假設請求是GET請求。客戶端必須在結束resp.Body的讀取後關閉它。讀取完畢並關閉後,客戶端能夠檢查resp.Trailer字段獲取回覆的trailer的鍵值對。(本函數主要用在客戶端從下層獲取回覆)

func (*Response) ProtoAtLeast

func (r *Response) ProtoAtLeast(major, minor int) bool

ProtoAtLeast報告該回復使用的HTTP協議版本至少是major.minor

func (*Response) Cookies

func (r *Response) Cookies() []*Cookie

Cookies解析並返回該回復中的Set-Cookie頭設置的cookie

func (*Response) Location

func (r *Response) Location() (*url.URL, error)

Location返回該回復的Location頭設置的URL。相對地址的重定向會相對於該回復對應的請求來肯定絕對地址。若是回覆中沒有Location頭,會返回nil, ErrNoLocation

func (*Response) Write

func (r *Response) Write(w io.Writer) error

Write以有線格式將回複寫入w(用於將回複寫入下層TCPConn等)。本方法會考慮以下字段:

StatusCode
ProtoMajor
ProtoMinor
Request.Method
TransferEncoding
Trailer
Body
ContentLength
Header(不規範的鍵名和它對應的值會致使不可預知的行爲)

Body字段在發送完回覆後會被關閉。

type ResponseWriter

type ResponseWriter interface { // Header返回一個Header類型值,該值會被WriteHeader方法發送。 // 在調用WriteHeaderWrite方法後再改變該對象是沒有意義的。 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

type Flusher interface { // Flush將緩衝中的全部數據發送到客戶端 Flush()
}

HTTP處理器ResponseWriter接口參數的下層若是實現了Flusher接口,可讓HTTP處理器將緩衝中的數據發送到客戶端。

注意:即便ResponseWriter接口的下層支持Flush方法,若是客戶端是經過HTTP代理鏈接的,緩衝中的數據也可能直到回覆完畢才被傳輸到客戶端。

type CloseNotifier

type CloseNotifier interface { // CloseNotify返回一個通道,該通道會在客戶端鏈接丟失時接收到惟一的值 CloseNotify() <-chan bool }

HTTP處理器ResponseWriter接口參數的下層若是實現了CloseNotifier接口,可讓用戶檢測下層的鏈接是否中止。若是客戶端在回覆準備好以前關閉了鏈接,該機制能夠用於取消服務端耗時較長的操做。

type Hijacker

type Hijacker interface { // Hijack讓調用者接管鏈接,返回鏈接和關聯到該鏈接的一個緩衝讀寫器。 // 調用本方法後,HTTP服務端將再也不對鏈接進行任何操做, // 調用者有責任管理、關閉返回的鏈接。 Hijack() (net.Conn, *bufio.ReadWriter, error)
}

HTTP處理器ResponseWriter接口參數的下層若是實現了Hijacker接口,可讓HTTP處理器接管該鏈接。

type RoundTripper

type RoundTripper interface { // RoundTrip執行單次HTTP事務,接收併發揮請求req的回覆。 // RoundTrip不該試圖解析/修改獲得的回覆。 // 尤爲要注意,只要RoundTrip得到了一個回覆,無論該回復的HTTP狀態碼如何, // 它必須將返回值err設置爲nil // 非nil的返回值err應該留給獲取回覆失敗的狀況。 // 相似的,RoundTrip不能試圖管理高層次的細節,如重定向、認證、cookie // // 除了從請求的主體讀取並關閉主體以外,RoundTrip不該修改請求,包括(請求的)錯誤。 // RoundTrip函數接收的請求的URLHeader字段能夠保證是(被)初始化了的。 RoundTrip(*Request) (*Response, error)
}

RoundTripper接口是具備執行單次HTTP事務的能力(接收指定請求的回覆)的接口。

RoundTripper接口的類型必須能夠安全的被多線程同時使用。

type Transport

type Transport struct { // Proxy指定一個對給定請求返回代理的函數。 // 若是該函數返回了非nil的錯誤值,請求的執行就會中斷並返回該錯誤。 // 若是Proxynil或返回nil*URL置,將不使用代理。 Proxy func(*Request) (*url.URL, error) // Dial指定建立TCP鏈接的撥號函數。若是Dialnil,會使用net.Dial。 Dial func(network, addr string) (net.Conn, error) // TLSClientConfig指定用於tls.ClientTLS配置信息。 // 若是該字段爲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接口,支持httphttpshttp/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 (*Transport) RegisterProtocol

func (t *Transport) RegisterProtocol(scheme string, rt RoundTripper)

RegisterProtocol註冊一個新的名爲scheme的協議。t會將使用scheme協議的請求轉交給rtrt有責任模擬HTTP請求的語義。

RegisterProtocol能夠被其餘包用於提供"ftp""file"等協議的實現。

func (*Transport) RoundTrip

func (t *Transport) RoundTrip(req *Request) (resp *Response, err error)

RoundTrip方法實現了RoundTripper接口。

高層次的HTTP客戶端支持(如管理cookie和重定向)請參見GetPost等函數和Client類型。

func (*Transport) CloseIdleConnections

func (t *Transport) CloseIdleConnections()

CloseIdleConnections關閉全部以前的請求創建但目前處於閒置狀態的鏈接。本方法不會中斷正在使用的鏈接。

func (*Transport) CancelRequest

func (t *Transport) CancelRequest(req *Request)

CancelRequest經過關閉請求所在的鏈接取消一個執行中的請求。

type Client

type Client struct { // Transport指定執行獨立、單次HTTP請求的機制。 // 若是Transportnil,則使用DefaultTransport Transport RoundTripper // CheckRedirect指定處理重定向的策略。 // 若是CheckRedirect不爲nil,客戶端會在執行重定向以前調用本函數字段。 // 參數reqvia是將要執行的請求和已經執行的請求(切片,越新的請求越靠後)。 // 若是CheckRedirect返回一個錯誤,本類型的Get方法不會發送請求req // 而是返回以前獲得的最後一個回覆和該錯誤。(包裝進url.Error類型裏) // // 若是CheckRedirectnil,會採用默認策略:連續10此請求後中止。 CheckRedirect func(req *Request, via []*Request) error // Jar指定cookie管理器。 // 若是Jarnil,請求中不會發送cookie,回覆中的cookie會被忽略。 Jar CookieJar // Timeout指定本類型的值執行請求的時間限制。 // 該超時限制包括鏈接時間、重定向和讀取回復主體的時間。 // 計時器會在HeadGetPostDo方法返回後繼續運做並在超時後中斷回覆主體的讀取。 // // Timeout爲零值表示不設置超時。 // // Client實例的Transport字段必須支持CancelRequest方法, // 不然Client會在試圖用HeadGetPostDo方法執行請求時返回錯誤。 // 本類型的Transport字段默認值(DefaultTransport)支持CancelRequest方法。 Timeout time.Duration }

Client類型表明HTTP客戶端。它的零值(DefaultClient)是一個可用的使用DefaultTransport的客戶端。

ClientTransport字段通常會含有內部狀態(緩存TCP鏈接),所以Client類型值應儘可能被重用而不是每次須要都建立新的。Client類型值能夠安全的被多個go程同時使用。

Client類型的層次比RoundTripper接口(如Transport)高,還會管理HTTPcookie和重定向等細節。

func (*Client) Do

func (c *Client) Do(req *Request) (resp *Response, err error)

Do方法發送請求,返回HTTP回覆。它會遵照客戶端c設置的策略(如重定向、cookie、認證)。

若是客戶端的策略(如重定向)返回錯誤或存在HTTP協議錯誤時,本方法將返回該錯誤;若是迴應的狀態碼不是2xx,本方法並不會返回錯誤。

若是返回值errnilresp.Body老是非nil的,調用者應該在讀取完resp.Body後關閉它。若是返回值resp的主體未關閉,c下層的RoundTripper接口(通常爲Transport類型)可能沒法重用resp主體下層保持的TCP鏈接去執行以後的請求。

請求的主體,若是非nil,會在執行後被c.Transport關閉,即便出現錯誤。

通常應使用GetPostPostForm方法代替Do方法。

func (*Client) Head

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 (*Client) Get

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,本方法並不會返回錯誤。若是返回值errnilresp.Body老是非nil的,調用者應該在讀取完resp.Body後關閉它。

func (*Client) Post

func (c *Client) Post(url string, bodyType string, body io.Reader) (resp *Response, err error)

Post向指定的URL發出一個POST請求。bodyTypePOST數據的類型, bodyPOST數據,做爲請求的主體。若是參數body實現了io.Closer接口,它會在發送請求後被關閉。調用者有責任在讀取完返回值resp的主體後關閉它。

func (*Client) PostForm

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"。若是返回值errnilresp.Body老是非nil的,調用者應該在讀取完resp.Body後關閉它。

type Handler

type Handler interface { ServeHTTP(ResponseWriter, *Request)
}

實現了Handler接口的對象能夠註冊到HTTP服務端,爲特定的路徑及其子樹提供服務。

ServeHTTP應該將回復的頭域和數據寫入ResponseWriter接口而後返回。返回標誌着該請求已經結束,HTTP服務端能夠轉移向該鏈接上的下一個請求。

func NotFoundHandler

func NotFoundHandler() Handler

NotFoundHandler返回一個簡單的請求處理器,該處理器會對每一個請求都回復"404 page not found"

func RedirectHandler

func RedirectHandler(url string, code int) Handler

RedirectHandler返回一個請求處理器,該處理器會對每一個請求都使用狀態碼code重定向到網址url

func TimeoutHandler

func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler

TimeoutHandler返回一個採用指定時間限制的請求處理器。

返回的Handler會調用h.ServeHTTP去處理每一個請求,但若是某一次調用耗時超過了時間限制,該處理器會回覆請求狀態碼503 Service Unavailable,並將msg做爲回覆的主體(若是msg爲空字符串,將發送一個合理的默認信息)。在超時後,h對它的ResponseWriter接口參數的寫入操做會返回ErrHandlerTimeout

func StripPrefix

func StripPrefix(prefix string, h Handler) Handler

StripPrefix返回一個處理器,該處理器會將請求的URL.Path字段中給定前綴prefix去除後再交由h處理。StripPrefix會向URL.Path字段中沒有給定前綴的請求回覆404 page not found

type HandlerFunc

type HandlerFunc func(ResponseWriter, *Request)

HandlerFunc type是一個適配器,經過類型轉換讓咱們能夠將普通的函數做爲HTTP處理器使用。若是f是一個具備適當簽名的函數,HandlerFunc(f)經過調用f實現了Handler接口。

func (HandlerFunc) ServeHTTP

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request)

ServeHTTP方法會調用f(w, r)

type ServeMux

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

func NewServeMux() *ServeMux

NewServeMux建立並返回一個新的*ServeMux

func (*ServeMux) Handle

func (mux *ServeMux) Handle(pattern string, handler Handler)

Handle註冊HTTP處理器handler和對應的模式pattern。若是該模式已經註冊有一個處理器,Handlepanic

func (*ServeMux) HandleFunc

func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request))

HandleFunc註冊一個處理器函數handler和對應的模式pattern

func (*ServeMux) Handler

func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string)

Handler根據r.Methodr.Hostr.URL.Path等數據,返回將用於處理該請求的HTTP處理器。它老是返回一個非nil的處理器。若是路徑不是它的規範格式,將返回內建的用於重定向到等價的規範路徑的處理器。

Handler也會返回匹配該請求的的已註冊模式;在內建重定向處理器的狀況下,pattern會在重定向後進行匹配。若是沒有已註冊模式能夠應用於該請求,本方法將返回一個內建的"404 page not found"處理器和一個空字符串模式。

func (*ServeMux) ServeHTTP

func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request)

ServeHTTP將請求派遣到與請求的URL最匹配的模式對應的處理器。

type Server

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參數的TLSRemoteAddr字段(若是未設置)。 // 鏈接在函數返回時會自動關閉。 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 (*Server) SetKeepAlivesEnabled

func (s *Server) SetKeepAlivesEnabled(v bool)

SetKeepAlivesEnabled控制是否容許HTTP閒置鏈接重用(keep-alive)功能。默認該功能老是被啓用的。只有資源很是緊張的環境或者服務端在關閉進程中時,才應該關閉該功能。

func (*Server) Serve

func (srv *Server) Serve(l net.Listener) error

Serve會接手監聽器l收到的每個鏈接,併爲每個鏈接建立一個新的服務go程。該go程會讀取請求,而後調用srv.Handler回覆請求。

func (*Server) ListenAndServe

func (srv *Server) ListenAndServe() error

ListenAndServe監聽srv.Addr指定的TCP地址,而且會調用Serve方法接收到的鏈接。若是srv.Addr爲空字符串,會使用":http"

func (*Server) ListenAndServeTLS

func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error

ListenAndServeTLS監聽srv.Addr肯定的TCP地址,而且會調用Serve方法處理接收到的鏈接。必須提供證書文件和對應的私鑰文件。若是證書是由權威機構簽發的,certFile參數必須是順序串聯的服務端證書和CA證書。若是srv.Addr爲空字符串,會使用":https"

type File

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

type FileSystem interface { Open(name string) (File, error)
}

FileSystem接口實現了對一系列命名文件的訪問。文件路徑的分隔符爲'/',無論主機操做系統的慣例如何。

type Dir

type Dir string

Dir使用限制到指定目錄樹的本地文件系統實現了http.FileSystem接口。空Dir被視爲".",即表明當前目錄。

func (Dir) Open

func (d Dir) Open(name string) (File, error)

func NewFileTransport

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

func FileServer(root FileSystem) Handler

FileServer返回一個使用FileSystem接口root提供文件訪問服務的HTTP處理器。要使用操做系統的FileSystem接口實現,可以使用http.Dir

http.Handle("/", http.FileServer(http.Dir("/tmp")))

func ProxyURL

func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL, error)

ProxyURL返回一個代理函數(用於Transport類型),該函數老是返回同一個URL

func ProxyFromEnvironment

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

func SetCookie(w ResponseWriter, cookie *Cookie)

SetCookiew的頭域中添加Set-Cookie頭,該HTTP頭的值爲cookie

func Redirect

func Redirect(w ResponseWriter, r *Request, urlStr string, code int)

Redirect回覆請求一個重定向地址urlStr和狀態碼code。該重定向地址能夠是相對於請求r的相對地址。

func NotFound

func NotFound(w ResponseWriter, r *Request)

NotFound回覆請求404狀態碼(not found:目標未發現)。

func Error

func Error(w ResponseWriter, error string, code int)

Error使用指定的錯誤信息和狀態碼回覆請求,將數據寫入w。錯誤信息必須是明文。

func ServeContent

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參數來肯定是否應該發送內容。若是調用者設置了wETag頭,ServeContent會使用它處理包含If-Range頭和If-None-Match頭的請求。

參數contentSeek方法必須有效:函數使用Seek來肯定它的大小。

注意:本包File接口和*os.File類型都實現了io.ReadSeeker接口。

func ServeFile

func ServeFile(w ResponseWriter, r *Request, name string)

ServeFile回覆請求name指定的文件或者目錄的內容。

func MaxBytesReader

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

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是對包變量DefaultClientHead方法的包裝。

func Get

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,本方法並不會返回錯誤。若是返回值errnilresp.Body老是非nil的,調用者應該在讀取完resp.Body後關閉它。

Get是對包變量DefaultClientGet方法的包裝。

func Post

func Post(url string, bodyType string, body io.Reader) (resp *Response, err error)

Post向指定的URL發出一個POST請求。bodyTypePOST數據的類型, bodyPOST數據,做爲請求的主體。若是參數body實現了io.Closer接口,它會在發送請求後被關閉。調用者有責任在讀取完返回值resp的主體後關閉它。

Post是對包變量DefaultClientPost方法的包裝。

func PostForm

func PostForm(url string, data url.Values) (resp *Response, err error)

PostForm向指定的URL發出一個POST請求,url.Values類型的data會被編碼爲請求的主體。若是返回值errnilresp.Body老是非nil的,調用者應該在讀取完resp.Body後關閉它。

PostForm是對包變量DefaultClientPostForm方法的包裝。

func Handle

func Handle(pattern string, handler Handler)

Handle註冊HTTP處理器handler和對應的模式pattern(註冊到DefaultServeMux)。若是該模式已經註冊有一個處理器,HandlepanicServeMux的文檔解釋了模式的匹配機制。

func HandleFunc

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

HandleFunc註冊一個處理器函數handler和對應的模式pattern(註冊到DefaultServeMux)。ServeMux的文檔解釋了模式的匹配機制。

func Serve

func Serve(l net.Listener, handler Handler) error

Serve會接手監聽器l收到的每個鏈接,併爲每個鏈接建立一個新的服務go程。該go程會讀取請求,而後調用handler回覆請求。handler參數通常會設爲nil,此時會使用DefaultServeMux

func ListenAndServe

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

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.pemkey.pem兩個文件。

相關文章
相關標籤/搜索