Golang-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.Body:

    resp, err := http.Get("http://example.com/")
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    // ...
  • 自定义Header

    client := &http.Client{
        CheckRedirect: redirectPolicyFunc,
    }
    
    req, err := http.NewRequest("GET", "http://example.com", nil)
    req.Header.Add("If-None-Match", `W/"wyzzy"`)
    resp, err := client.Do(req)
  • 连接控制,比如超时时间等

    tr := &http.Transport{
        MaxIdleConns:       10,
        IdleConnTimeout:    30 * time.Second,
        DisableCompression: true,
    }
    client := &http.Client{Transport: tr}
    resp, err := client.Get("https://example.com")

响应请求

  • 简单响应

    http.Handle("/foo", fooHandler)
    
    http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
    })
    
    log.Fatal(http.ListenAndServe(":8080", nil))
  • 自定义控制响应

    s := &http.Server{
        Addr:           ":8080",
        Handler:        myHandler,
        ReadTimeout:    10 * time.Second,
        WriteTimeout:   10 * time.Second,
        MaxHeaderBytes: 1 << 20,
    }
    log.Fatal(s.ListenAndServe())

一个简单的Demo

package main

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

func main() {
    http.HandleFunc("/", home)
    fmt.Println("url: http://localhost:8080 ")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe", err)
    }
}

// 默认处理
func home(writer http.ResponseWriter, request *http.Request) {
    http.Get("https://api.github.com/users/jiangkang")
    client := &http.Client{}
    req, _ := http.NewRequest(http.MethodGet, "https://api.github.com/users/jiangkang", nil)
    req.Header.Add("Accept", "application/vnd.github.v3+json")
    response, _ := client.Do(req)
    body, _ := ioutil.ReadAll(response.Body)
    writer.Write(body)
}

处理表单数据/Query数据

对于表单数据和Query中的参数,都可以使用request.ParseForm()进行解析.

func login(writer http.ResponseWriter, request *http.Request) {
    if request.Method == http.MethodGet {
        t,_ := template.ParseFiles("html/login.html")
        t.Execute(writer,nil)
    } else if request.Method == http.MethodPost {
        request.ParseForm()
        username := request.Form.Get("username")
        password := request.Form.Get("password")
        fmt.Fprintf(writer,"登陆成功:username: %s \n, password: %s",username,password)
    }
}

request.Form是一个map[string][]string类型,对应Java的 Map<String,Array<String>>.

使用form.Get()可以获取单个值.

….未完待续


文章作者: 姜康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜康 !
评论
 上一篇
Golang-处理json Golang-处理json
Marshalmarshal的中文意思是“编码”,“数据打包”的意思 基本操作编码json.Marshal(v interface{}) ([]byte, error) 即将一个struct对象序列化成字节数组. 解码json.Unmars
2020-12-02
下一篇 
浅谈TLS 浅谈TLS
基本概念TLS协议的目的就是为网络通信的两端提供一个安全的通道. 具有以下特性: 身份认证 确保交换信息的各方是他们声称的身份 加密 通道上传输的数据仅对两个端点可见. 不过TLS默认并不隐藏传输数据的长度,但是两端可以向TLS记录中填
2020-11-29
  目录