1 简介
Go语言内置的net/http包提供了HTTP客户端和服务端的实现
resp, err := http.Get("http://example.com/")...resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf)...resp, err := http.PostForm("http://example.com/form",url.Values{"key": {"Value"}, "id": {"123"}})
程序在使用完response后必须关闭回复的主体。
resp, err := http.Get("http://example.com/")if err != nil {// handle error}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)// ...
2 GET请求示例
(1) client.go
func main() {apiUrl := "http://127.0.0.1:9090/get"// URL paramdata := url.Values{}data.Set("name", "小王子")data.Set("age", "18")u, err := url.ParseRequestURI(apiUrl)if err != nil {fmt.Printf("parse url requestUrl failed, err:%v\n", err)}u.RawQuery = data.Encode() // URL encodefmt.Println(u.String())resp, err := http.Get(u.String())if err != nil {fmt.Printf("post failed, err:%v\n", err)return}defer resp.Body.Close()b, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Printf("get resp failed, err:%v\n", err)return}fmt.Println(string(b))}
(2) server.go
package mainimport ("fmt""net/http")func main() {http.HandleFunc("/get", getHandler)_ = http.ListenAndServe("127.0.0.1:9090", nil)}func getHandler(w http.ResponseWriter, r *http.Request) {defer r.Body.Close()data := r.URL.Query()fmt.Println(data.Get("name"))fmt.Println(data.Get("age"))answer := `{"status": "ok"}`w.Write([]byte(answer))}
3 Post请求示例
(1) client.go
package mainimport ("fmt""io/ioutil""net/http""strings")// net/http post demofunc main() {url := "http://127.0.0.1:9090/post"// 表单数据//contentType := "application/x-www-form-urlencoded"//data := "name=小王子&age=18"// jsoncontentType := "application/json"data := `{"name":"小王子","age":18}`resp, err := http.Post(url, contentType, strings.NewReader(data))if err != nil {fmt.Printf("post failed, err:%v\n", err)return}defer resp.Body.Close()b, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Printf("get resp failed, err:%v\n", err)return}fmt.Println(string(b))}
(2) server.go
package mainimport ("fmt""net/http")func main() {http.HandleFunc("/post", postHandler)_ = http.ListenAndServe("127.0.0.1:9090", nil)}func postHandler(w http.ResponseWriter, r *http.Request) {defer r.Body.Close()// 1. 请求类型是application/x-www-form-urlencoded时解析form数据r.ParseForm()fmt.Println(r.PostForm) // 打印form数据fmt.Println(r.PostForm.Get("name"), r.PostForm.Get("age"))// 2. 请求类型是application/json时从r.Body读取数据b, err := ioutil.ReadAll(r.Body)if err != nil {fmt.Printf("read request.Body failed, err:%v\n", err)return}fmt.Println(string(b))answer := `{"status": "ok"}`w.Write([]byte(answer))}
