Go | Go 發(fā)送 http 請(qǐng)求: post枢舶,get,put替久,delete請(qǐng)求示例代碼


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 中哮肚,

  1. 通過 kv 形式傳送登夫,例如 form-datax-www-form-urlencoded
  2. 通過 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)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市碳褒,隨后出現(xiàn)的幾起案子折砸,更是在濱河造成了極大的恐慌,老刑警劉巖沙峻,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睦授,死亡現(xiàn)場離奇詭異,居然都是意外死亡摔寨,警方通過查閱死者的電腦和手機(jī)去枷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來是复,“玉大人删顶,你說我怎么就攤上這事∮铀瘢” “怎么了翼闹?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蒋纬。 經(jīng)常有香客問我,道長坚弱,這世上最難降的妖魔是什么蜀备? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮荒叶,結(jié)果婚禮上碾阁,老公的妹妹穿的比我還像新娘。我一直安慰自己些楣,他們只是感情好脂凶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愁茁,像睡著了一般蚕钦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹅很,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天嘶居,我揣著相機(jī)與錄音,去河邊找鬼促煮。 笑死邮屁,一個(gè)胖子當(dāng)著我的面吹牛整袁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播佑吝,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坐昙,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了芋忿?” 一聲冷哼從身側(cè)響起民珍,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盗飒,沒想到半個(gè)月后嚷量,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逆趣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蝶溶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宣渗。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抖所,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痕囱,到底是詐尸還是另有隱情田轧,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布鞍恢,位于F島的核電站傻粘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帮掉。R本人自食惡果不足惜弦悉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蟆炊。 院中可真熱鬧稽莉,春花似錦、人聲如沸涩搓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昧甘。三九已至良拼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疾层,已是汗流浹背将饺。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人予弧。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓刮吧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掖蛤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杀捻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容