Go HTTP库
概述
使用方法:import “net/http”
功能:实现HTTP协议的客户端和服务器
type Client
type Request
type Request struct {
Method string //请求方法,例如Post
URL *url.URL //url
Proto string // "HTTP/1.0"
Header Header //请求头
Body io.ReadCloser //请求主体
...
}
Request代表从客户端发送的一个请求,将被服务器所接收。常用方法
//新建一个request,参数表示请求方法、url和内容。
func NewRequest(method, urlStr string, body io.Reader) (*Request, error)
//读取一个request,解析出HTTP请求
func ReadRequest(b *bufio.Reader) (req *Request, err error)
type Response
type Response struct {
Status string //返回状态
Status int //同上
Header Header
Body io.ReadCloser
ContentLength int64 //返回的内容长度
...
}
Response结构体用来实现HTTP请求的回复。它的零值(DefaultClient)是一个可用的使用DefaultTransport的客户端。常用方法:
//从r读取并返回一个HTTP 回复。req参数是可选的,指定该回复对应的请求
func ReadResponse(r *bufio.Reader, req *Request) (*Response, error)
type Client
Client代表HTTP的客户端。常用方法:
//Client发起一个HTTP请求,返回一个Response
func (c *Client) Do(req *Request) (resp *Response, err error)
//以下三个函数表示发起一个Head、Get和Post请求
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)
type Handler
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
实现了Handler接口的对象可以注册到HTTP服务端,为特定的路径及其子树提供服务。
type Server
type Server struct {
Addr string // 监听的TCP地址,如果为空字符串会使用":http"
Handler Handler // 调用的处理器,如为nil会调用http.DefaultServeMux
ReadTimeout time.Duration // 请求的读取操作在超时前的最大持续时间
WriteTimeout time.Duration // 回复的写入操作在超时前的最大持续时间
MaxHeaderBytes int // 请求的头域最大长度,如为0为DefaultMaxHeaderBytes
...
}
Server用来实现HTTP服务器。Server的零值是合法的配置。常用方法:
//SetKeepAlivesEnabled控制是否允许HTTP闲置连接重用(keep-alive)功能。默认该功能总是被启用的。只有资源非常紧张的环境或者服务端在关闭进程中时,才应该关闭该功能。
func (s *Server) SetKeepAlivesEnabled(v bool)
//Serve会接手监听器收到的每一个连接,并为每一个连接创建一个新的服务go程。该go程会读取请求,然后调用srv.Handler回复请求。
func (srv *Server) Serve(l net.Listener) error
其他函数
func Get(url string) (resp *Response, err error)
Get向指定的URL发出一个GET请求,同理还有func Post、func Head
func Handle(pattern string, handler Handler)
Handle注册HTTP处理器handler和对应的模式pattern(注册到DefaultServeMux)
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
HandleFunc注册一个处理器函数handler和对应的模式pattern(注册到DefaultServeMux)。ServeMux的文档解释了模式的匹配机制。
func ListenAndServe(addr string, handler Handler) error
ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。
简单的例子
//发起HTTP请求
func httpDo() {
client := &http.Client{}
req, err := http.NewRequest("POST", "http://127.0.0.1:12345/hello", strings.NewReader("name=cjb"))
if err != nil {
// handle error
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
//发起请求
resp, err := client.Do(req)
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
// handle error
}
fmt.Println(string(body))
}
//HTTP服务器
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)
}
}