GO Gin框架的PostGet请求示例

GO Gin框架的PostGet请求示例,第1张

目录

概述:

服务端:

客户端:

运行结果:


概述: 先运行服务端代码,再运行客户端代码(分两个服务分别运行,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请求:

补充-天气预报示例:

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/996163.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存