欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

golang常用的http请求操作

程序员文章站 2022-03-20 22:01:19
之前用python写各种网络请求的时候写的非常顺手,但是当打算用golang写的时候才发现相对来说还是python的那种方式用的更加顺手,习惯golang的用法之后也就差别不大了,下面主要整理了常用的通过golang发起的GET请求以及POST请求的代码例子 golang发起GET请求 基本的GET ......

之前用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))
}