golang原生http包實(shí)現(xiàn)各種情況的get請(qǐng)求方式
更新時(shí)間:2024年08月08日 14:55:43 作者:千年恨
這篇文章主要介紹了golang原生http包實(shí)現(xiàn)各種情況的get請(qǐng)求方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
go http get 總結(jié)
請(qǐng)求地址
var ( requestGetURLNoParams string = "http://httpbin.org/get" requestGetURL string = "http://httpbin.org/get?a=a&b=b&c=ccc" imageURL string = "http://httpbin.org/image" )
普通get請(qǐng)求
// 基本get請(qǐng)求
func basicGet() {
resp, err := http.Get(requestGetURLNoParams)
if err != nil {
log.Println("err")
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println("err")
}
fmt.Println(string(b))
}
請(qǐng)求參數(shù)放到url.Values{}
// get請(qǐng)求參數(shù)放到 "net/url"
func basicGetURLParams() {
params := url.Values{}
parseURL, err := url.Parse(requestGetURLNoParams)
if err != nil {
log.Println("err")
}
params.Set("aaa", "aaa")
params.Set("age", "23")
//如果參數(shù)中有中文參數(shù),這個(gè)方法會(huì)進(jìn)行URLEncode
parseURL.RawQuery = params.Encode()
urlPathWithParams := parseURL.String()
resp, err := http.Get(urlPathWithParams)
if err != nil {
log.Println("err")
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println("err")
}
fmt.Println(string(b))
}
自定義請(qǐng)求(添加頭、cookie)
// 可以設(shè)置請(qǐng)求頭 添加cookie
func basicGetHeader() {
client := http.Client{}
req, err := http.NewRequest(http.MethodGet, requestGetURLNoParams, nil)
if err != nil {
log.Println("err")
}
// 添加請(qǐng)求頭
req.Header.Add("Content-type", "application/json;charset=utf-8")
req.Header.Add("header", "header????")
// 添加cookie
cookie1 := &http.Cookie{
Name: "aaa",
Value: "aaa-value",
}
req.AddCookie(cookie1)
// 發(fā)送請(qǐng)求
resp, err := client.Do(req)
if err != nil {
log.Println("err")
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println("err")
}
fmt.Println(string(b))
}
接收文件–ioutil.WriteFile
// ioutil.ReadAll(resp.Body) 先將所有的響應(yīng)讀出來(lái)放到內(nèi)存中。如果文件太大,那么就會(huì)消耗很多內(nèi)存
func basicGetDownloadFile() {
client := http.Client{}
req, err := http.NewRequest(http.MethodGet, imageURL, nil) // strings.NewReader(data)
if err != nil {
log.Println("err")
}
resp, err := client.Do(req)
if err != nil {
log.Println("err")
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println("err")
}
ioutil.WriteFile("./images/img.jpg", b, 0644)
}
接收文件–io.Copy
// io.Copy() 省去了先把內(nèi)容讀取到內(nèi)存,然后將內(nèi)存中的內(nèi)容寫(xiě)到文件
func basicGetDownloadFileIoCopy() {
client := http.Client{}
req, err := http.NewRequest(http.MethodGet, imageURL, nil)
if err != nil {
log.Println("err")
}
resp, err := client.Do(req)
if err != nil {
log.Println("err")
}
defer resp.Body.Close()
// 創(chuàng)建一個(gè)文件用于保存
dest, err := os.Create("./images/img.jpg")
if err != nil {
log.Println("err")
}
defer dest.Close()
// 然后將響應(yīng)流和文件流對(duì)接起來(lái)
_, err = io.Copy(dest, resp.Body)
if err != nil {
log.Println("err")
}
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
go語(yǔ)言中切片Slice與數(shù)組Array對(duì)比以及panic:?runtime?error:?index?out?
go語(yǔ)言中數(shù)組與其他語(yǔ)言有在顯著的不同,包括其不能夠進(jìn)行添加,以及值拷貝的特性,下面這篇文章主要給大家介紹了關(guān)于go語(yǔ)言中切片Slice與數(shù)組Array對(duì)比以及panic:?runtime?error:?index?out?of?range問(wèn)題解決的相關(guān)資料,需要的朋友可以參考下2022-07-07
淺析Go語(yǔ)言容器之?dāng)?shù)組和切片的使用
在?Java?的核心庫(kù)中,集合框架可謂鼎鼎大名:Array?、List、Set等等,隨便拎一個(gè)出來(lái)都值得開(kāi)發(fā)者好好學(xué)習(xí)如何使用甚至是背后的設(shè)計(jì)源碼。雖然Go語(yǔ)言沒(méi)有如此豐富的容器類型,但也有一些基本的容器供開(kāi)發(fā)者使用,接下來(lái)讓我們認(rèn)識(shí)一下這些容器類型吧2022-11-11
深度剖析Golang如何實(shí)現(xiàn)GC掃描對(duì)象
這篇文章主要為大家詳細(xì)介紹了Golang是如何實(shí)現(xiàn)GC掃描對(duì)象的,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考一下2023-03-03
詳解Golang中interface{}的注意事項(xiàng)
學(xué)習(xí)?golang?,對(duì)于?interface{}?接口類型,我們一定繞不過(guò),這篇文章咱們就來(lái)一起來(lái)看看?使用?interface{}?的時(shí)候,都有哪些注意事項(xiàng)吧2023-03-03

