http http http http 包 import "net/http" 预览 目录 例子 子 目录 预览 Http 包 提供 实现 HTTP 客 户端 和服 务端 的方 法与 函数 。 Get、Head、Post、PostForm 配 合使 用实 现 HTTP 请 求: 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 客 户端 的 headers、 重定 向方 案和 其它 设定 ,需 要创 建一 个 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) 为 了控 制代 理、 安全 套接 层设 置、 保持 连接 、压 缩和 其它 设定 ,需 要创 建一 个 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 可 以安 全的 进行 多线 程的 并发 ,因 此为 了提 高效 率应 该一 次建 立多 次使 用。 ListenAndServe 根 据提 供的 地址 和 handler 创 建一 个 HTTP Server。Handler 通 常是 nil,nil 表 示使 用 DefaultServeMux。 可 以使 用 Handle 和HandleFunc 给DefaultServeMux 添 加新 的 handler: 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()) 索引 Constants Variables func CanonicalHeaderKey(s string) string func DetectContentType(data []byte) string func Error(w ResponseWriter, error string, code int) func Handle(pattern string, handler Handler) func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) func ListenAndServe(addr string, handler Handler) error func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error func MaxBytesReader(w ResponseWriter, r io.ReadCloser, n int64) io.ReadCloser func NotFound(w ResponseWriter, r *Request) func ParseHTTPVersion(vers string) (major, minor int, ok bool) func ParseTime(text string) (t time.Time, err error) func ProxyFromEnvironment(req *Request) (*url.URL, error) func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL, error) func Redirect(w ResponseWriter, r *Request, urlStr string, code int) func Serve(l net.Listener, handler Handler) error func ServeContent(w ResponseWriter, req *Request, name string, modtime time.Time, content io.ReadSeeker) func ServeFile(w ResponseWriter, r *Request, name string) func SetCookie(w ResponseWriter, cookie *Cookie) func StatusText(code int) string type Client func (c *Client) Do(req *Request) (resp *Response, err error) func (c *Client) Get(url string) (resp *Response, err error) func (c *Client) Head(url string) (resp *Response, err error) func (c *Client) Post(url string, bodyType string, body io.Reader) (resp *Response, err error) func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error) type Cookie func (c *Cookie) String() string type CookieJar type Dir func (d Dir) Open(name string) (File, error) type File type FileSystem type Flusher type Handler func FileServer(root FileSystem) Handler func NotFoundHandler() Handler func RedirectHandler(url string, code int) Handler func StripPrefix(prefix string, h Handler) Handler func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler type HandlerFunc func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) type Header func (h Header) Add(key, value string) func (h Header) Del(key string) func (h Header) Get(key string) string func (h Header) Set(key, value string) func (h Header) Write(w io.Writer) error func (h Header) WriteSubset(w io.Writer, exclude map[string]bool) error type Hijacker type ProtocolError func (err *ProtocolError) Error() string type Request func NewRequest(method, urlStr string, body io.Reader) (*Request, error) func ReadRequest(b *bufio.Reader) (req *Request, err error) func (r *Request) AddCookie(c *Cookie) func (r *Request) Cookie(name string) (*Cookie, error) func (r *Request) Cookies() []*Cookie func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error) func (r *Request) FormValue(key string) string func (r *Request) MultipartReader() (*multipart.Reader, error) func (r *Request) ParseForm() (err error) func (r *Request) ParseMultipartForm(maxMemory int64) error func (r *Request) PostFormValue(key string) string func (r *Request) ProtoAtLeast(major, minor int) bool func (r *Request) Referer() string func (r *Request) SetBasicAuth(username, password string) func (r *Request) UserAgent() string func (r *Request) Write(w io.Writer) error func (r *Request) WriteProxy(w io.Writer) error type Response func Get(url string) (resp *Response, err error) func Head(url string) (resp *Response, err error) func Post(url string, bodyType string, body io.Reader) (resp *Response, err error) func PostForm(url string, data url.Values) (resp *Response, err error) func ReadResponse(r *bufio.Reader, req *Request) (resp *Response, err error) func (r *Response) Cookies() []*Cookie func (r *Response) Location() (*url.URL, error) func (r *Response) ProtoAtLeast(major, minor int) bool func (r *Response) Write(w io.Writer) error type ResponseWriter type RoundTripper func NewFileTransport(fs FileSystem) RoundTripper type ServeMux func NewServeMux() *ServeMux func (mux *ServeMux) Handle(pattern string, handler Handler) func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string) func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request) type Server func (srv *Server) ListenAndServe() error func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error func (srv *Server) Serve(l net.Listener) error type Transport func (t *Transport) CloseIdleConnections() func (t *Transport) RegisterProtocol(scheme string, rt RoundTripper) func (t *Transport) RoundTrip(req *Request) (resp *Response, err error) ExamplesExamplesExamplesExamples FileServer Get Hijacker PackagePackagePackagePackage filesfilesfilesfiles chunked.go client.go cookie.go doc.go filetransport.go fs.go header.go jar.go lex.go request.go response.go server.go sniff.go status.go transfer.go transport.go 常量 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 ) 以上都是 RFC 2616 规定的 HTTP 状态码 const DefaultMaxHeaderBytes = 1 << 20 // 1 MB DefaultMaxHeaderBytes 是HTTP 请求头的最大允许值,可以通过设定 Server.MaxHeaderBytes 来重写。 const DefaultMaxIdleConnsPerHost = 2 DefaultMaxIdleConnsPerHost 是Transport 默认的单位地址最大空闲连接值。 const TimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT" TimeFormat 是使用时间的格式。当分析或者结合 HTTP 头的时间数据时,用来分拆(Parse)和格式化 (time.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 Content-Type"} ) 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 是默认的 Client,供Get、Head、Post 等操作使用。 var DefaultServeMux = NewServeMux() DefaultServeMux 是默认的 ServeMux,供Server 使用。 var ErrBodyReadAfterClose = errors.New("http: invalid Read on closed request Body") 当请求体被关闭后读取它时,返回 ErrBodyReadAfterClose。一般在某个 HTTP handler 执行了请求体的 ResponseWriter 的WriteHeader 或Write 方法后,再次读取请求体时,就会导致这个错误。 var ErrHandlerTimeout = errors.New("http: Handler timeout") 当ResponseWriter 的Write 操作呼叫的 handler 发生超时后,就会返回 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") funcfuncfuncfunc CanonicalHeaderKeyCanonicalHeaderKeyCanonicalHeaderKeyCanonicalHeaderKey func CanonicalHeaderKey(s string) string CanonicalHeaderKey 返回字符串 s的标准格式。函数将单词的首字母和连字符后的首字母转为大写,其余 都转为小写。例如,"accept-encoding"的标准版是"Accept-Encoding"。 funcfuncfuncfunc DetectContentTypeDetectContentTypeDetectContentTypeDetectContentType func DetectContentType(data []byte) string DetectContentType 使用http://mimesniff.spec.whatwg.org/ 描述的算法来确定给定数据的内容类型 (Content-Type)。它最多评估开始的 512 字节。本函数一定会返回有效的多用途互联网邮件扩展(MIME) 类型:如果函数无法确定明确的类型,它返回"application/octet-stream"。 funcfuncfuncfunc ErrorErrorErrorError func Error(w ResponseWriter, error string, code int) Error 函数向请求返回 HTTP 错误码和详细的错误信息。 funcfuncfuncfunc HandleHandleHandleHandle func Handle(pattern string, handler Handler) Handle 为DefaultServeMux 中给定的模式(pattern)注册反应器(handler)。ServeMux 的说明文档讲 解了pattern 是如何工作的。 funcfuncfuncfunc HandleFuncHandleFuncHandleFuncHandleFunc func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) HandleFunc 为DefaultServeMux 中给定的模式(pattern)注册反应函数(handler function)。 funcfuncfuncfunc ListenAndServeListenAndServeListenAndServeListenAndServe func ListenAndServe(addr string, handler Handler) error ListenAndServe 监听TCP 网络地址并且呼叫具有 handler 的Server 对在进入连接发出的请求作出反应。 Handler 一般是 nil,此时使用 DefaultServeMux。 一个简单的 server 例子: 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) } } funcfuncfuncfunc ListenAndServeTLSListenAndServeTLSListenAndServeTLSListenAndServeTLS func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error ListenAndServeTLS 和ListenAndServe 作用一致,但它要求 HTTPS 连接。此外,必须提供包含证书的文 件和与服务台(server)匹配的私钥。如果证书是权威机构签发的,则证书文件必须是服务台证书紧跟 CA 证书的级联。 一个简单的 server 例子: 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。 funcfuncfuncfunc MaxBytesReaderMaxBytesReaderMaxBytesReaderMaxBytesReader func MaxBytesReader(w ResponseWriter, r io.ReadCloser, n int64) io.ReadCloser MaxBytesReader 类似于 io.LimitReader 但被设计用来限定接收的请求体的大小。不同于 io.LimitReader, MaxBytesReader 的返回值是一个 ReadCloser,当读取超过限制时会返回 non-EOF 错误并且当它的关闭方 法调用时会关闭潜在的读取者(函数/进程)。 MaxBytesReader 保护客户端避免偶然或者恶意发送的长数据请求导致的 server 资源的浪费。 funcfuncfuncfunc NotFoundNotFoundNotFoundNotFound func NotFound(w ResponseWriter, r *Request) NotFound 对请求返回一个 HTTP 404 未发现资源的错误(写入 ResponseWriter)。 funcfuncfuncfunc ParseHTTPVersionParseHTTPVersionParseHTTPVersionParseHTTPVersion func ParseHTTPVersion(vers string) (major, minor int, ok bool) ParseHTTPVersion 函数分析并分解 HTTP 版本字符串。"HTTP/1.0"返回(1, 0, true)。 funcfuncfuncfunc ParseTimeParseTimeParseTimeParseTime func ParseTime(text string) (t time.Time, err error) ParseTime 尝试HTTP/1.1 支持的三种格式 TimeFormat、time.RFC850、time.ANSIC 的每一种来分解时 间头(例如 Date: header)。 funcfuncfuncfunc ProxyFromEnvironmentProxyFromEnvironmentProxyFromEnvironmentProxyFromEnvironment func ProxyFromEnvironment(req *Request) (*url.URL, error) ProxyFromEnvironment 根据环境变量$HTTP_PROXY 和$NO_PROXY (或$http_proxy 和$no_proxy)返 回给定 request 的代理 url。如果全局代理非法会返回错误。如果环境没有设置代理或者设置的代理不能用 于给出的 request 则返回空(nil)url 和空错误码。 funcfuncfuncfunc ProxyURLProxyURLProxyURLProxyURL func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL, error) ProxyURL 返回一个代理函数,这个代理函数(一般在 Transport 中使用)接受请求,并总是返回一个(代 理后的)地址。 funcfuncfuncfunc RedirectRedirectRedirectRedirect func Redirect(w ResponseWriter, r *Request, urlStr string, code int) Redirect 返回request 一个与请求地址有关的重定向地址。 funcfuncfuncfunc ServeServeServeServe func Serve(l net.Listener, handler Handler) error Serve 接受Listener l接收到的 HTTP 连接,并为每个连接创建一个新的线程。服务线程会读取每一个请求, 调用handler 做出回应。Handler 参数一般是 nil,此时使用 DefaultServeMux。 funcfuncfuncfunc ServeContentServeContentServeContentServeContent func ServeContent(w ResponseWriter, req *Request, name string, modtime time.Time, content io.ReadSeeker) ServeContent 使用提供的 ReadSeeker 的内容反馈给请求。本函数相对 io.Copy 的主要优点是它可以较好 的操作随机请求、设定 MIME 类型,操作 If-Modified-Since 请求。 如果reponse 的header 的内容类型行未设定,本函数首先尝试从 name 的文件扩展名进行推断,如果失败 则读取 ReadSeeker 的第一数据段发送给 DetectContentType 函数判断。此外name 参数是无用的,特定 情况下它可以是空的并且从不会加入 reponse 中。 如果 modtime 参数非零,ServeContent会在 response 的 header 中包含一个包含该参数的 Last-Modified 行。如果request 的header 包含If-Modified-Since 行,ServeContent 使用modtime 参数来确定使用应 该发送全部内容。 content 参数的 Seek 方法必须有效:ServeContent 通过移位到结尾来确定 content 的大小。 如果呼叫者设定了 w's ETag header,ServeContent 将通过它,使用If-Range 和If-None-Match(header 中的参数行)来处理 request。 注意:os.File 包实现了 io.ReadSeeker 接口。 funcfuncfuncfunc ServeFileServeFileServeFileServeFile func ServeFile(w ResponseWriter, r *Request, name string) ServeFile 对请求返回 name 参数指定的文件的内容。 funcfuncfuncfunc SetCookieSetCookieSetCookieSetCookie func SetCookie(w ResponseWriter, cookie *Cookie) SetCookie 给提供的 ResponseWeriter 的头部添加 cookie。 funcfuncfuncfunc StatusTextStatusTextStatusTextStatusText func StatusText(code int) string StatusText 返回HTTP 状态码的文本信息,如果状态码未知返回空字符串。 typetypetypetype ClientClientClientClient type Client struct { // Transport 指定某个具体的 HTTP request 的构成机理。如果是 nil,则使用 DefaultTransport。 Transport RoundTripper // CheckRedirect 指定处理重定向的对策 // 如果CheckRedirect 存在,client 会在接受 HTTP 重定向之前呼叫它。参数 req 和via 分别为新建 和已有的 request,先进先出。 // 如果CheckRedirect 返回一个错误,Client 的Get 方法将同时返回之前的 Response 和 CheckRedirect 的错误(隶属于 url.Error)而不会产生 Request 请求。 // // 如果CheckRedirect 是nil,客户端将使用默认对策:按照返回数据尝试最多 10次重定向后放弃。 CheckRedirect func(req *Request, via []*Request) error // Jar 指定cookie jar。如果 Jar 是nil,则cookies 在request 中不发送,在 response 中被忽略。 Jar CookieJar } Client 是HTTP 客户端。它的零值(DefaultClient)是一个可用的使用 DefaultTransport 的客户端。 Client 的Transport 成员变量包含内部状态(缓存的 TCP 连接),所以Client 应该尽量重用,而不是为每 一个需求都建立一个。Client 可以安全地进行多线程的并发。 funcfuncfuncfunc (*Client)(*Client)(*Client)(*Client) DoDoDoDo func (c *Client) Do(req *Request) (resp *Response, err error) Do 发送一个 HTTP request 并返回一个 HTTP response,遵守 client 对象设定好的对策(redirect、cookie、 auth 等)。 如果client 对策出现错误或者有 HTTP 协议错误,将返回一个错误。一个non-2xx response 不会引起错误。 如果返回值 err 是nil,返回值 resp.Body 总是非空的。 呼叫者应该关闭返回值 resp 的Body(在读取完 resp.Body 后)。如果 resp.Body 没有关闭,Client 隐藏 的RoundTripper(基本就是指 Transport)可能无法重用与 server 的持久 TCP 连接来执行随后的 "keep-alive"请求。 一般我们应该使用 Get、Post 或PostForm 代替Do。 funcfuncfuncfunc (*Client)(*Client)(*Client)(*Client) GetGetGetGet func (c *Client) Get(url string) (resp *Response, err error) Get 产生对特定 url 的一个 GET。如果 respons 是下面中的任一个重定向状态码,Get 在调用 CheckRedirect 函数后接受状态码的反馈访问新的地址。 301 (Moved Permanently) //永久移动 302 (Found) //发现 303 (See Other) //尝试另一个 307 (Temporary Redirect) //临时重定向 如果Client的CheckRedirect函数失败或者存在HTTP 协议错误,将返回一个错误。一个non-2xx response 不会引起错误。 如果没有错误,返回值 resp 的Body 总是非空的。呼叫者应该关闭返回值 resp 的Body(在读取完毕 resp.Body 后)。 funcfuncfuncfunc (*Client)(*Client)(*Client)(*Client) HeadHeadHeadHead func (c *Client) Head(url string) (resp *Response, err error) Head 产生特定地址的一个 HEAD。如果 respons 是下面中的任一个重定向状态码,Head 在调用 CheckRedirect 函数后接受状态码的反馈访问新的地址。 301 (Moved Permanently) //永久移动 302 (Found) //发现 303 (See Other) //尝试另一个 307 (Temporary Redirect) //临时重定向 funcfuncfuncfunc (*Client)(*Client)(*Client)(*Client) PostPostPostPost func (c *Client) Post(url string, bodyType string, body io.Reader) (resp *Response, err error) Post 产生对特定 url 的一个 POST。呼叫者应该关闭返回值 resp 的Body(在读取完 resp.Body 后)。 funcfuncfuncfunc (*Client)(*Client)(*Client)(*Client) PostFormPostFormPostFormPostForm func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error) PostForm 产生特定 url 的一个 POST,使用 data 参数的 key 和 value 经 urlencoded 后作为 request body。 如果返回值 err 是nil,返回值 resp.Body 总是非空的。呼叫者应该关闭返回值 resp 的Body(在读取完 resp.Body 后)。 typetypetypetype CookieCookieCookieCookie 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 cookie,用来填写 request 的Cookie header 和response 的Set-Cookie header。 funcfuncfuncfunc (*Cookie)(*Cookie)(*Cookie)(*Cookie) StringStringStringString func (c *Cookie) String() string 函数返回 cookie 的序列串用在 request 的Cookie header(如果只设定了 Name 和Value)和response 的Set-Cookie header(如果其他字段已设定)。 typetypetypetype CookieJarCookieJarCookieJarCookieJar type CookieJar interface { // SetCookies 函数处理给定 url 的response 中的cookie。 // 它可能(会/不会)选择保存 cookie,这是有 jar 的对策和实现决定的。 SetCookies(u *url.URL, cookies []*Cookie) // Cookies 函数返回给定 url 的request 的cookies。 // 它是符合标准的、RFC 6265 限定的 cookie 的实现。 Cookies(u *url.URL) []*Cookie } CookieJar 对象管理 HTTP request 的cookies 的保存和使用。 CookieJar 的实现必须是多线程并发安全的。 typetypetypetype DirDirDirDir type Dir string Dir 使用限定到某个特定目录数的本地文件系统实现 http.FileSystem。 using the native file system restricted to a specific directory tree. 空Dir 被视为"."。 funcfuncfuncfunc (Dir)(Dir)(Dir)(Dir) OpenOpenOpenOpen func (d Dir) Open(name string) (File, error) 利用name 参数打开目录下某个文件。 typetypetypetype FileFileFileFile type File interface { Close() error Stat() (os.FileInfo, error) Readdir(count int) ([]os.FileInfo, error) Read([]byte) (int, error) Seek(offset int64, whence int) (int64, error) } File 由一个 FileSystem 的Open 方法返回,接受 FileServer 的实现提供的服务。 typetypetypetype FileSystemFileSystemFileSystemFileSystem type FileSystem interface { Open(name string) (File, error) } FileSystem 接口实现对一系列类文件对象的访问。文件路径用反斜杠('/', U+002F)分割,与本地操作系统的 约定无关。 typetypetypetype FlusherFlusherFlusherFlusher type Flusher interface { // Flush 方法将缓存中的任何数据都发送到客户端(并清空缓存) Flush() } ResponseWriter 利用Flusher 接口以允许 HTTP handler 刷新缓存到客户端。 注意:即使ResponseWriter 接口支持 Flush 方法,如果客户端是通过 HTTP 代理连接的,缓存数据仍可能 直到response 完成才会抵达客户端。 typetypetypetype HandlerHandlerHandlerHandler type Handler interface { ServeHTTP(ResponseWriter, *Request) } 实现了 Handler 接口的对象可以注册到 HTTP 服务端,为某个路径或者子树提供服务。 ServeHTTP 应该向 ResponseWriter 中写入 headers 和data 之后返回。返回标志着 request 已经结束, HTTP 服务端可以转向下一个连接的 request 上。 funcfuncfuncfunc FileServerFileServerFileServerFileServer func FileServer(root FileSystem) Handler FileServer 返回一个 handler,它包含 root 指定的文件的内容,并可为 HTTP request 提供服务。 如果要使用操作系统约定的文件路径字符串实现函数的话,要使用 http.Dir: http.Handle("/", http.FileServer(http.Dir("/tmp"))) http.Dir 的作用就是将操作系统约定的字符串路径转化为 FileSystem 接口类型。 funcfuncfuncfunc NotFoundHandlerNotFoundHandlerNotFoundHandlerNotFoundHandler func NotFoundHandler() Handler NotFoundHandler 返回一个简单的 request handler,这个handler 对所有的 request 都回应“404 page not found”。 funcfuncfuncfunc RedirectHandlerRedirectHandlerRedirectHandlerRedirectHandler func RedirectHandler(url string, code int) Handler RedirectHandler 返回一个 request handler,该handler 给每一个它收到的 request 返回code 作为状态 码和url 作为重定向路径。 funcfuncfuncfunc StripPrefixStripPrefixStripPrefixStripPrefix func StripPrefix(prefix string, h Handler) Handler StripPrefix 返回一个 handler,该handler 去掉request 的url 的前缀并交由 handler h处理。StripPrefix 对于url 路径没有前缀的 request 会返回一个 HTTP 404 not found error。 funcfuncfuncfunc TimeoutHandlerTimeoutHandlerTimeoutHandlerTimeoutHandler func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler TimeoutHandler 返回一个在给定时间限制内运行 handler h的handler。 新的Handler 调用h.ServeHTTP 来处理每一个 request,但如果某次调用运行时间超过限制 1 ns(纳秒), 这个handler 就将响应一个 503 Service Unavailable error 并在错误 body 中给出信息。(如果msg 是空 字符串,将会发送一个默认的合适的信息。)在超时后,h在它的 ResponseWriter 中写入操作将返回 ErrHandlerTimeout(错误码)。 typetypetypetype HandlerFuncHandlerFuncHandlerFuncHandlerFunc type HandlerFunc func(ResponseWriter, *Request) The HandlerFunc 类型是一个适配器,以便接受普通的函数作为 HTTP handler。如果f是一个有着对应参 数表的函数,那么 HandlerFunc(f)就是一个叫做 f的Handler 对象。 funcfuncfuncfunc (HandlerFunc)(HandlerFunc)(HandlerFunc)(HandlerFunc) ServeHTTPServeHTTPServeHTTPServeHTTP func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) ServeHTTP 方法就是为了实现 Handler 接口定义的,其实就是调用 f(w, r)。 typetypetypetype HeaderHeaderHeaderHeader type Header map[string][]string Header 是字符串->字符串的 map(即python 的dict),表示 HTTP header 的键值对。 funcfuncfuncfunc (Header)(Header)(Header)(Header) AddAddAddAdd func (h Header) Add(key, value string) Add 方法给 header 添加键值对。对已有的键值对,它直接在值的后面添加新的值(逗号隔开)。 funcfuncfuncfunc (Header)(Header)(Header)(Header) DelDelDelDel func (h Header) Del(key string) Del 方法删除键值对。 funcfuncfuncfunc (Header)(Header)(Header)(Header) GetGetGetGet func (h Header) Get(key string) string Get 获得第一个与给定 key 关联的 value。如果没有值与给定的键关联,Get 返回""。如果要访问一个键对 应的多个值,应直接使用 CanonicalHeaderKey 访问该 map。 funcfuncfuncfunc (Header)(Header)(Header)(Header) SetSetSetSet func (h Header) Set(key, value string) Set 方法设定 header 与key 关联的条目为单个元素值。它会替换任何已有键值对中的值(如果键匹配)。 funcfuncfuncfunc (Header)(Header)(Header)(Header) WriteWriteWriteWrite func (h Header) Write(w io.Writer) error Write 方法以数据传输格式输出一个 header。 funcfuncfuncfunc (Header)(Header)(Header)(Header) WriteSubsetWriteSubsetWriteSubsetWriteSubset func (h Header) WriteSubset(w io.Writer, exclude map[string]bool) error WriteSubset 方法以数据传输格式输出一个 header。exclude 非空的话,凡是 exclude[key]为真的键值对 都不会写入。 typetypetypetype HijackerHijackerHijackerHijacker type Hijacker interface { // Hijack 允许调用者接管连接。 // 在调用 Hijack()后,HTTP 服务端的程序库将不能再对这个连接做任何操作。 // 管理和关闭连接变成了调用者的任务。 Hijack() (net.Conn, *bufio.ReadWriter, error) } ResponseWriter 利用Hijacker 接口以便允许一个 HTTP handler 接管连接。 typetypetypetype ProtocolErrorProtocolErrorProtocolErrorProtocolError type ProtocolError struct { ErrorString string } HTTP request 解析错误。 funcfuncfuncfunc (*ProtocolError)(*ProtocolError)(*ProtocolError)(*ProtocolError) ErrorErrorErrorError func (err *ProtocolError) Error() string 返回错误信息 typetypetypetype RequestRequestRequestRequest type Request struct { //GET,POST,PUT, 等等 Method string URL*url.URL // 接收的 request 的协议版本。 // 对外的 request 总是使用 HTTP/1.1。 Proto string //"HTTP/1.0" ProtoMajor int // 1 ProtoMinor int // 0 // request 项目和它们的值的 header 映射表。 // 如果header 是 // 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 names 是区分大小写的。 // request 解析器在标准化(首字母和连字符后第一个字母大写,其余小写)name 后才执行。 Header Header // 消息体。 Body io.ReadCloser // ContentLength 记录了内容的长度。值为-1 代表长度未知,值>=0 时代表可以从 Body 里读取的字 节数。 // 对向外的 request,如果 Body 不为空而该值为 0表示Body 长度未知。 ContentLength int64 // TransferEncoding 列举了从外侧到最里侧的转换编码。空表代表同一种编码。 // TransferEncoding 通常被忽略;当收发 request 时,大多数编码工作都会根据需要自动添加或删除。 TransferEncoding []string // Close 表示是否在相应这个请求后关闭连接。 Close bool // 该url 被发现的主机地址。The host on which the URL is sought. // 根据RFC 2616,它要么是 Host: header 的值,要么是 url 中自己提供的 host name。 Host string // Form 包含解析好的表单数据,包括 URL 字段的询问参数和 POST 或PUT 的表单数据。 // 这个参数只有在调用 ParseForm 后才有效。 // HTTP 客户端忽略 Form 并用Body 代替之。 Form url.Values // Form 包含解析好的 POST 或PUT 的表单数据。 // 这个参数只有在调用 ParseForm 后才有效。 // HTTP 客户端忽略 Form 并用Body 代替之。 PostForm url.Values // MultipartForm 包含解析好的包含多部分的表单数据,还包括文件上传目录。 // 这个参数只有在调用 ParseMultipartForm 后才有效。 // HTTP 客户端忽略 MultipartForm 并用Body 代替之。 MultipartForm *multipart.Form // Trailer 以轨迹为键映射到值。和 Header 一样,如果同一个键有多个值,则新值会串联到旧值的后 面并用逗号隔开。 // 对服务端的 request,Trailer 只有在 Body 读取完毕或者关闭后才增加。 // Trailer 支持还不完善。 Trailer Header // RemoteAddr 允许HTTP 服务端和其它软件记录发送 request 的主机的网络地址,一般用来记录。 // ReadRequest 方法不填写这个参数(Go习惯叫做字段/field),它也没有约定格式。 // 这个包里,HTTP 服务端会在调用 handler 之前将 RemoteAddr 设置为"IP:port"。 // HTTP 客户端会忽略此参数。 RemoteAddr string // RequestURI 是未修改的 Request-URI(统一资源定位符),该参数是客户端发向服务端时根据(RFC 2616, Section 5.1)填写在 Request header line 里的。 // 通常应该用 URL 字段代替它使用。 // 在HTTP 客户端的 request 中设置它是错误的做法。 RequestURI string // TLS 允许HTTP 服务端和其它软件记录接收到 request 的各个 TLS(安全传输层协议)连接的信息。 // ReadRequest 方法不填写这个参数。 // 本包中,HTTP 服务端在调用 handler 之前设置这个字段为可用的 TLS 连接,否则它不会操作该字 段。 // HTTP 客户端会忽略此参数。 TLS*tls.ConnectionState } Request 代表一个服务端接受到的或者客户端发送出去的 HTTP 请求。 funcfuncfuncfunc NewRequestNewRequestNewRequestNewRequest func NewRequest(method, urlStr string, body io.Reader) (*Request, error) NewRequest 利用给出的 method、urlStr 参数和可选的 body 参数返回一个新的 Request。 funcfuncfuncfunc ReadRequestReadRequestReadRequestReadRequest func ReadRequest(b *bufio.Reader) (req *Request, err error) ReadRequest 从b中读取并解析得到一个 request。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) AddCookieAddCookieAddCookieAddCookie func (r *Request) AddCookie(c *Cookie) AddCookie 给request 添加一个 cookie。按照 RFC 6265 section 5.4, AddCookie 方法不会附加多个 Cookie header 参数,这表示所有的 cookie 是写在同一行里,用分号隔开。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) CookieCookieCookieCookie func (r *Request) Cookie(name string) (*Cookie, error) Cookie 返回request 中name 指明的 cookie,如果木有则抛出一个 ErrNoCookie(错误)。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) CookiesCookiesCookiesCookies func (r *Request) Cookies() []*Cookie Cookies 方法解析并返回 request 中所有的 cookie。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) FormFileFormFileFormFileFormFile func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error) FormFile 返回提供的以 key 为键的表单中的第一个文件,如果需要本函数会调用 ParseMultipartForm 和 ParseForm。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) FormValueFormValueFormValueFormValue func (r *Request) FormValue(key string) string FormValue 返回key 为键查询得到结果中的第一个值。POST 和PUT body 中的参数优先于 URL 查询字符 串。如果需要本函数会调用 ParseMultipartForm 和ParseForm。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) MultipartReaderMultipartReaderMultipartReaderMultipartReader func (r *Request) MultipartReader() (*multipart.Reader, error) 如果request 多部分的(multipart)或者是 POST 表单-数据的,MultipartReader 返回一个 MIME(多用 途互联网邮件扩展)复合阅读器;否则返回一个 nil 和一个错误。使用这个函数代替 ParseMultipartForm 以便将 request body 当作文件流处理。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) ParseFormParseFormParseFormParseForm func (r *Request) ParseForm() (err error) ParseForm 从URL 解析原始的询问组。 对于POST 或PUT 型request,它还会将 body 当作表单作解析。POST 和PUT 的body 中的参数优先于 URL 查询字符串的值。 如果request 的Body 的大小没有被 MaxBytesReader 设定,该大小默认为 10MB。 ParseMultipartForm 会自动调用 ParseForm,它不会改变资源的状态(因此是安全的)。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) ParseMultipartFormParseMultipartFormParseMultipartFormParseMultipartForm func (r *Request) ParseMultipartForm(maxMemory int64) error ParseMultipartForm 解析多组件的 request 或者form-data 型的request。整个request 的body 都会被 解析直到总共解析了文件部分 maxMemery 个字节(或到结尾)并将结果存入内存,其余部分保存在硬盘的 temp 文件里。如果需要 ParseMultipartForm 会自行调用 ParseForm。调用完 ParseMultipartForm,后 续的各种方法的调用不受影响。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) PostFormValuePostFormValuePostFormValuePostFormValue func (r *Request) PostFormValue(key string) string PostFormValue 返回key 为键查询得到 POST 和PUT 型request 的body 中的对应结果串中的第一个值。 忽略URL 查询参量。如果需要本函数会调用 ParseMultipartForm 和ParseForm。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) ProtoAtLeastProtoAtLeastProtoAtLeastProtoAtLeast func (r *Request) ProtoAtLeast(major, minor int) bool ProtoAtLeast 返回request 使用的协议是否不低于 major.minor 指定的版本。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) RefererRefererRefererReferer func (r *Request) Referer() string Referer 返回一个表示引用的 URL,如果 request 里有的话。 request 中的Referer 是拼错的,这是HTTP 最早期时犯的错误。这个值也可以通过 map 类型变量 Header 的操作 Header ["Referer"]来取得;使用方法的好处是编译器可以诊断使用正确拼法的程序调用 req.Referrer(),但却不能诊断使用 Header["Referrer"]的程序。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) SetBasicAuthSetBasicAuthSetBasicAuthSetBasicAuth func (r *Request) SetBasicAuth(username, password string) SetBasicAuth 设置request 的Authorization header,以便使用 username、password 两个参数调用 HTTP Basic Authentication。 HTTP Basic Authentication 不会加密用户名和密码。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) UserAgentUserAgentUserAgentUserAgent func (r *Request) UserAgent() string UserAgent 返回客户端的 User-Agent,如果曾写入 request。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) WriteWriteWriteWrite func (r *Request) Write(w io.Writer) error Write 方法以数据传输格式写入一个 HTTP/1.1 request——包括header 和body——。这个方法会参考 request 的如下字段的值。 Host URL Method (defaults to "GET") Header ContentLength TransferEncoding Body 如果Body 存在,Content-Length <= 0且TransferEncoding 为设定为"identity"(同一的),Write 方法 会添加"Transfer-Encoding: chunked"到header。request 的Body 会在它写入数据后关闭。 funcfuncfuncfunc (*Request)(*Request)(*Request)(*Request) WriteProxyWriteProxyWriteProxyWriteProxy func (r *Request) WriteProxy(w io.Writer) error WriteProxy 类似Write,但在形式上期望写入一个 HTTP 代理接入的 request。特别注意,WriteProxy 会 在request 的Request-URI header line 按照section 5.1.2 of RFC 2616 写入一个绝对的 URI,包括组合 和地址;有时还会使用 r.Host 或r.URL.Host 写入request 的Host header 项。 typetypetypetype ResponseResponseResponseResponse type Response struct { Status string // 例如 "200 OK" StatusCode int // 例如 200 Proto string // 例如 "HTTP/1.0" ProtoMajor int // 例如 1 ProtoMinor int // 例如 0 // Header 关联header 中的键和值。如果 response 的header 里同一个键对应多个值的话,它们会 用逗号分割串联起来。 //(按Section 4.2 of RFC 2616 的要求,多个并列的 header 在语义上等价于逗号隔开的串联字符串。) // 结构体中其它字段保存的信息不会重复出现在 Header 里。 // 关联中的键字符串都是标准化了的(参见函数 CanonicalHeaderKey)。 Header Header // Body 代表response 的body。 // Client 和Transport 保证Body 始终是非空的,即使服务端的反应中没有输出 body 或者body 长度 设为0; Body io.ReadCloser // ContentLength 记录了相应内容的长度。值为-1 代表长度未知。 // 除非RequestMethod 是"HEAD",值>=0 代表着可以从 Body 读取的长度。 ContentLength int64 // 本字段保管着从最外侧到最里侧的编码格式,值为 nil 代表使用同一种编码。 TransferEncoding []string // Close 记录header 是否在读取完 Body 后关闭连接。 // 这个值是对客户端的建议,而非 ReadResponse 或Response。 // 在关闭连接后才填写。 Close bool // Trailer 以轨迹为键映射到值,和 Request 的Trailer 的行为相同。 // 和Header 一个格式。 Trailer Header // Request 就是被发送来接收此 Response 的那个 request。 // Request 的Body 是nil(因为已经被读取了) // 它只会因为 Client 的request 而被填写。 Request *Request } Response 代表对一个 HTTP request 的反应。 funcfuncfuncfunc GetGetGetGet func Get(url string) (resp *Response, err error) Get 向某个 url 发出一个 GET。如果回应是以下的重定向代码,Get 接受重定向,最多可重定向 10次: 301 (Moved Permanently) //永久转移 302 (Found) //发现 303 (See Other) //尝试另一个 307 (Temporary Redirect) //临时重定向 如果重定向过多或者 HTTP 协议存在错误,Get 方法将返回一个错误。一个non-2xx response 不会导致错 误。 如果返回者 err 是nil,返回值 resp 总是包含一个非空的 resp.Body。调用者应该在读取 resp.Body 之后关 闭它。 Get 是对DefaultClient.Get 的一个包装。 funcfuncfuncfunc HeadHeadHeadHead func Head(url string) (resp *Response, err error) Head 向某个 url 发出一个 HEAD。如果回应是以下的重定向代码,Head 会在调用 Client 的CheckRedirect 函数后接受重定向。 301 (Moved Permanently) //永久转移 302 (Found) //发现 303 (See Other) //尝试另一个 307 (Temporary Redirect) //临时重定向 Head 是对DefaultClient.Head 的一个包装。 funcfuncfuncfunc PostPostPostPost func Post(url string, bodyType string, body io.Reader) (resp *Response, err error) Post 向某个 url 发出一个 POST。 调用者在读取完毕后应该关闭返回值 resp 的Body。 Post 是对DefaultClient.Post 的一个包装。 funcfuncfuncfunc PostFormPostFormPostFormPostForm func PostForm(url string, data url.Values) (resp *Response, err error) PostForm 向特定 url 发出一个 POST,使用 data 中的键值对编码后作为 request 的body。 如果返回者 err 是nil,返回值 resp 总是包含一个非空的 resp.Body。调用者应该在读取 resp.Body 之后关 闭它。 PostForm 是对DefaultClient.PostForm 的一个包装。 funcfuncfuncfunc ReadResponseReadResponseReadResponseReadResponse func ReadResponse(r *bufio.Reader, req *Request) (resp *Response, err error) ReadResponse 从r读取并返回一个 HTTP response。Req 参数指定的 Request 与返回的 Response 捆绑 在一起。Client 必须在读取完 resp.Body 后调用 resp.Body.Close。 调用本函数后,客户端可以检查 resp.Trailer 以获取回应轨迹中包含的键值对。 funcfuncfuncfunc (*Response)(*Response)(*Response)(*Response) CookiesCookiesCookiesCookies func (r *Response) Cookies() []*Cookie Cookies 方法接卸并返回 Set-Cookie header 中的cookies。 funcfuncfuncfunc (*Response)(*Response)(*Response)(*Response) LocationLocationLocationLocation func (r *Response) Location() (*url.URL, error) 如果存在的话,Location 返回response 的Location header 的值(一个url)。相对重定向会参考 Response 的Request 参数解决。 如果没有 Location header 会返回 ErrNoLocation(错误)。 funcfuncfuncfunc (*Response)(*Response)(*Response)(*Response) ProtoAtLeastProtoAtLeastProtoAtLeastProtoAtLeast func (r *Response) ProtoAtLeast(major, minor int) bool ProtoAtLeast 返回response 使用版本是否不低于 major.minor 指定的版本。 funcfuncfuncfunc (*Response)(*Response)(*Response)(*Response) WriteWriteWriteWrite func (r *Response) Write(w io.Writer) error Write 方法以数据传输格式填写 response(header、body、trailer)。这个方法会参考 reponse 中以下字段 的数据: StatusCode ProtoMajor ProtoMinor RequestMethod TransferEncoding Trailer Body ContentLength Header, values for non-canonical keys will have unpredictable behavior // 未标准化的键的值可能导 致不可预料的行为! typetypetypetype ResponseWriterResponseWriterResponseWriterResponseWriter // ResponseWriter 接口被 HTTP handler 用来实现一个 HTTP 的反应行为。 type ResponseWriter interface { // Header 返回一个可由 WriteHeader 发送的 header map(可理解为字典?)。 // 在WriteHeader 或者Write 执行之后修改 header 是无效的。 Header() Header // Write 在连接中写入数据,作为 HTTP 回复的一部分。 writes the data to the connection as part of an HTTP reply. // 如果WriteHeader 没有被调用,则 Write 会在写入数据之前调用 WriteHeader(http.StatusOK)。 // 如果Header 里没有 Content-Type 行,Write 函数会根据 DetectContentType 函数返回的结果加 入Content-Type 行。 Write([]byte) (int, error) // WriteHeader 发送HTTP 反应头以及状态码。 // 如果WriteHeader 没有被显式调用,则第一次调用 Write 时,会触发一次 WriteHeader(http.StatusOK)的隐式调用。 // WriteHeader 的显式调用主要用来发送错误码。 WriteHeader(int) } ResponseWriter 接口被 HTTPhandler 使用来构建 HTTP response。 typetypetypetype RoundTripperRoundTripperRoundTripperRoundTripper type RoundTripper interface { // RoundTrip 只执行一个单纯的 HTTP 事务,对 request 返回一个 Response。 // RoundTrip 不应该试图影响这个 response。 // 强调一下,如果 RoundTrip 获得了一个 response,则不管 response 的HTTP 状态码如何,它都 应该返回值 err 都应为 nil。 // 非nil 的err 返回值只用在该函数未得到 response 时。 // 类似的,RoundTrip 不应该尝试处理高级协议细节,比如重定向(redirect)、身份认证 (authentication)、cookie。 // RoundTrip 不应修改 request,除了读取 Body。 // request 的URL 和Header 字段被期望为设定好的。 RoundTrip(*Request) (*Response, error) } RoundTripper 是一个接口,它被用来实现执行单个 HTTP 反应的功能,从给定的 Request 产生一个 Response。 RoundTripper 必须是多线程并发安全的。 var DefaultTransport RoundTripper = &Transport{Proxy: ProxyFromEnvironment} DefaultTransport 是一个默认的、被 DefaultClient 使用的 Transport 的实现。 它为每一个调用建立一个新的网络连接,使用环境变量$HTTP_PROXY 和$NO_PROXY (或$http_proxy 和 $no_proxy)指定的 HTTP 代理。 funcfuncfuncfunc NewFileTransportNewFileTransportNewFileTransportNewFileTransport func NewFileTransport(fs FileSystem) RoundTripper NewFileTransport 使用提供的 fs 参数返回一个新的 RoundTripper。返回的 RoundTripper 忽略它的传入 request 的url 主机地址以及其它大部分属性。 本函数的典型用法是注册一个"file"协议的 Transport,如下: t := &http.Transport{} t.RegisterProtocol("file", http.NewFileTransport(http.Dir("/"))) c := &http.Client{Transport: t} res, err := c.Get("file:///etc/passwd") ... typetypetypetype ServeMuxServeMuxServeMuxServeMux type ServeMux struct { // 包含隐藏、不可见的字段 } ServeMux 是一个 HTTP request 的多路分流器。它会检查接收的每一个 request 的url 和所有注册的模式 的列表,调用最匹配 url 的模式对应的 handler。 Pattern 是指代从根部开始的确且路径或者子目录树(注意末尾反斜杠)。 长patterns 优先于短 patterns,所以如果"/images/"和"/images/thumbnails/"都注册了 handler, "/images/thumbnails/"开始的 path 都将调用后面的 handler,而"/images/"下其它的 path 都将调用前面 的handler。 Patterns 可能会以一个 host 名开始,这时将只匹配该 host 上的url。Host 限定的 pattern 优先于一般的 pattern。这样可以为"/codesearch"和"codesearch.google.com/"两个pattern 注册同一个 handler,而 不会接管请求"http://www.google.com/"的request。 ServeMux 也会注意处理 URL request path,重定向任何包含"."或".."元素的 request 到等价的含有".-"或 "..-free"的URL。 funcfuncfuncfunc NewServeMuxNewServeMuxNewServeMuxNewServeMux func NewServeMux() *ServeMux NewServeMux 申请并返回一个新的 ServeMux。 funcfuncfuncfunc (*ServeMux)(*ServeMux)(*ServeMux)(*ServeMux) HandleHandleHandleHandle func (mux *ServeMux) Handle(pattern string, handler Handler) Handle 对给定 pattern 注册一个 handler。如果该 pattern 已经有了一个 handler,将导致恐慌(panic)。 funcfuncfuncfunc (*ServeMux)(*ServeMux)(*ServeMux)(*ServeMux) HandleFuncHandleFuncHandleFuncHandleFunc func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) HandleFunc 对给定 pattern 注册一个 handler 函数。 funcfuncfuncfunc (*ServeMux)(*ServeMux)(*ServeMux)(*ServeMux) HandlerHandlerHandlerHandler func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string) Handler 返回应用于给定 request 的handler,它会参考 r.Method、r.Host 和r.URL.Path。本方法总是返 回一个非空的 handler。如果 path 标准格式不是,返回的 handler 会是一个内部生成的重定向到标准化 path 的handler。 Handler 也返回匹配 request 的注册的 pattern,在内部生成的重定向中,pattern 将在重定向后再作匹配。 如果没有注册应用于该 request 的handler,则Handler 方法返回一个"page not found"的handler 和一 个pattern。 funcfuncfuncfunc (*ServeMux)(*ServeMux)(*ServeMux)(*ServeMux) ServeHTTPServeHTTPServeHTTPServeHTTP func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request) ServeHTTP 方法会将 request 分发给予 request URL 最匹配的 pattern 对应的 handler。 typetypetypetype ServerServerServerServer type Server struct { Addr string // 监听的 TCP 地址,如果是空的则为":http" Handler Handler // 保存供调用的 handler,如果为 nil 则使用 http.DefaultServeMux ReadTimeout time.Duration // 读取request 的最大持续时间 WriteTimeout time.Duration // 写入response 的最大持续时间 MaxHeaderBytes int // request headers 的最大长度,如果为 0则使用 DefaultMaxHeaderBytes TLSConfig *tls.Config // 可选的 TLS(安全传输层协议)设置,供ListenAndServeTLS 方法 使用 } Server 定义了运行 HTTP 服务端所需的参数。 funcfuncfuncfunc (*Server)(*Server)(*Server)(*Server) ListenAndServeListenAndServeListenAndServeListenAndServe func (srv *Server) ListenAndServe() error ListenAndServe 监视srv.Addr 指定的 TCP 地址,调用 Serve 方法去处理接收的连接的 request。如果 srv.Addr 是空的,则使用":http"。 funcfuncfuncfunc (*Server)(*Server)(*Server)(*Server) ListenAndServeTLSListenAndServeTLSListenAndServeTLSListenAndServeTLS func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error ListenAndServeTLS 监视srv.Addr 指定的 TCP 地址,调用Serve 方法去处理接收的 TLS 连接的 request。 需要提供证书的文件名和匹配私钥的文件名。如果证书是权威认证机构签发,certFile 参数必须串联 CA 证 书和服务端证书。 如果srv.Addr 是空的,则使用":http"。 funcfuncfuncfunc (*Server)(*Server)(*Server)(*Server) ServeServeServeServe func (srv *Server) Serve(l net.Listener) error Serve 接受Listener 类型的 l参数接收到的每一个连接,并各创建一个新的服务进程。服务进程读取 request 然后调用 srv.Handler 回应它们。 typetypetypetype TransportTransportTransportTransport type Transport struct { // Proxy 指定一个函数,该函数对给出的 request 返回一个代理。 specifies a function to return a proxy for a given // 如果该函数返回一个非空的 err,则request 将被该错误中止。 // 如果Proxy 为nil 或者返回一个 nil 的*URL,将不会使用代理。 Proxy func(*Request) (*url.URL, error) // Dial 方法指定一个拨号建立 TCP 连接的函数。如果 Dial 为nil,则使用 net.Dial。 Dial func(net, addr string) (c net.Conn, err error) // TLSClientConfig 指定TLS 配置共 tls.Client 使用。 // 如果为空,则使用默认配置。 TLSClientConfig *tls.Config // 则两个参数用于 keep-alive 属性和 compression 属性 DisableKeepAlives bool DisableCompression bool // MaxIdleConnsPerHost 如果不为零,设定每个主机可以保持的最大闲置连接数量;如果为零,则使 用DefaultMaxIdleConnsPerHost。 MaxIdleConnsPerHost int // 其它隐藏、不可见的字段 } Transport 是RoundTripper 的一个实现,支持http、https 和http proxies(包括http 和https 的代理)。 Transport 也可以为之后的重用缓存连接。 funcfuncfuncfunc (*Transport)(*Transport)(*Transport)(*Transport) CloseIdleConnectionsCloseIdleConnectionsCloseIdleConnectionsCloseIdleConnections func (t *Transport) CloseIdleConnections() CloseIdleConnections 关闭任何之前的 request 建立但因为"keep-alive"属性保持占用闲置连接数的连接。 它不会影响任何正在使用的连接。 funcfuncfuncfunc (*Transport)(*Transport)(*Transport)(*Transport) RegisterProtocolRegisterProtocolRegisterProtocolRegisterProtocol func (t *Transport) RegisterProtocol(scheme string, rt RoundTripper) RegisterProtocol 注册新的 scheme 参数表示的协议。Transport 将把使用给定协议的 request 传递给 rt 参数。模拟 HTTP request 语义是 rt的任务。 RegisterProtocol 可以被其他包用于提供 ftp 或者file 协议的实现。 funcfuncfuncfunc (*Transport)(*Transport)(*Transport)(*Transport) RoundTripRoundTripRoundTripRoundTrip func (t *Transport) RoundTrip(req *Request) (resp *Response, err error) RoundTrip 用来实现 RoundTripper 接口。 子包 名字 概要 cgi cgi 包实现了 RFC3875 中描述的 CGI(公共网关接口, Common Gateway Interface) fcgi fcgi 包实现了 FastCGI 协议。 httptest httptest 包提供了 HTTP 测试的一些实用工具。 httputil httputil 包提供了一些实用的 HTTP 函数,实现了 net/http 包中(功能)的更普遍版本。 pprof pprof 包利用它自己的 HTTP 服务台(server)提供符合 pprof 可视化工具所需格式的运行时性 能分析数据。
还剩20页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

dft567

贡献于2012-10-07

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf