http包包含http客户端和服务端的实现,利用Get,Head,Post,以及PostForm实现HTTP或者HTTPS的请求.
当客户端使用完response body后必须使用close对其进行关闭.如下所示
resp, err := http.Get("http://example.com/") if err != nil { // handle error } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) // ...
变量:
以下错误是http server使用的
-
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"} ) 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") )
var DefaultClient = &Client{} //默认客户端,被Get,Head以及Post使用
var DefaultServeMux = NewServeMux()//Serve使用的默认ServeMux
var ErrBodyReadAfterClose = errors.New("http: invalid Read on closed Body")//当读取一个request或者response body是在这个body已经关闭之后,便会返回该错误.这种错误主要发生情况是:当http handler调用writeheader或者write关于responsewrite之后进行读操作.
var ErrHandlerTimeout = errors.New("http: Handler timeout")//超时错误
var ErrLineTooLong = internal.ErrLineTooLong//当读取格式错误的分块编码时便会出现该错误.
var ErrMissingFile = errors.New("http: no such file")//当利用FormFile进行文件请求时,如果文件不存在或者请求中没有该文件就会出现该错误.
var ErrNoCookie = errors.New("http: named cookie not present") var ErrNoLocation = errors.New("http: no Location header in response")
-
-
- 函数:
- func CanonicalHeaderKey(s string) string//返回header key的规范化形式,规范化形式是以"-"为分隔符,每一部分都是首字母大写,其他字母小写.例如"accept-encoding" 的标准化形式是 "Accept-Encoding".
- func DetectContentType(data []byte) string//检查给定数据的内容类型Content-Type,最多检测512byte数据,如果有效的话,该函数返回一个MIME类型,否则的话,返回一个"application/octet-stream"
-
- func Error(w ResponseWriter, error string, code int)//利用指定的错误信息和Http code来响应请求,其中错误信息必须是纯文本.
- func NotFound(w ResponseWriter, r *Request)//返回HTTP404 not found错误
-
- func Handle(pattern string, handler Handler)//将handler按照指定的格式注册到DefaultServeMux,ServeMux解释了模式匹配规则
- func HandleFunc(pattern string, handler func(ResponseWriter, *Request))//同上, 主要用来实现动态文件内容的展示,这点与ServerFile()不同的地方。
-
- func ListenAndServe(addr string, handler Handler) error//监听TCP网络地址addr然后调用具有handler的Serve去处理连接请求.通常情况下Handler是nil,使用默认的DefaultServeMux
- func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error//该函数与ListenAndServe功能基本相同,二者不同之处是该函数需要HTTPS连接.也就是说,必须给该服务Serve提供一个包含整数的秘钥的文件,如果证书是由证书机构签署的,那么证书文件必须是服务证书之后跟着CA证书.
-
- func ServeFile(w ResponseWriter, r *Request, name string)//利用指定的文件或者目录的内容来响应相应的请求.
- func SetCookie(w ResponseWriter, cookie *Cookie)//给w设定cookie
- func StatusText(code int) string//对于http状态码返回文本表示,如果这个code未知,则返回空的字符串.
-
-
- 举例说明上述函数使用方法:
-
package main import ( "fmt" "net/http" ) func Test(w http.ResponseWriter, r *http.Request) { // http.NotFound(w, r)//用于设置404问题 // http.Error(w, "404 page not found", 404) //状态码需和描述相符 http.ServeFile(w, r, "1.txt") //将1.txt中内容在w中显示. cookie := &http.Cookie{ Name: http.CanonicalHeaderKey("uid-test"), //Name值为Uid-Test Value: "1234", } r.AddCookie(cookie) fmt.Println(r.Cookie("uid-test")) //<nil> http: named cookie not present fmt.Println(r.Cookie("Uid-Test")) //Uid-Test=1234 <nil> fmt.Println(r.Cookies()) //[Uid-Test=1234] } func main() { stat := http.StatusText(200) fmt.Println(stat) //状态码200对应的状态OK stringtype := http.DetectContentType([]byte("test")) fmt.Println(stringtype) //text/plain; charset=utf-8 http.HandleFunc("/test", Test) err := http.ListenAndServe(":9999", nil) if err != nil { fmt.Println(err) } }
-
- func MaxBytesReader(w ResponseWriter, r io.ReadCloser, n int64) io.ReadCloser//该函数类似于io.LimitReader但是该函数是用来限制请求体的大小.与io.LimitReader不同的是,该函数返回一个ReaderCloser,当读超过限制时,返回一个non-EOF,并且当Close方法调用时,关闭底层的reader.该函数组织客户端恶意发送大量请求,浪费服务器资源.
-
- func ParseHTTPVersion(vers string) (major, minor int, ok bool)//解析http字符串版本进行解析,"HTTP/1.0" 返回 (1, 0, true)// 注解析的字符串必须以HTTP开始才能够正确解析,HTTP区分大小写,其他诸如http或者Http都不能够正确解析。
- func ParseTime(text string) (t time.Time, err error)//解析时间头(例如data:header),解析格式如下面三种(HTTP/1.1中允许的):TimeFormat, time.RFC850, and time.ANSIC
-
- func ProxyFromEnvironment(req *Request) (*url.URL, error)//该函数返回一个指定请求的代理URL,这是由环境变量HTTP_PROXY,HTTPS_PROXY以及NO_PROXY决定的,对于https请求,HTTPS_PROXY优先级高于HTTP_PROXY,环境值可能是一个URL或者一个host:port,其中这两种类型都是http调度允许的,如果不是这两种类型的数值便会返回错误.如果在环境中没有定义代理或者代理不应该用于该请求(定义为NO_PROXY),将会返回一个nil URL和一个nil error.作为一个特例,如果请求rul是"localhost",无论有没有port,那么将返回一个nil rul和一个nil error.
- func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL, error)//返回一个用于传输的代理函数,该函数总是返回相同的URL
- func Redirect(w ResponseWriter, r *Request, urlStr string, code int)//返回一个重定向的url给指定的请求,这个重定向url可能是一个相对请求路径的一个相对路径.
- func Serve(l net.Listener, handler Handler) error//该函数接受listener l的传入http连接,对于每一个连接创建一个新的服务协程,这个服务协程读取请求然后调用handler来给他们响应.handler一般为nil,这样默认的DefaultServeMux被使用.
- func ServeContent(w ResponseWriter, req *Request, name string, modtime time.Time, content io.ReadSeeker)//该函数使用提供的ReaderSeeker提供的内容来恢复请求,该函数相对于io.Copy的优点是可以处理范围类请求,设定MIME类型,并且处理了If-Modified-Since请求.如果未设定content-type类型,该函数首先通过文件扩展名来判断类型,如果失效的话,读取content的第一块数据并将他传递给DetectContentType进行类型判断.name可以不被使用,更进一步说,他可以为空并且不在respone中返回.如果modtime不是0时间,该时间则体现在response的最后一次修改的header中,如果请求包括一个If-Modified-Since header,该函数利用modtime来决定是否发送该content.该函数利用Seek功能来决定content的大小.
-
-
-
-
- type Client//Client是一个http客户端,默认客户端(DefaultClient)将使用默认的发送机制的客户端.Client的Transport字段一般会含有内部状态(缓存TCP连接),因此Client类型值应尽量被重用而不是创建新的。多个协程并发使用Clients是安全的.
-
type Client struct { // Transport指定执行独立、单次HTTP请求的机制如果Transport为nil,则使用DefaultTransport。 Transport RoundTripper // CheckRedirect指定处理重定向的策略,如果CheckRedirect非nil,client将会在调用重定向之前调用它。 // 参数req和via是将要执行的请求和已经执行的请求(时间越久的请求优先执行),如果CheckRedirect返回一个错误, //client的GetGet方法不会发送请求req,而是回之前得到的响应和该错误。 // 如果CheckRedirect为nil,会采用默认策略:在连续10次请求后停止。 CheckRedirect func(req *Request, via []*Request) error // Jar指定cookie管理器,如果Jar为nil,在请求中不会发送cookie,在回复中cookie也会被忽略。 Jar CookieJar // Timeout指定Client请求的时间限制,该超时限制包括连接时间、重定向和读取response body时间。 // 计时器会在Head,Get,Post或Do方法返回后开始计时并在读到response.body后停止计时。 // Timeout为零值表示不设置超时。 // Client的Transport字段必须支持CancelRequest方法,否则Client会在尝试用Head,Get,Post或Do方法执行请求时返回错误。 // Client的Transport字段默认值(DefaultTransport)支持CancelRequest方法。 Timeout time.Duration }
- func (c *Client) Do(req *Request) (resp *Response, err error)//Do发送http请求并且返回一个http响应,遵守client的策略,如重定向,cookies以及auth等.错误经常是由于策略引起的,当err是nil时,resp总会包含一个非nil的resp.body.当调用者读完resp.body之后应该关闭它,如果resp.body没有关闭,则Client底层RoundTripper将无法重用存在的TCP连接去服务接下来的请求,如果resp.body非nil,则必须对其进行关闭.通常来说,经常使用Get,Post,或者PostForm来替代Do.
- func (c *Client) Get(url