您的当前位置:首页正文

Go语言中的HTTP编程

来源:图艺博知识网

HTTP客户端

我们在使用Go来建立HTTP客户端之后,无需借助第三方网络通信就可以直接使用HTTP中用得最多的GET和POST方式请求数据。

1.基本用法
func (c *Client) Get(url string) (r *Response, err error)
resp, err := 
    if err != nil {
    // 处理错误
    return
}
defer resp.Body.close()
io.Copy(os.Stdout, resp.Body)
func (c *Client) Post(url string, bodyType string, body io.Reader) (r *Response, err error)

函数中的三个参数分别代表的是:请求的目标URL,将要POST数据的资源类型和数据的比特流([]byte格式)。

resp, err :=  "image/jpeg". &imageDataBuf)
if err != nil {
    // 处理错误
    return
}
if resp.StatusCode != http.StatusOK {
    // 处理错误
    return
}
func (c *Client) PostForm(url string, data url.Values) (r *Response, err error)

PostForm向指定的URL发出一个POST请求,url.Values类型的data会被编码为请求的主体。POST数据的类型一般会设为。如果返回值errnilresp.Body总是非nil的,调用者应该在读取完resp.Body后关闭它。

resp, err :=  {"article title"}, "content":{"article body"})
if err != nil {
    // 处理错误
    return
}
func (c *Client) Head(url string) (r *Response, err error)

Head向指定的URL发出一个HEAD请求,如果回应的状态码如下,Head会在调用c.CheckRedirect后执行重定向:

301 (Moved Permanently)
302 (Found)
303 (See Other)
307 (Temporary Redirect)
resp, err := 

上面的例子实现了请求一个网站首页的HTTP的Header信息的功能。

2.封装
type Client struct {
    Transport RoundTripper
    CheckRedirect func(req *Request, via []*Request) error
    Jar CookieJar
}
Proxy func(*Request) (*url.URL, error)

该方法接收一个 *Request类型的请求实例作为参数并返回一个最终的HTTP代理。如果Proxy未指定或者返回的*URL为零值,将不会有代理被启用。

Dial func(net, addr string) (c net.Conn, err error)

该函数指定具体的dial()方法来创建TCP连接。

TLSClientConfig *tls.Config

SSL连接专用,TLSClientConfig指定tls.Client所用的TLS配置信息。

DisableKeepAlives bool

是否取消长连接,默认值为false

DisableCompression bool

是否取消压缩(GZip),默认值为false

MaxIdleConnsPerHost int

指定与每个请求的目标主机之间的最大非活跃连接数量(keep-alive)。默认是与DefaultMaxIdleConnsPerHost值相同的。


HTTP服务器端

1.处理HTTP请求
func ListenAndServe(addr string, handler Handler) error

该方法用于在指定的TCP网络地址addr进行监听。
具体示例如下:

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.ListenAndServer(":8000", nil))
s := &http.Server{
    Addr: ":8000",
    Handler: myHandler,
    ReadTimeout: 10 * time.Second,
    WriteTimeout: 10 * time.Secont,
    MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServer())
处理HTTPS请求
func ListenAndServerTLS(addr string, certFile string, keyFile string, handler Handler) error

开启SSL监听服务也很简单:

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.ListenAndServerTLS(":10413", "cert.pem", "key.pem", nil))

或者是对其进行自定义:

s := &http.Server{
    Addr: ":10413",
    Handler: myHandler,
    ReadTimeout: 10 * time.Second,
    WriteTimeout: 10 * time.Secont,
    MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServerTLS("cert.pem", "key.pem"))

以上是关于HTTP的简单介绍,接下来,我们将讲解RPC的有关内容,敬请期待。

Top