1.怎么实现HTTP协议客户端?
Go
语言标准库内置了net/http
包,涵盖了HTTP
客户端和服务端具体的实现方式。内置的net/http
包提供了最简洁的HTTP
客户端实现方式,无须借助第三方网络通信库,就可以直接使用HTTP
中用得最多的GET
和POST
方式请求数据。
实现HTTP
客户端就是客户端通过网络访问向服务端发送请求,服务端发送响应信息,并将相应信息输出到客户端的过程。实现客户端有以下几种方式。
2.Get请求
2.1 使用http.NewRequest
1. 源码
func NewRequest(method, url string, body io.Reader) (*Request, error) { return NewRequestWithContext(context.Background(), method, url, body) }
|
2. 使用示例
package main import ( "fmt" "io/ioutil" "net/http" ) func main() { testHttpNewRequestByGet() } func testHttpNewRequestByGet() { client := http.Client{} request, err := http.NewRequest("GET", "https://api.apiopen.top/getJoke?page=1&count=2&type=text", nil) catchError(err) cookie1 := http.Cookie{Name: "uid", Value: "1001"} request.AddCookie(&cookie1) response, err := client.Do(request) catchError(err) if response.StatusCode != 200 { fmt.Println("网络请求失败!" ) } defer func() { response.Body.Close() }() body, err := ioutil.ReadAll(response.Body) catchError(err) fmt.Println("请求结果: " + string(body)) }
func catchError(err error) { defer func() { if er := recover(); er != nil { fmt.Println(fmt.Sprintf("系统崩溃:%v",er)) } }() if err != nil { panic(err) } }
|
2.2 使用clent.Get
1. 源码
func (c *Client) Get(url string) (resp *Response, err error) { req, err := NewRequest("GET", url, nil) if err != nil { return nil, err } return c.Do(req) }
|
2. 使用示例
package main import ( "fmt" "io/ioutil" "net/http" ) func main() { testClientGet() }
func testClientGet() { client := http.Client{} response, err := client.Get("https://api.apiopen.top/getJoke?page=1&count=2&type=text") catchError(err) if response.StatusCode != 200 { fmt.Println("网络请求失败!") } defer func() { response.Body.Close() }() res, err := ioutil.ReadAll(response.Body) catchError(err) fmt.Printf("返回结果: %s\n",res) }
func catchError(err error) { defer func() { if er := recover(); er != nil { fmt.Println(fmt.Sprintf("系统崩溃:%v", er)) } }() if err != nil { panic(err) } }
|
2.3 使用http.Get
1.源码
func Get(url string) (resp *Response, err error) { return DefaultClient.Get(url) }
|
2.使用示例
package main import ( "fmt" "io/ioutil" "net/http" )
func main() { testClientGet() }
func testClientGet() { response, err := http.Get("https://api.apiopen.top/getJoke?page=1&count=2&type=text") catchError(err) if response.StatusCode != 200 { fmt.Println("网络请求失败!") } defer func() { response.Body.Close() }() res, err := ioutil.ReadAll(response.Body) catchError(err) fmt.Printf("返回结果: %s\n",res) }
func catchError(err error) { defer func() { if er := recover(); er != nil { fmt.Println(fmt.Sprintf("系统崩溃:%v", er)) } }() if err != nil { panic(err) } }
|
3.Post请求
3.1 使用http.NewRequest
1. 使用示例
package main import ( "fmt" "io/ioutil" "net/http" "strings" ) func main() { testHttpNewRequestByPost() }
func testHttpNewRequestByPost() { client := http.Client{} paramStr := "userName=admin&passWord=1234" request, err := http.NewRequest("POST", "http://127.0.0.1:8888/login", strings.NewReader(paramStr)) catchError(err) request.Header.Add("Content-Type","application/x-www-form-urlencoded") request.Header.Set("Cookie","uid=199") response, err := client.Do(request) catchError(err) if response.StatusCode != 200 { fmt.Println("网络请求失败!" ) } defer func() { response.Body.Close() }() body, err := ioutil.ReadAll(response.Body) catchError(err) fmt.Println("请求结果: " + string(body)) }
func catchError(err error) { defer func() { if er := recover(); er != nil { fmt.Println(fmt.Sprintf("系统崩溃:%v",er)) } }() if err != nil { panic(err) } }
|
3.2 使用client.Post 或client.PostForm
1.源码
func (c *Client) Post(url, contentType string, body io.Reader) (resp *Response, err error) { req, err := NewRequest("POST", url, body) if err != nil { return nil, err } req.Header.Set("Content-Type", contentType) return c.Do(req) }
func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error) { return c.Post(url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) }
|
2.使用示例
package main import ( "fmt" "io/ioutil" "net/http" "net/url" "strings" ) func main() { reqType := 2 client := http.Client{} var response *http.Response var err error if reqType == 1{ paramStr := "userName=admin&passWord=1234" response, err = client.Post("http://127.0.0.1:8888/login","application/x-www-form-urlencoded", strings.NewReader(paramStr)) } else { param := url.Values{ "userName": []string{"admin"}, "passWord": []string{"1234"}, } response, err = client.PostForm("http://127.0.0.1:8888/login", param) } catchError(err) if response.StatusCode != 200 { fmt.Println("网络请求失败!" ) } defer func() { response.Body.Close() }() body, err := ioutil.ReadAll(response.Body) catchError(err) fmt.Println("请求结果: " + string(body)) }
func catchError(err error) { defer func() { if er := recover(); er != nil { fmt.Println(fmt.Sprintf("系统崩溃:%v",er)) } }() if err != nil { panic(err) } }
|
3.3 使用 http.Post或http.PostForm
1.源码
func Post(url, contentType string, body io.Reader) (resp *Response, err error) { return DefaultClient.Post(url, contentType, body) }
func PostForm(url string, data url.Values) (resp *Response, err error) { return DefaultClient.PostForm(url, data) }
|
2.使用示例
package main import ( "fmt" "io/ioutil" "net/http" "net/url" "strings" ) func main() { reqType := 1 var response *http.Response var err error if reqType == 1{ paramStr := "userName=admin&passWord=1234" response, err = http.Post("http://127.0.0.1:8888/login","application/x-www-form-urlencoded", strings.NewReader(paramStr)) } else { param := url.Values{ "userName": {"admin"}, "passWord": []string{"1234"}, } response, err = http.PostForm("http://127.0.0.1:8888/login", param) } catchError(err) if response.StatusCode != 200 { fmt.Println("网络请求失败!" ) } defer func() { response.Body.Close() }() body, err := ioutil.ReadAll(response.Body) catchError(err) fmt.Println("请求结果: " + string(body)) }
func catchError(err error) { defer func() { if er := recover(); er != nil { fmt.Println(fmt.Sprintf("系统崩溃:%v",er)) } }() if err != nil { panic(err) } }
|