Go http 库

http 是Go语言的标准库之一,可以使用它创建http服务,同时它也提供http客户端功能。

简单的实例

package main

import (
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        w.Write([]byte("Hello Golang!"))
    })
    http.ListenAndServe(":8080", nil)
}

文件服务器

func main() {
    os.Mkdir("file", 0777)

    http.Handle("/file/", http.StripPrefix("/file/", http.FileServer(http.Dir("file"))))
    http.ListenAndServe(":8080", nil)
}

注:浏览器缓存可能会显示不一致

自定义http配置

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        w.Write([]byte("Done!"))
    })
    s := &http.Server{
        Addr:           ":8080",
        Handler:        mux,
        ReadTimeout:    time.Second * 3,
        WriteTimeout:   time.Second * 3,
        MaxHeaderBytes: 1 << 20,
    }
    s.ListenAndServe()
}

http client

GET

package main

import (
    "fmt"
    "log"
    "io/ioutil"
    "net/http"
)

func main() {
    req, err := http.Get("https://www.baidu.com")
    if err != nil {
        log.Fatal(err.Error())
    }
    defer req.Body.Close()
    body, err := ioutil.ReadAll(req.Body)
    if err != nil {
        log.Fatal(err.Error())
    }
    fmt.Println(string(body))
}

POST

func main() {
    // @url:
    // @content-type:
    // @io.Reader:
    req, err := http.Post("https://www.baidu.com", "application/x-www-form-urlencode",
        strings.NewReader("name=xxx"))
    if err != nil {
        log.Fatal(err.Error())
    }
    defer req.Body.Close()
    body, err := ioutil.ReadAll(req.Body)
    if err != nil {
        log.Fatal(err.Error())
    }
    fmt.Println(string(body))
}

表单提交

func main() {
    req, err := http.PostForm("https://www.baidu.com", url.Values{
        "name": {"xxx"},
        "email": {"xxx@qq.com"},
    })
    if err != nil {
        log.Fatal(err.Error())
    }
    defer req.Body.Close()
    body, err := ioutil.ReadAll(req.Body)
    if err != nil {
        log.Fatal(err.Error())
    }
    fmt.Println(string(body))
}

复杂请求

package main

import (
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "github.com/gpmgo/gopm/modules/log"
    "io/ioutil"
    "net/http"
    "net/url"
    "strings"
    "time"
)

type Jar struct {
    cookies []*http.Cookie
}

func (jar *Jar) SetCookies(u *url.URL, cookies []*http.Cookie) {
    jar.cookies = cookies
}
func (jar *Jar) Cookies(u *url.URL) []*http.Cookie {
    return jar.cookies
}

func main() {
    //x509.Certificate.
    pool := x509.NewCertPool()
    //caCertPath := "etcdcerts/ca.crt"
    caCertPath := "certs/cert_server/ca.crt"

    caCrt, err := ioutil.ReadFile(caCertPath)
    if err != nil {
        fmt.Println("ReadFile err:", err)
        return
    }
    pool.AppendCertsFromPEM(caCrt)
    //pool.AddCert(caCrt)

    tr := &http.Transport{
        TLSClientConfig:    &tls.Config{RootCAs: pool},
        DisableCompression: true,
    }
    client := &http.Client{
        Transport:     tr,
        CheckRedirect: nil,
        Jar:           new(Jar),
        Timeout:       time.Second * 3,
    }
    req, err := http.NewRequest("POST", "https://www.baidu.com", strings.NewReader("name=xxx"))
    if err != nil {
        log.Fatal(err.Error())
    }
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.SetBasicAuth("admin", "123456")
    resp, err := client.Do(req)
    if err != nil {
        log.Fatal(err.Error())
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err.Error())
    }
    fmt.Println(string(body))
}

Last updated

Was this helpful?