Server
package main
import (
"fmt"
"log"
"net/http"
)
type Bar struct {}
func (b Bar) ServeHTTP(w http.ResponseWriter, req *http.Request) {
tgt := req.URL.Query().Get("name")
fmt.Fprintf(w, "Hi %v", tgt)
}
func main() {
http.Handle("/bar", Bar{})
http.HandleFunc("/foo", func(w http.ResponseWriter, req *http.Request) {
tgt := req.URL.Query().Get("name")
fmt.Fprintf(w, "Hello %v", tgt)
})
log.Fatal(http.ListenAndServe(":9999", nil))
}
Client
发起请求
GET
直接请求
rep, err := http.Get("http://127.0.0.1:9998/sayhello")
if err != nil {
log.fatel(err)
}
defer rep.Body.Close()
自定义请求
c := http.DefaultClient
req, _ := http.NewRequest("GET", "http://127.0.0.1:9998/x", nil)
req.Header.Add("token", "xxx")
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.URL.RawQuery = url.Values{
"key": {"v"},
}.Encode()
rep := c.Do(req)
defer rep.Body.Close()
补充
两种 header 的设置方法
req.Header.Add("token", "xxx")
req.Header = map[string][]string{
"token": {"xxx"},
"num": {"1", "2", "3"},
}
两种参数的设置方法
req.URL.RawQuery = url.Values{
"key": {"v"},
}.Encode()
newURL := fmt.Sprintf("https://%v/$v?%v=$v", url, uri, k, v)
POST
直接请求
rep, err := http.Post("http://127.0.0.1:9998/y", "application/json", strings.NewReader("name=Tim"))
if err != nil {
log.fatal(err)
}
defer rep.Body.Close()
自定义请求
c := http.DefaultClient
data := []int{1, 2, 3}
marshal, _ := json.Marshal(data)
body := bytes.NewReader(marshal)
req, _ := http.NewRequest("POST", "http://127.0.0.1:9998/x", body)
req.Header.Add("token", "xxx")
rep := c.Do(req)
defer rep.Body.Close()
补充
两种 io.Reader 的获取方法(造 body)
data := []int{1, 2, 3}
marshal, _ := json.Marshal(data)
body := bytes.NewReader(marshal)
strings.NewReader("name=Tim"))
读取 response 数据
读所有
all, _ := ioutil.ReadAll(rep.Body)
根据字节分片读
r := make([]byte, 0, 1024)
buf := make([]byte, 0, 128)
for {
n, err := rep.Body.Read(buf)
if err == io.EOF {
r = append(r, buf[:n]...)
break
}
if err != nil && err != io.EOF {
log.Println(err)
break
}
r = append(r, buf[:]...)
}
fmt.Println(string(r))
取得结果
- 强转
string(body)
- 反序列化:
json --> struct or map
- 第三方包解析:
从 json 直接取值