今天学习一下,如何用原生的http包优雅的发起http请求。
先准备服务端接口,这里使用的是gin框架
package main
import (
"github.com/gin-gonic/gin"
"io/ioutil"
"log"
"net/http"
)
var logger = log.Default()
func main() {
engine := gin.Default()
engine.GET("/get", func(context *gin.Context) {
context.JSON(http.StatusOK, gin.H{
"message": "ok",
})
})
engine.POST("/post", func(context *gin.Context) {
body, _ := ioutil.ReadAll(context.Request.Body)
log.Printf("body:%s", body)
context.JSON(http.StatusOK, gin.H{
"message": "ok",
})
})
engine.POST("/postForm", func(context *gin.Context) {
name := context.PostForm("name")
logger.Printf("name:%s", name)
context.JSON(http.StatusOK, gin.H{
"message": "ok",
})
})
engine.HEAD("/head", func(context *gin.Context) {
context.JSON(http.StatusOK, gin.H{
"message": "ok",
})
})
engine.POST("/complex", func(context *gin.Context) {
// 从url获取拼接参数
env := context.Query("env")
logger.Printf("env:%s", env)
// 获取请求头参数
header := context.Request.Header
logger.Printf("Cookie:%s", header.Get("Cookie"))
logger.Printf("Content-Type:%s", header.Get("Content-Type"))
logger.Printf("Token:%s", header.Get("Token"))
// 获取请求体参数
body, _ := ioutil.ReadAll(context.Request.Body)
log.Printf("body:%s", body)
context.JSON(http.StatusOK, gin.H{
"message": "ok",
})
})
engine.Run(":8080")
}
go官方提供了Get、Head、Post和PostForm函数来发送请求。
package main
import (
"bytes"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
)
var logger = log.Default()
func main() {
resp, err := http.Get("http://localhost:8080/get") // url
if err != nil {
logger.Printf("get请求失败 error: %+v", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
logger.Printf("读取Body失败 error: %+v", err)
return
}
logger.Println(string(body))
}
package main
import (
"bytes"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
)
var logger = log.Default()
func main() {
resp, err := http.Post("http://localhost:8080/post", // url
"text/json;charset=utf-8",// contentType 内容类型
strings.NewReader("{\"name\":\"jack\"}")) // body请求体
if err != nil {
logger.Printf("post请求失败 error: %+v", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
logger.Printf("读取Body失败 error: %+v", err)
return
}
logger.Println(string(body))
}
package main
import (
"bytes"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
)
var logger = log.Default()
func main() {
resp, err := http.PostForm("http://localhost:8080/postForm", // url
url.Values{
"name": {"jack"}, // data
})
if err != nil {
logger.Printf("postForm请求失败 error: %+v", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
logger.Printf("读取Body失败 error: %+v", err)
return
}
logger.Println(string(body))
}
package main
import (
"bytes"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
)
var logger = log.Default()
func main() {
resp, err := http.Head("http://localhost:8080/head")
if err != nil {
logger.Printf("Head请求失败 error: %+v", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
logger.Printf("读取Body失败 error: %+v", err)
return
}
logger.Println(string(body))
}
很多请求下,请求是比较复杂的,下面展示复杂一点的请求。
package main
import (
"bytes"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"time"
)
var logger = log.Default()
func main() {
// 准备入参
// 用户实体
type User struct {
Id int `json:"id"`
Name string `json:"name"`
}
user := User{
Id: 1,
Name: "bob",
}
jsonBytes, err := json.Marshal(user)
if err != nil {
logger.Printf("序列化用户失败!err:%+v", err)
return
}
// 创建客户端
client := &http.Client{}
// 创建请求
request, err := http.NewRequest("POST", "http://localhost:8080/complex?env=dev", bytes.NewReader(jsonBytes))
if err != nil {
logger.Printf("创建请求失败!err:%+v", err)
return
}
// 设置请求头
request.Header.Add("Cookie", "123")
request.Header.Add("Content-Type", "application/json;charset=utf-8")
request.Header.Add("Token", "456")
// 设置1分钟的超时时间
client.Timeout = 1 * time.Minute
// 发起请求
resp, err := client.Do(request)
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
logger.Printf("读取Body失败 error: %+v", err)
return
}
logger.Println(string(body))
}