• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang实现各种情况的get请求操作

    请求地址

    var (
     requestGetURLNoParams string = "http://httpbin.org/get"
     requestGetURL   string = "http://httpbin.org/get?a=ab=bc=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, 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() 省去了先把内容读取到内存,然后将内存中的内容写到文件
    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()
     // 创建一个文件用于保存
     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来实现并发请求,能够解决何避免传统共享内存实现并发的很多问题而且效率会高于共享内存的方法。

    您可能感兴趣的文章:
    • golang gopm get -g -v 无法获取第三方库的解决方案
    • golang语言http协议get拼接参数操作
    • Golang发送http GET请求的示例代码
    • Golang执行go get私有库提示"410 Gone" 的问题及解决办法
    • golang使用http client发起get和post请求示例
    • 完美解决golang go get私有仓库的问题
    上一篇:Golang 实现分片读取http超大文件流和并发控制
    下一篇:在go文件服务器加入http.StripPrefix的用途介绍
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang实现各种情况的get请求操作 golang,实现,各种,情况,的,