小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
http
我们经常使用框架,其实很多框架都是在最简单的http服务上做扩展的的,基本上都是遵循http协议,将底层的封装好,我们使用web框架只要写业务逻辑,填代码就可以了,不用关心底层实现。Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现,我们接着就来看一下在golang中常用的http组件。
客户端
resp, err := http.Get("http://www.baidu.com/")
resp, err := http.Post("http://www.baidu.com/post", "image/jpeg", &buf)
resp, err := http.PostForm("http://www.baidu.com/form",
url.Values{"key": {"Value"}, "id": {"123"}})
if err != nil {
// handle error
}
//使用完response后必须关闭回复的主体
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
使用完response后必须关闭回复的主体。
带参数的请求
带参数get请求
apiUrl := "http://127.0.0.1:9090/get"
// URL param
data := url.Values{}
data.Set("name", "a")
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 encode
fmt.Println(u.String())
resp, err := http.Get(u.String())
if err != nil {
fmt.Println("post failed, err:%v\n", err)
return
}
带参数post请求
// 表单数据
//contentType := "application/x-www-form-urlencoded"
//data := "name=jm&age=20"
// json
contentType := "application/json"
data := `{"name":"jm","age":20}`
resp, err := http.Post(url, contentType, strings.NewReader(data))
看完以下的编写方式,我们觉得应该有更舒适第三方http库,只需要:
http.Get(url,json对象参数|结构体参数)
http.Post(url,options,data) //options负责设置http头等信息,data是参数json对象或结构体
服务端
// http server
func sayHello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello world")
}
func main() {
http.HandleFunc("/", sayHello)
err := http.ListenAndServe(":9527", nil)
if err != nil {
fmt.Printf("http server failed, err:%v\n", err)
return
}
}
//自定义server
s := &http.Server{
Addr: ":9527",
Handler: myHandler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())