zoukankan      html  css  js  c++  java
  • golang常用的http请求操作

    之前用python写各种网络请求的时候写的非常顺手,但是当打算用golang写的时候才发现相对来说还是python的那种方式用的更加顺手,习惯golang的用法之后也就差别不大了,下面主要整理了常用的通过golang发起的GET请求以及POST请求的代码例子

    golang发起GET请求

    基本的GET请求

    //基本的GET请求
    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
    )
    
    func main() {
        resp, err := http.Get("http://httpbin.org/get")
        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")
        }
    }

    带参数的Get请求

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
    )
    
    func main(){
        resp, err := http.Get("http://httpbin.org/get?name=zhaofan&age=23")
        if err != nil {
            fmt.Println(err)
            return
        }
        defer resp.Body.Close()
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Println(string(body))
    
    }

    但是如果我们想要把一些参数做成变量而不是直接放到url中怎么操作,代码例子如下:

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
        "net/url"
    )
    
    func main(){
        params := url.Values{}
        Url, err := url.Parse("http://httpbin.org/get")
        if err != nil {
            return
        }
        params.Set("name","zhaofan")
        params.Set("age","23")
        //如果参数中有中文参数,这个方法会进行URLEncode
        Url.RawQuery = params.Encode()
        urlPath := Url.String()
        fmt.Println(urlPath) // https://httpbin.org/get?age=23&name=zhaofan
        resp,err := http.Get(urlPath)
        defer resp.Body.Close()
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Println(string(body))
    }

    解析JSON类型的返回结果

    package main
    
    import (
        "encoding/json"
        "fmt"
        "io/ioutil"
        "net/http"
    )
    
    type result struct {
        Args string `json:"args"`
        Headers map[string]string `json:"headers"`
        Origin string `json:"origin"`
        Url string `json:"url"`
    }
    
    func main() {
        resp, err := http.Get("http://httpbin.org/get")
        if err != nil {
            return
        }
        defer resp.Body.Close()
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Println(string(body))
        var res result
        _ = json.Unmarshal(body,&res)
        fmt.Printf("%#v", res)
    }

    GET请求添加请求头

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
    )
    
    func main() {
        client := &http.Client{}
        req,_ := http.NewRequest("GET","http://httpbin.org/get",nil)
        req.Header.Add("name","zhaofan")
        req.Header.Add("age","3")
        resp,_ := client.Do(req)
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Printf(string(body))
    }

    从上述的结果可以看出我们设置的头是成功了:

    {
      "args": {}, 
      "headers": {
        "Accept-Encoding": "gzip", 
        "Age": "3", 
        "Host": "httpbin.org", 
        "Name": "zhaofan", 
        "User-Agent": "Go-http-client/1.1"
      }, 
      "origin": "211.138.20.170, 211.138.20.170", 
      "url": "https://httpbin.org/get"
    }

    golang 发起POST请求

    基本的POST使用

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
        "net/url"
    )
    
    func main() {
        urlValues := url.Values{}
        urlValues.Add("name","zhaofan")
        urlValues.Add("age","22")
        resp, _ := http.PostForm("http://httpbin.org/post",urlValues)
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Println(string(body))
    }

    结果如下:

    {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "age": "22", 
        "name": "zhaofan"
      }, 
      "headers": {
        "Accept-Encoding": "gzip", 
        "Content-Length": "19", 
        "Content-Type": "application/x-www-form-urlencoded", 
        "Host": "httpbin.org", 
        "User-Agent": "Go-http-client/1.1"
      }, 
      "json": null, 
      "origin": "211.138.20.170, 211.138.20.170", 
      "url": "https://httpbin.org/post"
    }

    另外一种方式

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
        "net/url"
        "strings"
    )
    
    func main() {
        urlValues := url.Values{
            "name":{"zhaofan"},
            "age":{"23"},
        }
        reqBody:= urlValues.Encode()
        resp, _ := http.Post("http://httpbin.org/post", "text/html",strings.NewReader(reqBody))
        body,_:= ioutil.ReadAll(resp.Body)
        fmt.Println(string(body))
    }

    结果如下:

    {
      "args": {}, 
      "data": "age=23&name=zhaofan", 
      "files": {}, 
      "form": {}, 
      "headers": {
        "Accept-Encoding": "gzip", 
        "Content-Length": "19", 
        "Content-Type": "text/html", 
        "Host": "httpbin.org", 
        "User-Agent": "Go-http-client/1.1"
      }, 
      "json": null, 
      "origin": "211.138.20.170, 211.138.20.170", 
      "url": "https://httpbin.org/post"
    }

    发送JSON数据的post请求

    package main
    
    import (
        "bytes"
        "encoding/json"
        "fmt"
        "io/ioutil"
        "net/http"
    )
    
    func main() {
        client := &http.Client{}
        data := make(map[string]interface{})
        data["name"] = "zhaofan"
        data["age"] = "23"
        bytesData, _ := json.Marshal(data)
        req, _ := http.NewRequest("POST","http://httpbin.org/post",bytes.NewReader(bytesData))
        resp, _ := client.Do(req)
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Println(string(body))
    
    }

    结果如下:

    {
      "args": {}, 
      "data": "{"age":"23","name":"zhaofan"}", 
      "files": {}, 
      "form": {}, 
      "headers": {
        "Accept-Encoding": "gzip", 
        "Content-Length": "29", 
        "Host": "httpbin.org", 
        "User-Agent": "Go-http-client/1.1"
      }, 
      "json": {
        "age": "23", 
        "name": "zhaofan"
      }, 
      "origin": "211.138.20.170, 211.138.20.170", 
      "url": "https://httpbin.org/post"
    }

    不用client的post请求

    package main
    
    import (
        "bytes"
        "encoding/json"
        "fmt"
        "io/ioutil"
        "net/http"
    )
    
    func main() {
        data := make(map[string]interface{})
        data["name"] = "zhaofan"
        data["age"] = "23"
        bytesData, _ := json.Marshal(data)
        resp, _ := http.Post("http://httpbin.org/post","application/json", bytes.NewReader(bytesData))
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Println(string(body))
    }
  • 相关阅读:
    浏览器extension
    windows 下使用免安装版的mysql
    windows下好用的工具
    那些没来得及做的事
    OSI模型的一张图
    倒计时输出脚本
    selenium忽略链接不安全页面提示的方法
    selenium控制浏览器滚动条缓慢下拉到最底
    paramiko连接主机基本操作
    django点击前端按钮展示后台列表
  • 原文地址:https://www.cnblogs.com/zhaof/p/11346412.html
Copyright © 2011-2022 走看看