函数

服务端函数

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未知,则返回空的字符串 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) 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被使用.

客户端函数

Client具有Do,Get,Head,Post以及PostForm等方法。 其中Do方法可以对Request进行一系列的设定,而其
他的对request设定较少。如果Client使用默认的Client,则其中的Get,Head,Post以及PostForm方法相当于
默认的http.Get,http.Post,http.Head以及http.PostForm函数。 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 string) (resp *Response, err error)利用get方法请求指定的url.Get请求
指定的页面信息,并返回实体主体。 func (c *Client) Head(url string) (resp *Response, err error)利用head方法请求指定的url,Head
只返回页面的首部。 func (c *Client) Post(url string, bodyType string, body io.Reader) (resp *Response, err
error)利用post方法请求指定的URl,如果body也是一个io.Closer,则在请求之后关闭它 func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error)利用post方
法请求指定的url,利用data的key和value作为请求体. Do方法可以灵活的对request进行配置,然后进行请求。利用http.Client以及http.NewRequest来模拟请求。模
拟request中带有cookie的请求。示例如下:

例子

package main
import (// "encoding/json""fmt""io/ioutil""net/http""strconv"
)
func main() {client := &http.Client{}request, err := http.NewRequest("GET", "http://www.baidu.com", nil)if err != nil {fmt.Println(err)}cookie := &http.Cookie{Name: "userId", Value: strconv.Itoa(12345)}request.AddCookie(cookie) //request中添加cookie//设置request的headerrequest.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")request.Header.Set("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3")request.Header.Set("Accept-Encoding", "gzip,deflate,sdch")request.Header.Set("Accept-Language", "zh-CN,zh;q=0.8")request.Header.Set("Cache-Control", "max-age=0")request.Header.Set("Connection", "keep-alive")response, err := client.Do(request)if err != nil {fmt.Println(err)return}defer response.Body.Close()fmt.Println(response.StatusCode)if response.StatusCode == 200 {r, err := ioutil.ReadAll(response.Body)if err != nil {fmt.Println(err)}fmt.Println(string(r))}
}

结构

客户端

type ClientClient是一个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
}
type ConnState表示客户端连接服务端的状态,其中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
)
type Cookie常用SetCooker用来给http的请求或者http的response设置cookietype Cookie struct {Name       string  //名字Value      string  //值Path       string   //路径Domain     string   Expires    time.Time //过期时间RawExpires string// MaxAge=0 意味着 没有'Max-Age'属性指定.// MaxAge<0 意味着 立即删除cookie// MaxAge>0 意味着设定了MaxAge属性,并且其单位是秒MaxAge   intSecure   boolHttpOnly boolRaw      stringUnparsed []string // 未解析的属性值对
}

func (c *Cookie) String() string该函数返回cookie的序列化结果。如果只设置了Name和Value字段,序列化结果可用于HTTP请求的Cookie头或者HTTP回复的Set-Cookie头;如果设置了其他字段,序列化结果只能用于HTTP回复的Set-Cookie头。 
type CookieJar在http请求中,CookieJar管理存储和使用cookies.Cookiejar的实现必须被多协程并发使用时是安全的.

type CookieJar interface {// SetCookies 处理从url接收到的cookie,是否存储这个cookies取决于jar的策略和实现SetCookies(u *url.URL, cookies []*Cookie)// Cookies 返回发送到指定url的cookiesCookies(u *url.URL) []*Cookie
}type Dir使用一个局限于指定目录树的本地文件系统实现一个文件系统.一个空目录被当做当前目录
type Dir string
func (d Dir) Open(name string) (File, error)type FileFile是通过FileSystem的Open方法返回的,并且能够被FileServer实现.该方法与*os.File行为表现一样type File interface {io.Closerio.ReaderReaddir(count int) ([]os.FileInfo, error)Seek(offset int64, whence int) (int64, error)Stat() (os.FileInfo, error)
}type FileSystem实现了对一系列指定文件的访问,其中文件路径之间通过分隔符进行分割type FileSystem interface {Open(name string) (File, error)
}type Flusherresponsewriters允许http控制器将缓存数据刷新入client.然而如果client是通过http代理连接服务器,这个缓存数据也可能是在整个response结束后才能到达客户端type Flusher interface {// Flush将任何缓存数据发送到clientFlush()
}

服务端

