Golang 發起 http 請求:GET 帶參數、POST 發送 Form 和 JSON 數據

1、發起 GET 請求

使用net/http 可以很容易發起 get 請求

package main

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

func main() {
    resp, _ := http.Get("https://httpbin.org/get")
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)

    fmt.Print(string(body))
}

響應

{
  "args"{}, 
  "headers"{
    "Accept-Encoding""gzip", 
    "Host""httpbin.org", 
    "User-Agent""Go-http-client/2.0", 
    "X-Amzn-Trace-Id""Root=1-664863e9-34028ecc4c56c08d6ac5d923"
  }, 
  "origin""127.0.0.1", 
  "url""https://httpbin.org/get"
}

2、發起帶參 GET 請求

使用net/url將查詢參數拼接到 url 上,再使用net/http發起 http 請求

package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
)

func main() {
    targetUrl := "https://httpbin.org/get"

    u, _ := url.ParseRequestURI(targetUrl)

    // URL param
    data := url.Values{}
    data.Set("name""Tom")
    data.Set("age""18")

    u.RawQuery = data.Encode() // URL encode

    fmt.Println(u.String())
    // https://httpbin.org/get?age=18&name=Tom

    resp, _ := http.Get(u.String())

    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)

    fmt.Println(string(body))

}

響應

{
  "args"{
    "age""18", 
    "name""Tom"
  }, 
  "headers"{
    "Accept-Encoding""gzip", 
    "Host""httpbin.org", 
    "User-Agent""Go-http-client/2.0", 
    "X-Amzn-Trace-Id""Root=1-6648641d-0567278a093ee36078e9da27"
  }, 
  "origin""127.0.0.1", 
  "url""https://httpbin.org/get?age=18&
}

3、POST 請求提交 Form 表單

package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
)

func main() {
    targetUrl := "https://httpbin.org/post"

    data := url.Values{}
    data.Set("name""Tom")
    data.Set("age""18")

    resp, _ := http.PostForm(targetUrl, data)

    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)

    fmt.Println(string(body))
}

響應

{
  "args"{}, 
  "data""", 
  "files"{}, 
  "form"{
    "age""18", 
    "name""Tom"
  }, 
  "headers"{
    "Accept-Encoding""gzip", 
    "Content-Length""15", 
    "Content-Type""application/x-www-form-urlencoded", 
    "Host""httpbin.org", 
    "User-Agent""Go-http-client/2.0", 
    "X-Amzn-Trace-Id""Root=1-66486446-48a3d6085e91c39208746892"
  }, 
  "json": null, 
  "origin""127.0.0.1", 
  "url""https://httpbin.org/post"
}

4、POST 請求提交 Json 數據

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

func main() {
    targetUrl := "https://httpbin.org/post"

    data := make(map[string]interface{})
    data["name"] = "Tom"
    data["age"] = 12

    respdata, _ := json.Marshal(data)

    resp, _ := http.Post(targetUrl, "application/json", bytes.NewReader(respdata))
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))

}

響應

{
  "args"{}, 
  "data""{\"age\":12,\"name\":\"Tom\"}", 
  "files"{}, 
  "form"{}, 
  "headers"{
    "Accept-Encoding""gzip", 
    "Content-Length""23", 
    "Content-Type""application/json", 
    "Host""httpbin.org", 
    "User-Agent""Go-http-client/2.0", 
    "X-Amzn-Trace-Id""Root=1-6648646b-1057cc454774771009b19914"
  }, 
  "json"{
    "age": 12, 
    "name""Tom"
  }, 
  "origin""127.0.0.1", 
  "url""https://httpbin.org/post"
}

5、接收響應數據,json 轉爲 map

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

// 定義響應數據結構
type Result struct {
    Args    string            `json:"args"`
    Headers map[string]string `json:"headers"`
    Origin  string            `json:"origin"`
    Url     string            `json:"url"`
}

func main() {
    targetUrl := "https://httpbin.org/get"

    resp, _ := http.Get(targetUrl)
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))

    // 接收返回的數據
    var ret Result

    json.Unmarshal(body, &ret)
    fmt.Printf("%#v\n", ret)

}

響應數據 json 格式

{
  "args"{}, 
  "headers"{
    "Accept-Encoding""gzip", 
    "Host""httpbin.org", 
    "User-Agent""Go-http-client/2.0", 
    "X-Amzn-Trace-Id""Root=1-664854df-48710d487d9f9d97398586ac"
  }, 
  "origin""127.0.0.1", 
  "url""https://httpbin.org/get"
}

響應數據 golang 數據

main.Result{
    Args:"", 
    Headers:map[string]string{
        "Accept-Encoding":"gzip", 
        "Host":"httpbin.org", 
        "User-Agent":"Go-http-client/2.0""X-Amzn-Trace-Id":"Root=1-664854df-48710d487d9f9d97398586ac"
    }, 
    Origin:"127.0.0.1", 
    Url:"https://httpbin.org/get"
}

6、自定義請求頭

通過構建 Request 對象,設置請求頭屬性

package main

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

func main() {
 targetUrl := "http://httpbin.org/get"

 client := &http.Client{}
 req, _ := http.NewRequest("GET", targetUrl, nil)

 req.Header.Add("X-Token""123456")
 req.Header.Add("X-UID""666")

 resp, _ := client.Do(req)
 defer resp.Body.Close()

 body, _ := io.ReadAll(resp.Body)
 fmt.Println(string(body))
}

響應

{
  "args"{}, 
  "headers"{
    "Accept-Encoding""gzip", 
    "Host""httpbin.org", 
    "User-Agent""Go-http-client/1.1", 
    "X-Amzn-Trace-Id""Root=1-664863a4-044bd06c4e4887d73790591a", 
    "X-Token""123456", 
    "X-Uid""666"
  }, 
  "origin""127.0.0.1"
  "url""http://httpbin.org/get"
}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/A7zY0zAzwGMU6MswDis-xw