package http
import "net/http"
http包提供了HTTP客户端和服务端的实现。
Get、Head、Post和PostForm函数发出HTTP/ HTTPS请求。
resp,err := http.Get("http://example.com/") ... resp,err := http.Post("http://example.com/upload","image/jpeg",&buf) ... resp,err := http.PostForm("http://example.com/form",url.Values{"key": {"Value"},"id": {"123"}})
resp,err := http.Get("http://example.com/") if err != nil { // handle error } defer resp.Body.Close() body,err := IoUtil.ReadAll(resp.Body) // ...
要管理HTTP客户端的头域、重定向策略和其他设置,创建一个Client:
client := &http.Client{ CheckRedirect: redirectPolicyFunc,} resp,err := client.Get("http://example.com") // ... req,err := http.NewRequest("GET","http://example.com",nil) // ... req.Header.Add("If-None-Match",`W/"wyzzy"`) resp,err := client.Do(req) // ...
要管理代理、TLS配置、keep-alive、压缩和其他设置,创建一个Transport:
tr := &http.Transport{ TLSClientConfig: &tls.Config{RootCAs: pool},DisableCompression: true,} client := &http.Client{Transport: tr} resp,err := client.Get("https://example.com")
Client和Transport类型都可以安全的被多个go程同时使用。出于效率考虑,应该一次建立、尽量重用。
ListenAndServe使用指定的监听地址和处理器启动一个HTTP服务端。处理器参数通常是nil,这表示采用包变量DefaultServeMux作为处理器。Handle和HandleFunc函数可以向DefaultServeMux添加处理器。
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
- Constants
- Variables
- type ProtocolError
- func CanonicalHeaderKey(s string) string
- func DetectContentType(data []byte) string
- func ParseHTTPVersion(vers string) (major,minor int,ok bool)
- func ParseTime(text string) (t time.Time,err error)
- func StatusText(code int) string
- type ConnState
- type Header
- func (h Header) Get(key string) string
- func (h Header) Set(key,value string)
- func (h Header) Add(key,value string)
- func (h Header) Del(key string)
- func (h Header) Write(w io.Writer) error
- func (h Header) WriteSubset(w io.Writer,exclude map[string]bool) error
- type Cookie
- type CookieJar
- type Request
- func NewRequest(method,urlStr string,body io.Reader) (*Request,error)
- func ReadRequest(b *bufio.Reader) (req *Request,err error)
- func (r *Request) ProtoAtLeast(major,minor int) bool
- func (r *Request) UserAgent() string
- func (r *Request) Referer() string
- func (r *Request) AddCookie(c *Cookie)
- func (r *Request) SetBasicAuth(username,password string)
- func (r *Request) Write(w io.Writer) error
- func (r *Request) WriteProxy(w io.Writer) error
- func (r *Request) Cookies() []*Cookie
- func (r *Request) Cookie(name string) (*Cookie,error)
- func (r *Request) ParseForm() error
- func (r *Request) ParseMultipartForm(maxMemory int64) error
- func (r *Request) FormValue(key string) string
- func (r *Request) PostFormValue(key string) string
- func (r *Request) FormFile(key string) (multipart.File,*multipart.FileHeader,error)
- func (r *Request) MultipartReader() (*multipart.Reader,error)
- type Response
- func ReadResponse(r *bufio.Reader,req *Request) (*Response,error)
- func (r *Response) ProtoAtLeast(major,minor int) bool
- func (r *Response) Cookies() []*Cookie
- func (r *Response) Location() (*url.URL,error)
- func (r *Response) Write(w io.Writer) error
- type ResponseWriter
- type Flusher
- type CloseNotifier
- type Hijacker
- type RoundTripper
- type Transport
- func (t *Transport) RegisterProtocol(scheme string,rt RoundTripper)
- func (t *Transport) RoundTrip(req *Request) (resp *Response,err error)
- func (t *Transport) CloseIdleConnections()
- func (t *Transport) CancelRequest(req *Request)
- type Client
- func (c *Client) Do(req *Request) (resp *Response,err error)
- func (c *Client) Head(url string) (resp *Response,err error)
- func (c *Client) Get(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 Handler
- func NotFoundHandler() Handler
- func RedirectHandler(url string,code int) Handler
- func TimeoutHandler(h Handler,dt time.Duration,msg string) Handler
- func StripPrefix(prefix string,h Handler) Handler
- type HandlerFunc
- 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 (s *Server) SetKeepAlivesEnabled(v bool)
- func (srv *Server) Serve(l net.Listener) error
- func (srv *Server) ListenAndServe() error
- func (srv *Server) ListenAndServeTLS(certFile,keyFile string) error
- type File
- type FileSystem
- type Dir
- func NewFileTransport(fs FileSystem) RoundTripper
- func FileServer(root FileSystem) Handler
- func SetCookie(w ResponseWriter,cookie *Cookie)
- func Redirect(w ResponseWriter,r *Request,code int)
- func NotFound(w ResponseWriter,r *Request)
- func Error(w ResponseWriter,error string,code int)
- func ServeContent(w ResponseWriter,req *Request,name string,modtime time.Time,content io.ReadSeeker)
- func ServeFile(w ResponseWriter,name string)
- func MaxBytesReader(w ResponseWriter,r io.ReadCloser,n int64) io.ReadCloser
- func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL,error)
- func ProxyFromEnvironment(req *Request) (*url.URL,error)
- func Head(url string) (resp *Response,err error)
- func Get(url string) (resp *Response,err error)
- func Post(url string,err error)
- func PostForm(url string,err error)
- func Handle(pattern string,handler Handler)
- func HandleFunc(pattern string,*Request))
- func Serve(l net.Listener,handler Handler) error
- func ListenAndServe(addr string,handler Handler) error
- func ListenAndServeTLS(addr string,certFile string,keyFile string,handler Handler) error
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
DefaultMaxHeaderBytes是HTTP请求的头域最大允许长度。可以通过设置Server.MaxHeaderBytes字段来覆盖。
const DefaultMaxIdleConnsPerHost = 2
DefaultMaxIdleConnsPerHost是Transport的MaxIdleConnsPerHost的默认值。
const TimeFormat = "Mon,02 Jan 2006 15:04:05 GMT"
TimeFormat是当解析或生产HTTP头域中的时间时,用与time.Parse或time.Format函数的时间格式。这种格式类似time.RFC1123但强制采用GMT时区。
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.@L_403_125@("Conn.Write called after Flush") ErrBodyNotAllowed = errors.@L_403_125@("http: request method or response status code does not allow body") ErrHijacked = errors.@L_403_125@("Conn has been hijacked") ErrContentLength = errors.@L_403_125@("Conn.Write wrote more than the declared Content-Length") )
会被HTTP服务端返回的错误。
var DefaultClient = &Client{}
DefaultClient是用于包函数Get、Head和Post的默认Client。
var DefaultServeMux = NewServeMux()
DefaultServeMux是用于Serve的默认ServeMux。
var ErrBodyReadAfterClose = errors.@L_403_125@("http: invalid Read on closed Body")
在Resquest或Response的Body字段已经关闭后,试图从中读取时,就会返回ErrBodyReadAfterClose。这个错误一般发生在:HTTP处理器中调用完ResponseWriter接口的WriteHeader或Write后从请求中读取数据的时候。
var ErrHandlerTimeout = errors.@L_403_125@("http: Handler timeout")
在处理器超时以后调用ResponseWriter接口的Write方法,就会返回ErrHandlerTimeout。
var ErrLineTooLong = errors.@L_403_125@("header line too long")
var ErrMissingFile = errors.@L_403_125@("http: no such file")
当请求中没有提供给FormFile函数的文件字段名,或者该字段名不是文件字段时,该函数就会返回ErrMissingFile。
var ErrNoCookie = errors.@L_403_125@("http: named cookie not present")
var ErrNoLocation = errors.@L_403_125@("http: no Location header in response")
typeProtocolError
type ProtocolError struct { ErrorString string }
HTTP请求解析错误。
func (*ProtocolError)Error
func (err *ProtocolError) Error() string
funcCanonicalHeaderKey
func CanonicalHeaderKey(s string) string
CanonicalHeaderKey函数返回头域(表示为Header类型)的键s的规范化格式。规范化过程中让单词首字母和'-'后的第一个字母大写,其余字母小写。例如,"accept-encoding"规范化为"Accept-Encoding"。
funcDetectContentType
func DetectContentType(data []byte) string
DetectContentType函数实现了http://mimesniff.spec.whatwg.org/描述的算法,用于确定数据的Content-Type。函数总是返回一个合法的MIME类型;如果它不能确定数据的类型,将返回"application/octet-stream"。它最多检查数据的前512字节。
funcParseHTTPVersion
func ParseHTTPVersion(vers string) (major,minor int,ok bool)
ParseHTTPVersion解析HTTP版本字符串。如"HTTP/1.0"返回(1,true)。
funcParseTime
func ParseTime(text string) (t time.Time,err error)
ParseTime用3种格式TimeFormat,time.RFC850和time.ANSIC尝试解析一个时间头的值(如Date: header)。
funcStatusText
func StatusText(code int) string
StatusText返回HTTP状态码code对应的文本,如220对应"OK"。如果code是未知的状态码,会返回""。
typeConnState
type ConnState int
ConnState代表一个客户端到服务端的连接的状态。本类型用于可选的Server.ConnState回调函数。
const ( // StateNew代表一个新的连接,将要立刻发送请求。 // 连接从这个状态开始,然后转变为StateAlive或StateClosed。 StateNew ConnState = iota // StateActive代表一个已经读取了请求数据1到多个字节的连接。 // 用于StateAlive的Server.ConnState回调函数在将连接交付给处理器之前被触发, // 等到请求被处理完后,Server.ConnState回调函数再次被触发。 // 在请求被处理后,连接状态改变为StateClosed、StateHijacked或StateIdle。 StateActive // StateIdle代表一个已经处理完了请求、处在闲置状态、等待新请求的连接。 // 连接状态可以从StateIdle改变为StateActive或StateClosed。 StateIdle // 代表一个被劫持的连接。这是一个终止状态,不会转变为StateClosed。 StateHijacked // StateClosed代表一个关闭的连接。 // 这是一个终止状态。被劫持的连接不会转变为StateClosed。 StateClosed )
func (ConnState)String
func (c ConnState) String() string
typeHeader
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,sans-serif;font-size:14px;background-color:#FFFFFF;"> Add添加键值对到h,如键已存在则会将新的值附加到旧值切片后面。func (Header)Del
func (h Header) Del(key string)Del删除键值对。
func (Header)Write
func (h Header) Write(w io.Writer) errorWrite以有线格式将头域写入w。
func (Header)WriteSubset
func (h Header) WriteSubset(w io.Writer,exclude map[string]bool) errorWriteSubset以有线格式将头域写入w。当exclude不为nil时,如果h的键值对的键在exclude中存在且其对应值为真,该键值对就不会被写入w。
typeCookie
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() stringString返回该cookie的序列化结果。如果只设置了Name和Value字段,序列化结果可用于HTTP请求的Cookie头或者HTTP回复的Set-Cookie头;如果设置了其他字段,序列化结果只能用于HTTP回复的Set-Cookie头。
typeCookieJar
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的实现。
typeRequest
type Request struct { // Method指定HTTP方法(GET、POST、PUT等)。对客户端,""代表GET。 Method string // URL在服务端表示被请求的URI,在客户端表示要访问的URL。 // // 在服务端,URL字段是解析请求行的URI(保存在RequestURI字段)得到的, // 对大多数请求来说,除了Path和RawQuery之外的字段都是空字符串。 // (参见RFC 2616,Section 5.1.2) // // 在客户端,URL的Host字段指定了要连接的服务器, // 而Request的Host字段(可选地)指定要发送的HTTP请求的Host头的值。 URL *url.URL // 接收到的请求的协议版本。本包生产的Request总是使用HTTP/1.1 Proto string // "HTTP/1.0" ProtoMajor int // 1 ProtoMinor int // 0 // Header字段用来表示HTTP请求的头域。如果头域(多行键值对格式)为: // accept-encoding: gzip,deflate // Accept-Language: en-us // Connection: keep-alive // 则: // Header = map[string][]string{ // "Accept-Encoding": {"gzip,deflate"}, // "Accept-Language": {"en-us"}, // "Connection": {"keep-alive"}, // } // HTTP规定头域的键名(头名)是大小写敏感的,请求的解析器通过规范化头域的键名来实现这点。 // 在客户端的请求,可能会被自动添加或重写Header中的特定的头,参见Request.Write方法。 Header Header // Body是请求的主体。 // // 在客户端,如果Body是nil表示该请求没有主体买入GET请求。 // Client的Transport字段会负责调用Body的Close方法。 // // 在服务端,Body字段总是非nil的;但在没有主体时,读取Body会立刻返回EOF。 // Server会关闭请求的主体,ServeHTTP处理器不需要关闭Body字段。 Body io.ReadCloser // ContentLength记录相关内容的长度。 // 如果为-1,表示长度未知,如果>=0,表示可以从Body字段读取ContentLength字节数据。 // 在客户端,如果Body非nil而该字段为0,表示不知道Body的长度。 ContentLength int64 // TransferEncoding按从最外到最里的顺序列出传输编码,空切片表示"identity"编码。 // 本字段一般会被忽略。当发送或接受请求时,会自动添加或移除"chunked"传输编码。 TransferEncoding []string // Close在服务端指定是否在回复请求后关闭连接,在客户端指定是否在发送请求后关闭连接。 Close bool // 在服务端,Host指定URL会在其上寻找资源的主机。 // 根据RFC 2616,该值可以是Host头的值,或者URL自身提供的主机名。 // Host的格式可以是"host:port"。 // // 在客户端,请求的Host字段(可选地)用来重写请求的Host头。 // 如过该字段为"",Request.Write方法会使用URL字段的Host。 Host string // Form是解析好的表单数据,包括URL字段的query参数和POST或PUT的表单数据。 // 本字段只有在调用ParseForm后才有效。在客户端,会忽略请求中的本字段而使用Body替代。 Form url.Values // PostForm是解析好的POST或PUT的表单数据。 // 本字段只有在调用ParseForm后才有效。在客户端,会忽略请求中的本字段而使用Body替代。 PostForm url.Values // MultipartForm是解析好的多部件表单,包括上传的文件。 // 本字段只有在调用ParseMultipartForm后才有效。 // 在客户端,会忽略请求中的本字段而使用Body替代。 MultipartForm *multipart.Form // Trailer指定了会在请求主体之后发送的额外的头域。 // // 在服务端,Trailer字段必须初始化为只有trailer键,所有键都对应nil值。 // (客户端会声明哪些trailer会发送) // 在处理器从Body读取时,不能使用本字段。 // 在从Body的读取返回EOF后,Trailer字段会被更新完毕并包含非nil的值。 // (如果客户端发送了这些键值对),此时才可以访问本字段。 // // 在客户端,Trail必须初始化为一个包含将要发送的键值对的映射。(值可以是nil或其终值) // ContentLength字段必须是0或-1,以启用"chunked"传输编码发送请求。 // 在开始发送请求后,Trailer可以在读取请求主体期间被修改, // 一旦请求主体返回EOF,调用者就不可再修改Trailer。 // // 很少有HTTP客户端、服务端或代理支持HTTP trailer。 Trailer Header // RemoteAddr允许HTTP服务器和其他软件记录该请求的来源地址,一般用于日志。 // 本字段不是ReadRequest函数填写的,也没有定义格式。 // 本包的HTTP服务器会在调用处理器之前设置RemoteAddr为"IP:port"格式的地址。 // 客户端会忽略请求中的RemoteAddr字段。 RemoteAddr string // RequestURI是被客户端发送到服务端的请求的请求行中未修改的请求URI // (参见RFC 2616,Section 5.1) // 一般应使用URI字段,在客户端设置请求的本字段会导致错误。 RequestURI string // TLS字段允许HTTP服务器和其他软件记录接收到该请求的TLS连接的信息 // 本字段不是ReadRequest函数填写的。 // 对启用了TLS的连接,本包的HTTP服务器会在调用处理器之前设置TLS字段,否则将设TLS为nil。 // 客户端会忽略请求中的TLS字段。 TLS *tls.ConnectionState }Request类型代表一个服务端接受到的或者客户端发送出去的HTTP请求。
Request各字段的意义和用途在服务端和客户端是不同的。除了字段本身上方文档,还可参见Request.Write方法和RoundTripper接口的文档。
funcNewRequest
func NewRequest(method,urlStr string,body io.Reader) (*Request,error)NewRequest使用指定的方法、网址和可选的主题创建并返回一个新的*Request。
如果body参数实现了io.Closer接口,Request返回值的Body字段会被设置为body,并会被Client类型的Do、Post和PostFOrm方法以及Transport.RoundTrip方法关闭。
funcReadRequest
func ReadRequest(b *bufio.Reader) (req *Request,sans-serif;font-size:14px;background-color:#FFFFFF;"> ReadRequest从b读取并解析出一个HTTP请求。(本函数主要用在服务端从下层获取请求)func (*Request)ProtoAtLeast
func (r *Request) ProtoAtLeast(major,minor int) boolProtoAtLeast报告该请求使用的HTTP协议版本至少是major.minor。
func (*Request)UserAgent
func (r *Request) UserAgent() stringUserAgent返回请求中的客户端用户代理信息(请求的User-Agent头)。
func (*Request)Referer
func (r *Request) Referer() stringReferer返回请求中的访问来路信息。(请求的Referer头)
Referer在请求中就是拼错了的,这是HTTP早期就有的错误。该值也可以从用Header["Referer"]获取;让获取Referer字段变成方法的好处是,编译器可以诊断使用正确单词拼法的req.Referrer()的程序,但却不能诊断使用Header["Referrer"]的程序。
func (*Request)AddCookie
func (r *Request) AddCookie(c *Cookie)AddCookie向请求中添加一个cookie。按照RFC 6265section 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) errorWrite方法以有线格式将HTTP/1.1请求写入w(用于将请求写入下层TCPConn等)。本方法会考虑请求的如下字段:
Host URL Method (defaults to "GET") Header ContentLength TransferEncoding Body如果存在Body,ContentLength字段<= 0且TransferEncoding字段未显式设置为["identity"],Write方法会显式添加"Transfer-Encoding: chunked"到请求的头域。Body字段会在发送完请求后关闭。
func (*Request)WriteProxy
func (r *Request) WriteProxy(w io.Writer) errorWriteProxy类似Write但会将请求以HTTP代理期望的格式发送。
尤其是,按照RFC 2616Section 5.1.2,WriteProxy会使用绝对URI(包括协议和主机名)来初始化请求的第1行(Request-URI行)。无论何种情况,WriteProxy都会使用r.Host或r.URL.Host设置Host头。
func (*Request)Cookies
func (r *Request) Cookies() []*CookieCookies解析并返回该请求的Cookie头设置的cookie。
func (*Request)Cookie
func (r *Request) Cookie(name string) (*Cookie,sans-serif;font-size:14px;background-color:#FFFFFF;"> Cookie返回请求中名为name的cookie,如果未找到该cookie会返回nil,ErrNoCookie。func (*Request)ParseForm
func (r *Request) ParseForm() errorParseForm解析URL中的查询字符串,并将解析结果更新到r.Form字段。
对于POST或PUT请求,ParseForm还会将body当作表单解析,并将结果既更新到r.PostForm也更新到r.Form。解析结果中,POST或PUT请求主体要优先于URL查询字符串(同名变量,主体的值在查询字符串的值前面)。
如果请求的主体的大小没有被MaxBytesReader函数设定限制,其大小默认限制为开头10MB。
ParseMultipartForm会自动调用ParseForm。重复调用本方法是无意义的。
func (*Request)ParseMultipartForm
func (r *Request) ParseMultipartForm(maxMemory int64) errorParseMultipartForm将请求的主体作为multipart/form-data解析。请求的整个主体都会被解析,得到的文件记录最多maxMemery字节保存在内存,其余部分保存在硬盘的temp文件里。如果必要,ParseMultipartForm会自行调用ParseForm。重复调用本方法是无意义的。
func (*Request)FormValue
func (r *Request) FormValue(key string) stringFormValue返回key为键查询r.Form字段得到结果[]string切片的第一个值。POST和PUT主体中的同名参数优先于URL查询字符串。如果必要,本函数会隐式调用ParseMultipartForm和ParseForm。
func (*Request)PostFormValue
func (r *Request) PostFormValue(key string) stringPostFormValue返回key为键查询r.PostForm字段得到结果[]string切片的第一个值。如果必要,本函数会隐式调用ParseMultipartForm和ParseForm。
func (*Request)FormFile
func (r *Request) FormFile(key string) (multipart.File,*multipart.FileHeader,sans-serif;font-size:14px;background-color:#FFFFFF;"> FormFile返回以key为键查询r.MultipartForm字段得到结果中的第一个文件和它的信息。如果必要,本函数会隐式调用ParseMultipartForm和ParseForm。查询失败会返回ErrMissingFile错误。func (*Request)MultipartReader
func (r *Request) MultipartReader() (*multipart.Reader,sans-serif;font-size:14px;background-color:#FFFFFF;"> 如果请求是multipart/form-data POST请求,MultipartReader返回一个multipart.Reader接口,否则返回nil和一个错误。使用本函数代替ParseMultipartForm,可以将r.Body作为流处理。typeResponse
type Response struct { Status string // 例如"200 OK" StatusCode int // 例如200 Proto string // 例如"HTTP/1.0" ProtoMajor int // 例如1 ProtoMinor int // 例如0 // Header保管头域的键值对。 // 如果回复中有多个头的键相同,Header中保存为该键对应用逗号分隔串联起来的这些头的值 // (参见RFC 2616 Section 4.2) // 被本结构体中的其他字段复制保管的头(如ContentLength)会从Header中删掉。 // // Header中的键都是规范化的,参见CanonicalHeaderKey函数 Header Header // Body代表回复的主体。 // Client类型和Transport类型会保证Body字段总是非nil的,即使回复没有主体或主体长度为0。 // 关闭主体是调用者的责任。 // 如果服务端采用"chunked"传输编码发送的回复,Body字段会自动进行解码。 Body io.ReadCloser // ContentLength记录相关内容的长度。 // 其值为-1表示长度未知(采用chunked传输编码) // 除非对应的Request.Method是"HEAD",其值>=0表示可以从Body读取的字节数 ContentLength int64 // TransferEncoding按从最外到最里的顺序列出传输编码,空切片表示"identity"编码。 TransferEncoding []string // Close记录头域是否指定应在读取完主体后关闭连接。(即Connection头) // 该值是给客户端的建议,Response.Write方法的ReadResponse函数都不会关闭连接。 Close bool // Trailer字段保存和头域相同格式的trailer键值对,和Header字段相同类型 Trailer Header // Request是用来获取此回复的请求 // Request的Body字段是nil(因为已经被用掉了) // 这个字段是被Client类型发出请求并获得回复后填充的 Request *Request // TLS包含接收到该回复的TLS连接的信息。对未加密的回复,本字段为nil。 // 返回的指针是被(同一TLS连接接收到的)回复共享的,不应被修改。 TLS *tls.ConnectionState }Response代表一个HTTP请求的回复。
funcReadResponse
func ReadResponse(r *bufio.Reader,req *Request) (*Response,sans-serif;font-size:14px;background-color:#FFFFFF;"> ReadResponse从r读取并返回一个HTTP回复。req参数是可选的,指定该回复对应的请求(即是对该请求的回复)。如果是nil,将假设请求是GET请求。客户端必须在结束resp.Body的读取后关闭它。读取完毕并关闭后,客户端可以检查resp.Trailer字段获取回复的trailer的键值对。(本函数主要用在客户端从下层获取回复)func (*Response)ProtoAtLeast
func (r *Response) ProtoAtLeast(major,sans-serif;font-size:14px;background-color:#FFFFFF;"> ProtoAtLeast报告该回复使用的HTTP协议版本至少是major.minor。func (*Response)Cookies
func (r *Response) Cookies() []*CookieCookies解析并返回该回复中的Set-Cookie头设置的cookie。
func (*Response)Location
func (r *Response) Location() (*url.URL,sans-serif;font-size:14px;background-color:#FFFFFF;"> Location返回该回复的Location头设置的URL。相对地址的重定向会相对于该回复对应的请求来确定绝对地址。如果回复中没有Location头,会返回nil,ErrNoLocation。func (*Response)Write
func (r *Response) Write(w io.Writer) errorWrite以有线格式将回复写入w(用于将回复写入下层TCPConn等)。本方法会考虑如下字段:
StatusCode ProtoMajor ProtoMinor Request.Method TransferEncoding Trailer Body ContentLength Header(不规范的键名和它对应的值会导致不可预知的行为)typeResponseWriter
type ResponseWriter interface { // Header返回一个Header类型值,该值会被WriteHeader方法发送。 // 在调用WriteHeader或Write方法后再改变该对象是没有意义的。 Header() Header // WriteHeader该方法发送HTTP回复的头域和状态码。 // 如果没有被显式调用,第一次调用Write时会触发隐式调用WriteHeader(http.StatusOK) // WriterHeader的显式调用主要用于发送错误码。 WriteHeader(int) // Write向连接中写入作为HTTP的一部分回复的数据。 // 如果被调用时还未调用WriteHeader,本方法会先调用WriteHeader(http.StatusOK) // 如果Header中没有"Content-Type"键, // 本方法会使用包函数DetectContentType检查数据的前512字节,将返回值作为该键的值。 Write([]byte) (int,error) }ResponseWriter接口被HTTP处理器用于构造HTTP回复。
typeFlusher
type Flusher interface { // Flush将缓冲中的所有数据发送到客户端 Flush() }HTTP处理器ResponseWriter接口参数的下层如果实现了Flusher接口,可以让HTTP处理器将缓冲中的数据发送到客户端。
注意:即使ResponseWriter接口的下层支持Flush方法,如果客户端是通过HTTP代理连接的,缓冲中的数据也可能直到回复完毕才被传输到客户端。
typeCloseNotifier
type CloseNotifier interface { // CloseNotify返回一个通道,该通道会在客户端连接丢失时接收到唯一的值 CloseNotify() <-chan bool }HTTP处理器ResponseWriter接口参数的下层如果实现了CloseNotifier接口,可以让用户检测下层的连接是否停止。如果客户端在回复准备好之前关闭了连接,该机制可以用于取消服务端耗时较长的操作。
typeHijacker
type Hijacker interface { // Hijack让调用者接管连接,返回连接和关联到该连接的一个缓冲读写器。 // 调用本方法后,HTTP服务端将不再对连接进行任何操作, // 调用者有责任管理、关闭返回的连接。 Hijack() (net.Conn,*bufio.ReadWriter,sans-serif;font-size:14px;background-color:#FFFFFF;"> HTTP处理器ResponseWriter接口参数的下层如果实现了Hijacker接口,可以让HTTP处理器接管该连接。 @H_403_2322@ @H_403_2322@ @H_403_2322@ Example