目录
概述:
服务端:
客户端:
运行结果:
概述: 先运行服务端代码,再运行客户端代码(分两个服务分别运行,url:port 需对应) 服务端: post本机请求地址:http://127.0.0.1:8080/postReqget本机请求地址:http://127.0.0.1:8080/getReq
package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
type PostReqType struct {
Id int `json:"id"`
Name string `json:"name"`
}
router := gin.New()
// post请求
router.POST("/postReq", func(ctx *gin.Context) {
var req PostReqType
err := ctx.ShouldBindJSON(&req) // 解析req参数
if err != nil {
fmt.Println("ctx.ShouldBindJSON err: ", err)
return
}
rspMap := map[string]interface{}{ // 也可用结构体方式返回
"code": 0,
"rsp": fmt.Sprintf("welcome %v!", req.Name),
}
ctx.JSON(http.StatusOK, rspMap)
fmt.Printf("rsp: %+v\n", rspMap)
})
// get请求(浏览器默认为GET请求:http://127.0.0.1:8080/getReq)
router.GET("/getReq", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, map[string]interface{}{
"code": 0,
"rsp": fmt.Sprintf("welcome!"),
})
})
router.Run(":8080") // 8080端口,底层调用的是net/http包,也是单独启协程进行监听
return
}
客户端:
注意:post/get请求地址url需要与服务端一一对应,get请求可以用浏览器测试.
补充示例:网上随便找的天气预报Get请求接口,末尾的cityid为城市编号:https://www.weatherol.cn/api/home/getCurrAnd15dAnd24h?cityid=101280601
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
)
// 1、测试post请求
func TestPostReq() {
reqMap := map[string]interface{}{
"id": 123465,
"name": "dreamer",
}
body, err := json.Marshal(reqMap)
if err != nil {
fmt.Println("TestPostReq json.Marshal err:", err)
return
}
url := "http://127.0.0.1:8080/postReq"
req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(body))
if err != nil {
fmt.Println("TestPostReq http.NewRequest err:", err)
return
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: 5 * time.Second} // 设置请求超时时长5s
resp, err := client.Do(req)
if err != nil {
fmt.Println("TestPostReq http.DefaultClient.Do() err: ", err)
return
}
defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("TestPostReq ioutil.ReadAll() err: ", err)
return
}
fmt.Println("respBody: ", string(respBody))
rsp := make(map[string]interface{})
err = json.Unmarshal(respBody, &rsp)
if err != nil {
fmt.Println("TestPostReq json.Unmarshal() err: ", err)
return
}
fmt.Printf("rsp: %+v", rsp)
// 最后经过字段筛选后,再序列化成json格式即可
// result, err := json.Marshal(rsp)
// if err != nil {
// fmt.Println("TestPostReq json.Marrshal() err2: ", err)
// return
// }
// fmt.Println(string(result))
}
type Rsp struct {
// Code int `json:"code"` // 比如这里仅需要rsp字段(视具体情况而定),那Rsp结构体不解析code字段即可~
Rsp string `json:"rsp"`
}
// 2、测试get请求
func TestGetReq() {
url := "http://127.0.0.1:8080/getReq"
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
fmt.Println("TestGetReq http.NewRequest err:", err)
return
}
client := &http.Client{Timeout: 5 * time.Second} // 设置请求超时时长5s
resp, err := client.Do(req)
if err != nil {
fmt.Println("TestGetReq http.DefaultClient.Do() err: ", err)
return
}
defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("TestGetReq ioutil.ReadAll() err: ", err)
return
}
// fmt.Println("respBody: ", string(respBody))
var rsp Rsp
err = json.Unmarshal(respBody, &rsp)
if err != nil {
fmt.Println("TestGetReq json.Unmarshal() err: ", err)
return
}
// 最后经过字段筛选后,再序列化成json格式即可(比如这里仅需要rsp字段(视具体情况而定),那Rsp结构体不解析code字段即可~)
result, err := json.Marshal(rsp)
if err != nil {
fmt.Println("TestGetReq json.Marrshal() err2: ", err)
return
}
fmt.Println(string(result))
}
// 3、补充示例:网上随便找的天气预报Get请求接口
type WeatherInfo struct {
Data struct {
Current struct {
Tips string `json:"tips"`
NongLi string `json:"nongLi"`
SubCurrent struct {
Temperature string `json:"temperature"` // 气温
Weather string `json:"weather"` // 天气,如:多云...
Winddir string `json:"winddir"` // 风向
Windpower string `json:"windpower"` // 风力
Reporttime string `json:"reporttime"` // 更新时间
} `json:"current"`
} `json:"current"`
} `json:"data"`
}
func TestWeatherForecast() {
url := "https://www.weatherol.cn/api/home/getCurrAnd15dAnd24h?cityid=101280601" // 网上随便找的天气预报url,末尾的cityid为城市编号
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
fmt.Println("TestGetReq http.NewRequest err:", err)
return
}
client := &http.Client{Timeout: 5 * time.Second} // 设置请求超时时长5s
resp, err := client.Do(req)
if err != nil {
fmt.Println("TestGetReq http.DefaultClient.Do() err: ", err)
return
}
defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("TestGetReq ioutil.ReadAll() err: ", err)
return
}
// fmt.Println("respBody: ", string(respBody))
var rsp WeatherInfo
err = json.Unmarshal(respBody, &rsp)
if err != nil {
fmt.Println("TestGetReq json.Unmarshal() err: ", err)
return
}
// 最后经过字段筛选后,再序列化成json格式即可
result, err := json.Marshal(rsp)
if err != nil {
fmt.Println("TestGetReq json.Marrshal() err2: ", err)
return
}
fmt.Printf("rsp: %+v", string(result))
}
运行结果:
post请求:
Get请求:
浏览器Get请求:
补充-天气预报示例:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)