golang常用库-常用http操作

904 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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())