golang常用的http请求操作
之前用python写各种网络请求的时候写的非常顺手,但是当打算用golang写的时候才发现相对来说还是python的那种方式用的更加顺手,习惯golang的用法之后也就差别不大了,下面主要整理了常用的通过golang发起的GET请求以及POST请求的代码例子
golang发起GET请求
基本的GET请求
//基本的GET请求
packagemain
import(
"fmt"
"io/ioutil"
"net/http"
)
funcmain(){
resp,err:=http.Get("http://httpbin.org/get")
iferr!=nil{
fmt.Println(err)
return
}
deferresp.Body.Close()
body,err:=ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
fmt.Println(resp.StatusCode)
ifresp.StatusCode==200{
fmt.Println("ok")
}
}
带参数的Get请求
packagemain
import(
"fmt"
"io/ioutil"
"net/http"
)
funcmain(){
resp,err:=http.Get("http://httpbin.org/get?name=zhaofan&age=23")
iferr!=nil{
fmt.Println(err)
return
}
deferresp.Body.Close()
body,_:=ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
但是如果我们想要把一些参数做成变量而不是直接放到url中怎么操作,代码例子如下:
packagemain
import(
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
funcmain(){
params:=url.Values{}
Url,err:=url.Parse("http://httpbin.org/get")
iferr!=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)
deferresp.Body.Close()
body,_:=ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
解析JSON类型的返回结果
packagemain
import(
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
typeresultstruct{
Argsstring`json:"args"`
Headersmap[string]string`json:"headers"`
Originstring`json:"origin"`
Urlstring`json:"url"`
}
funcmain(){
resp,err:=http.Get("http://httpbin.org/get")
iferr!=nil{
return
}
deferresp.Body.Close()
body,_:=ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
varresresult
_=json.Unmarshal(body,&res)
fmt.Printf("%#v",res)
}
GET请求添加请求头
packagemain
import(
"fmt"
"io/ioutil"
"net/http"
)
funcmain(){
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使用
packagemain
import(
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
funcmain(){
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"
}
另外一种方式
packagemain
import(
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
funcmain(){
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请求
packagemain
import(
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
funcmain(){
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请求
packagemain
import(
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
funcmain(){
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))
}
原文链接: