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两个文件。