Table of Contents
HTTP 請(qǐng)求方法
根據(jù) HTTP 標(biāo)準(zhǔn)凉泄,HTTP 請(qǐng)求可以使用多種請(qǐng)求方法。
在日常開發(fā)中大多數(shù)會(huì)用到 5 種請(qǐng)求方法: GET蚯根、POST后众、PUT、PATCH 和 DELETE
方法 | 描述 |
---|---|
GET | 請(qǐng)求指定的頁面信息颅拦,并返回實(shí)體主體蒂誉。 |
POST | 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中距帅。POST 請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改右锨。 |
PUT | 從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。 |
DELETE | 請(qǐng)求服務(wù)器刪除指定的頁面锥债。 |
PATCH | 是對(duì) PUT 方法的補(bǔ)充陡蝇,用來對(duì)已知資源進(jìn)行局部更新。 |
請(qǐng)求示例
GET
http.Get 直接訪問
import (
"net/http"
)
response, err := http.Get("https://b959e645-00ae-4bc3-8a55-7224d08b1d91.mock.pstmn.io/user/1")
這種方法適合不需要 header 的方式
自定義參數(shù)訪問
import (
"net/http"
)
url := "https://b959e645-00ae-4bc3-8a55-7224d08b1d91.mock.pstmn.io/user/1"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "xxxx")
response, err := http.DefaultClient.Do(req)
這種方法適合需要自定義一些 header 的場景
在查看 http.Get
方法源碼時(shí), 可以看出其是一個(gè)簡便使用方式
func (c *Client) Get(url string) (resp *Response, err error) {
req, err := NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
return c.Do(req)
}
POST
在 POST 方式一般常用的為 2 中哮肚,
- 通過 kv 形式傳送登夫,例如
form-data
和x-www-form-urlencoded
- 通過 json 形式傳送,例如
application/json
kv 形式
import (
"net/http"
"strings"
)
url := "https://blog.csdn.net/zyndev"
payload := strings.NewReader("a=111")
response, err := http.Post(url, "application/x-www-form-urlencoded", payload)
除了通過 http.Post 還可以使用 http.PostForm
import (
"net/http"
"net/url"
)
targetUrl := "https://blog.csdn.net/zyndev"
payload := url.Values{"key":{"value"}, "id": {"123"}}
response, err := http.PostForm(targetUrl, payload)
json
targetUrl := "https://b959e645-00ae-4bc3-8a55-7224d08b1d91.mock.pstmn.io/user/1"
payload := strings.NewReader("{\"name\":\"張瑀楠\"}")
req, _ := http.NewRequest("POST", targetUrl, payload)
req.Header.Add("Content-Type", "application/json")
response, err := http.DefaultClient.Do(req)
PUT
由于 net/http
沒有提供簡化的 PUT
請(qǐng)求允趟,這里需要使用 http.NewRequest
來創(chuàng)建請(qǐng)求
targetUrl := "https://b959e645-00ae-4bc3-8a55-7224d08b1d91.mock.pstmn.io/user/1"
payload := strings.NewReader("{\"name\":\"張瑀楠\"}")
req, _ := http.NewRequest("PUT", targetUrl, payload)
req.Header.Add("Content-Type", "application/json")
response, err := http.DefaultClient.Do(req)
PATCH
由于 net/http
沒有提供簡化的 PATCH
請(qǐng)求恼策,這里需要使用 http.NewRequest
來創(chuàng)建請(qǐng)求
targetUrl := "https://b959e645-00ae-4bc3-8a55-7224d08b1d91.mock.pstmn.io/user/1"
payload := strings.NewReader("{\"name\":\"張瑀楠\"}")
req, _ := http.NewRequest("PATCH", targetUrl, payload)
req.Header.Add("Content-Type", "application/json")
response, err := http.DefaultClient.Do(req)
DELETE
由于 net/http
沒有提供簡化的 DELETE
請(qǐng)求,這里需要使用 http.NewRequest
來創(chuàng)建請(qǐng)求
targetUrl := "https://ddbc5ffb-c596-4f78-a99d-a6ea93bdc14f.mock.pstmn.io/user/1"
req, _ := http.NewRequest("DELETE", targetUrl, nil)
req.Header.Add("Authorization", "xxxx")
response, err := http.DefaultClient.Do(req)
處理響應(yīng)
從上面的請(qǐng)示示例中看出,不管使用何種方式請(qǐng)求涣楷,最后都會(huì)得到 response, err
, 也就是不管發(fā)起請(qǐng)求的方式是什么分唾,處理的邏輯都是一樣。
... // 一堆請(qǐng)求方法構(gòu)建方式
response, err := http.DefaultClient.Do(req)
if err != nil {
// 錯(cuò)誤邏輯處理
}
defer response.Body.Close() // 這步是必要的狮斗,防止以后的內(nèi)存泄漏绽乔,切記
fmt.Println(response.StatusCode) // 獲取狀態(tài)碼
fmt.Println(response.Status) // 獲取狀態(tài)碼對(duì)應(yīng)的文案
fmt.Println(response.Header) // 獲取響應(yīng)頭
body, _ := ioutil.ReadAll(response.Body) // 讀取響應(yīng) body, 返回為 []byte
fmt.Println(string(body)) // 轉(zhuǎn)成字符串看一下結(jié)果
源碼參考
完成測試代碼
package http_demo
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
"testing"
)
func TestHttpGet(t *testing.T) {
response, err := http.Get("https://b959e645-00ae-4bc3-8a55-7224d08b1d91.mock.pstmn.io/user/1")
if err != nil {
t.Error(err)
panic(err)
}
defer response.Body.Close()
t.Log(response)
fmt.Println(response.StatusCode)
fmt.Println(response.Status)
fmt.Println(response.Header)
body, _ := ioutil.ReadAll(response.Body)
fmt.Println(string(body))
}
func TestHttpGetHeader(t *testing.T) {
targetUrl := "https://b959e645-00ae-4bc3-8a55-7224d08b1d91.mock.pstmn.io/user/1"
req, _ := http.NewRequest("GET", targetUrl, nil)
req.Header.Add("Authorization", "xxxx")
response, err := http.DefaultClient.Do(req)
if err != nil {
t.Error(err)
panic(err)
}
defer response.Body.Close()
t.Log(response)
}
func TestHttpPost(t *testing.T) {
targetUrl := "https://blog.csdn.net/zyndev"
payload := strings.NewReader("a=111")
response, err := http.Post(targetUrl, "x-www-form-urlencoded", payload)
if err != nil {
t.Error(err)
panic(err)
}
defer response.Body.Close()
t.Log(response)
}
func TestHttpPostForm(t *testing.T) {
targetUrl := "https://blog.csdn.net/zyndev"
payload := url.Values{"key": {"value"}, "id": {"123"}}
response, err := http.PostForm(targetUrl, payload)
if err != nil {
t.Error(err)
panic(err)
}
defer response.Body.Close()
t.Log(response)
}
func TestHttpPostJSON(t *testing.T) {
targetUrl := "https://b959e645-00ae-4bc3-8a55-7224d08b1d91.mock.pstmn.io/user/1"
payload := strings.NewReader("{\"name\":\"張瑀楠\"}")
req, _ := http.NewRequest("POST", targetUrl, payload)
req.Header.Add("Content-Type", "application/json")
response, err := http.DefaultClient.Do(req)
if err != nil {
t.Error(err)
panic(err)
}
defer response.Body.Close()
t.Log(response)
}
func TestHttpPut(t *testing.T) {
targetUrl := "https://b959e645-00ae-4bc3-8a55-7224d08b1d91.mock.pstmn.io/user/1"
payload := strings.NewReader("{\"name\":\"張瑀楠\"}")
req, _ := http.NewRequest("PUT", targetUrl, payload)
req.Header.Add("Content-Type", "application/json")
response, err := http.DefaultClient.Do(req)
if err != nil {
t.Error(err)
panic(err)
}
defer response.Body.Close()
t.Log(response)
}
func TestHttpPatch(t *testing.T) {
targetUrl := "https://b959e645-00ae-4bc3-8a55-7224d08b1d91.mock.pstmn.io/user/1"
payload := strings.NewReader("{\"name\":\"張瑀楠\"}")
req, _ := http.NewRequest("PATCH", targetUrl, payload)
req.Header.Add("Content-Type", "application/json")
response, err := http.DefaultClient.Do(req)
if err != nil {
t.Error(err)
panic(err)
}
defer response.Body.Close()
t.Log(response)
}
func TestHttpDelete(t *testing.T) {
targetUrl := "https://ddbc5ffb-c596-4f78-a99d-a6ea93bdc14f.mock.pstmn.io/user/1"
req, _ := http.NewRequest("DELETE", targetUrl, nil)
req.Header.Add("Authorization", "xxxx")
response, err := http.DefaultClient.Do(req)
if err != nil {
t.Error(err)
panic(err)
}
defer response.Body.Close()
t.Log(response)
}