golang實現各種情況的get請求操作
阿新 • • 發佈:2020-12-19
請求地址
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請求
// 基本get請求 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)) }
請求引數放到url.Values{}
// get請求引數放到 "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") //如果引數中有中文引數,這個方法會進行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)) }
自定義請求(新增頭、cookie)
// 可以設定請求頭 新增cookie func basicGetHeader() { client := http.Client{} req,err := http.NewRequest(http.MethodGet,requestGetURLNoParams,nil) if err != nil { log.Println("err") } // 新增請求頭 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) // 傳送請求 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) 先將所有的響應讀出來放到記憶體中。如果檔案太大,那麼就會消耗很多記憶體 func basicGetDownloadFile() { client := http.Client{} req,imageURL,nil) // strings.NewReader(data) if err != nil { log.Println("err") } resp,err := ioutil.ReadAll(resp.Body) if err != nil { log.Println("err") } ioutil.WriteFile("./images/img.jpg",b,0644) }
接收檔案–io.Copy
// io.Copy() 省去了先把內容讀取到記憶體,然後將記憶體中的內容寫到檔案 func basicGetDownloadFileIoCopy() { client := http.Client{} req,nil) if err != nil { log.Println("err") } resp,err := client.Do(req) if err != nil { log.Println("err") } defer resp.Body.Close() // 建立一個檔案用於儲存 dest,err := os.Create("./images/img.jpg") if err != nil { log.Println("err") } defer dest.Close() // 然後將響應流和檔案流對接起來 _,err = io.Copy(dest,resp.Body) if err != nil { log.Println("err") } }
補充:golang(go語言)訊息傳遞(管道)方法實現傳送多個get請求
1.需求說明
我用django rest framework寫了一個簡單的使用者增刪改查小案例,然後我想使用golang實現一個多併發請求,看看我的小專案能承受多少請求!初學go程式碼不正確,請多多指點。
2.程式碼實現
//基本的GET請求 package main import ( "fmt" "io/ioutil" "net/http" "time" ) // HTTP get請求 func httpget(ch chan int){ resp,err := http.Get("http://localhost:8000/rest/api/user") if err != nil { fmt.Println(err) return } defer resp.Body.Close() body,err := ioutil.ReadAll(resp.Body) fmt.Println(string(body)) fmt.Println(resp.StatusCode) if resp.StatusCode == 200 { fmt.Println("ok") } ch <- 1 } // 主方法 func main() { start := time.Now() // 注意設定緩衝區大小要和開啟協程的個人相等 chs := make([]chan int,2000) for i := 0; i < 2000; i++ { chs[i] = make(chan int) go httpget(chs[i]) } for _,ch := range chs { <- ch } end := time.Now() consume := end.Sub(start).Seconds() fmt.Println("程式執行耗時(s):",consume) }
3.結果
當我把開了10000個協程時候django後臺資料庫就崩了哈哈應該連線數過大導致的,所以我就試了2000個感覺有點併發的意思哈哈!左側是返回的json結果 右側是django的後臺!
4.總結
我們通過go語言的管道channel來實現併發請求,能夠解決何避免傳統共享記憶體實現併發的很多問題而且效率會高於共享記憶體的方法。