• Go语言-基本的http请求操作


    Go发起GET请求

    基本的GET请求

    //基本的GET请求
    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
    )
    
    func main() {
        resp, err := http.Get("http://www.hao123.com")
        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://www.baidu.com?name=Paul_Chan&age=26")
        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://www.baidu.com")
        if err != nil {
            return
        }
        params.Set("name","Paul_Chan")
        params.Set("age","26")
        //如果参数中有中文参数,这个方法会进行URLEncode
        Url.RawQuery = params.Encode()
        urlPath := Url.String()
        fmt.Println(urlPath) // https://www.baidu.com?age=26&name=Paul_chan
        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://xxx.com")
        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://xxx.com",nil)
        req.Header.Add("name","Paul_Chan")
        req.Header.Add("age","26")
        resp,_ := client.Do(req)
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Printf(string(body))
    }
    

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

    {
      "args": {}, 
      "headers": {
        "Accept-Encoding": "gzip", 
        "Age": "26", 
        "Host": "xxx.com", 
        "Name": "Paul_Chan", 
        "User-Agent": "Go-http-client/1.1"
      }, 
      "origin": "211.138.20.170, 211.138.20.170", 
      "url": "https://xxx.com"
    }
    

    golang 发起POST请求

    基本的POST使用

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
        "net/url"
    )
    
    func main() {
        urlValues := url.Values{}
        urlValues.Add("name","Paul_Chan")
        urlValues.Add("age","26")
        resp, _ := http.PostForm("http://xxx.com/post",urlValues)
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Println(string(body))
    }
    //结果如下:
    /******************
    {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "age": "26", 
        "name": "Paul_Chan"
      }, 
      "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":{"Paul_Chan"},
            "age":{"26"},
        }
        reqBody:= urlValues.Encode()
        resp, _ := http.Post("http://xxx.com/post", "text/html",strings.NewReader(reqBody))
        body,_:= ioutil.ReadAll(resp.Body)
        fmt.Println(string(body))
    }
    //结果如下:
    /**************
    {
      "args": {}, 
      "data": "age=26&name=Paul_Chan", 
      "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))
    }
    

    做任何事情,都要以创业的心态去干!

  • 相关阅读:
    通过 AWS CLI 操作 AWS S3
    AWS S3文件存储服务器搭建(新)
    Vertx 接入MongoDB (九)
    Vertx 接入Redis (八)
    Vertx Mysql数据库优化 (七)
    Vertx 接入Mysql数据库 (六)
    Vertx 实现webapi实战项目(五)
    Vertx 实现webapi实战项目(四)
    Vertx 实现webapi实战项目(三)
    正则表达式:元字符(基本可用来匹配的字符)
  • 原文地址:https://www.cnblogs.com/Paul-watermelon/p/11386392.html
Copyright © 2020-2023  润新知