type Handler实现Handler接口的对象可以注册到HTTP服务端,为指定的路径或者子树提供服务。ServeHTTP应该将回复的header和数据写入ResponseWriter接口然后返回。返回意味着该请求已经结束,HTTP服务端可以转移向该连接上的下一个请求。如果ServeHTTP崩溃panic,那么ServeHTTP的调用者假定这个panic的影响与活动请求是隔离的,二者互不影响.调用者恢复panic,将stack trace记录到错误日志中,然后挂起这个连接.type Handler interface {ServeHTTP(ResponseWriter, *Request)
}func FileServer(root FileSystem) HandlerFileServer返回一个使用FileSystem接口提供文件访问服务的HTTP处理器。可以使用httpDir来使用操作系统的FileSystem接口实现。其主要用来实现静态文件的展示。
func NotFoundHandler() Handler返回一个简单的请求处理器,该处理器对任何请求都会返回”404 page not found”
func RedirectHandler(url string, code int) Handler使用给定的状态码将它接受到的任何请求都重定向到给定的url
func StripPrefix(prefix string, h Handler) Handler将请求url.path中移出指定的前缀,然后将省下的请求交给handler h来处理,对于那些不是以指定前缀开始的路径请求,该函数返回一个http 404 not found 的错误.
func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler具有超时限制的handler,该函数返回的新Handler调用h中的ServerHTTP来处理每次请求,但是如果一次调用超出时间限制,那么就会返回给请求者一个503服务请求不可达的消息,并且在ResponseWriter返回超时错误.
其中FileServer经常和StripPrefix一起连用,用来实现静态文件展示,举例如下:package main
import ("fmt""net/http"
)
func main() {http.Handle("/test/", http.FileServer(http.Dir("/home/work/"))) ///home/work/test/中必须有内容http.Handle("/download/", http.StripPrefix("/download/", http.FileServer(http.Dir("/home/work/"))))http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp")))) //127.0.0.1:9999/tmpfiles/访问的本地文件/tmp中的内容http.ListenAndServe(":9999", nil)
}type HandlerFuncHandlerFunc type是一个适配器,通过类型转换我们可以将普通的函数作为HTTP处理器使用。如果f是一个具有适当签名的函数,HandlerFunc(f)通过调用f实现了Handler接口。type Hijacker interface {// Hijack让调用者接管连接,在调用Hijack()后,http server库将不再对该连接进行处理,对于该连接的管理和关闭责任将由调用者接管.Hijack() (net.Conn, *bufio.ReadWriter, error) //conn表示连接对象,bufrw代表该连接的读写缓存对象。
}Hijacker用法如下所示:package main
import ("fmt""net/http"
)
func HiJack(w http.ResponseWriter, r *http.Request) {hj, ok := w.(http.Hijacker)if !ok {http.Error(w, "webserver doesn't support hijacking", http.StatusInternalServerError)return}conn, bufrw, err := hj.Hijack()if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}defer conn.Close()bufrw.WriteString("Now we're speaking raw TCP. Say hi: \n")bufrw.Flush()fmt.Fprintf(bufrw, "You said: %s Bye.\n", "Good")bufrw.Flush()
}
func main() {http.HandleFunc("/hijack", HiJack)err := http.ListenAndServe(":9999", nil)if err != nil {fmt.Println(err)}
}

最新文章

  1. oracle 11g wm_concat 、 listagg 函数的使用(合并数据)
  2. pycharm中run pytest解决
  3. 百度搜索打不开第二页_北易信息:百度爱采购适合做优化推广吗
  4. TikTok测试三分钟视频、Reddit首次公布DAU、谷歌解雇人工智能领头人、年度最受欢迎应用|Decode the Week...
  5. GLSL学习教程博客
  6. 从容器开始的良好做法
  7. 【欢迎大家一起交流讨论】关于Word的自动检测修改--论文格式修正系统(毕业设计)...
  8. Android仿人人客户端(v5.7.1)——项目框架新做的调整描述(项目中基类java源码)...
  9. 1101 害死人不偿命的猜想 PAT
  10. day39-Spring 02-AOP的概述
  11. 应用安全-安全设备-Waf系列-软Waf-安全狗(Safedog)
  12. 橡胶支座抗压弹性模量计算公式_单向滑动抗震弹性支座作用介绍
  13. unity与3dmax 单位统一的方法
  14. linux wine乱码,解决wine中文乱码的问题
  15. 1、misa统计SRR结果
  16. c语言case2什么意思,switchCase2
  17. VSCode 单文件编译 与 多文件编译(windows)
  18. Guava - 拯救垃圾代码,写出优雅高效,效率提升N倍
  19. 【c语言】结构体详解 | 结构体数组/指针
  20. 一行代码实现IOS 3DES加密解密

热门文章

  1. 03SpringMVC,Spring,Hibernate整合(Date时间转换)
  2. oracle表空间,角色,权限,表,索引,序列号,视图,同义词,约束条件,存储函数和过程,常用数据字典,基本数据字典信息,查看VGA信息,维护表空间,创建表空间等信息
  3. 项目--教师日常办公平台中的活动图
  4. Python 多种算法模型对比
  5. dev c++运行没有结果_「C/C++」一行注释也能影响运行结果?
  6. Vsftpd文件传输服务(本地用户访问)
  7. 使用PhantomJS实现网页截图服务
  8. [翻译] TWRPickerSlider
  9. ASP.NET【4】--ASHX
  10. 关于showmodaldialog的问题处理