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