http请求原理
http请求原理我就不多说了,网上一搜就能搜索到,下面我注意是记录下http模块的使用方法
http 模块
HTTP-server hello world
我们使用HandleFunc来把url与处理函数绑定在一块就可以处理http请求了。
// simehttp1package mainimport ( "fmt" "net/http")func hello(w http.ResponseWriter, r *http.Request) { fmt.Println("handle hello") fmt.Fprintf(w, "hello")}func main() { http.HandleFunc("/", hello) // 把url和处理这个url的方法绑定下 err := http.ListenAndServe("0.0.0.0:80", nil) // 启动服务 if err != nil { fmt.Println("http listen failed") }}
HTTP-Client
我们使用http模块来发送一个GET方法的http请求,然后在打印下获取的结果
// httpClientpackage mainimport ( "fmt" "io/ioutil" "net/http")func main() { res, err := http.Get("http://www.baidu.com") // 使用GET方法请求数据 if err != nil { fmt.Println("get err:,", err) return } data, err := ioutil.ReadAll(res.Body) // 读取获取的html body if err != nil { fmt.Println("get data err:", err) return } fmt.Println(string(data))}
HTTP-head
我们可以使用head方法来访问指定的网页
// httpHeadpackage mainimport ( "fmt" "net/http")var url = []string{ "http://www.baidu.com", "http://google.com",}func main() { for _, v := range url { resp, err := http.Head(v) // head方法获取内容 if err != nil { fmt.Printf("head %s failed,err:", v, err) continue } fmt.Printf("head succ,status:%v\n", resp.Status) }}
显然我们访问谷歌的时候因为墙的原因导致访问不了,超时时间比较长,那么我们可以自己定义下超时时间,自己定义的话只需要设置Dial 的超时时间即可,我们设置为2秒
// httpHeadpackage mainimport ( "fmt" "net" "net/http" "time")var url = []string{ "http://www.baidu.com", "http://google.com",}func main() { for _, v := range url { c := http.Client{ // 指定http的超时时间,基本上对这个Client结构体赋值。更多详情可以看源码 Transport: &http.Transport{ Dial: func(network, addr string) (net.Conn, error) { timeout := time.Second * 2 // 这里设置超时时间为2秒 return net.DialTimeout(network, addr, timeout) }, }, } resp, err := c.Head(v) if err != nil { fmt.Printf("head %s failed,err:", v, err) continue } fmt.Printf("head succ,status:%v\n", resp.Status) }}