菜鸟之接触Golang-GinSkeleton张奇峰框架改版(二)、http接口对接

1.前言:
HR问我会不会第三方对接,我说没有工作经验,按照之前java工作经历,所以差距不大,主要还是语法不同。
对接主要是通过http和gRpc
现在看下来还是要学会对接第三方,本次是http接口对接,gRpc因为电脑只有一台暂时不考虑(gRpc必须学会,有时间了会做)。

2.使用

在utils创建request包、request.go,做个封装处理

request.go代码写的可能不是很合适,尽量根据自身情况适当修改

package request

import (
	"io"
	"net/http"
)

func GetRequest(u string, params map[string]string, header map[string]string) (string, error) {
	req, err := http.NewRequest("GET", u, nil)
	if err != nil {
		return "", err
	}
	//param参数
	q := req.URL.Query()
	for k, v := range params {
		q.Set(k, v)
	}
	req.URL.RawQuery = q.Encode()
	//设置请求头,如果需要
	if header != nil {
		for k, v := range header {
			req.Header.Add(k, v)
		}
	}

	// 执行请求
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()
	//读取body内容
	body, err := io.ReadAll(resp.Body)

	if resp.StatusCode == 200 {
		return string(body), nil
	} else {
		return "", err
	}
}

func PostRequest(u string, params map[string]string, header map[string]string) (string, error) {
	req, err := http.NewRequest("POST", u, nil)
	if err != nil {
		return "", err
	}
	//param参数
	q := req.URL.Query()
	for k, v := range params {
		q.Set(k, v)
	}
	req.URL.RawQuery = q.Encode()
	//设置请求头,如果需要
	if header != nil {
		for k, v := range header {
			req.Header.Add(k, v)
		}
	}

	// 执行请求
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()
	//读取body内容
	body, err := io.ReadAll(resp.Body)

	if resp.StatusCode == 200 {
		return string(body), nil
	} else {
		return "", err
	}
}

为了验证post和get能否成功请求,在原有代码上routes - api.go增加一行代码

vApi.POST("newsPost", validatorFactory.Create(consts.ValidatorPrefix+"HomeNews"))

运行api.go代码,使其服务端运行

尝试下请求
因为api没有做请求头鉴权处理,所以不用加header配置


func main() {
	params := map[string]string{
		"newsType": "1",
	}
	str, err := request.GetRequest("http://127.0.0.1:22002/api/v1/portal/news", params, nil)
	if err == nil {
		fmt.Println("这里调用了get请求")
		fmt.Println(str)
	}

	strPost, errPost := request.PostRequest("http://127.0.0.1:22002/api/v1/portal/newsPost", params, nil)
	if errPost == nil {
		fmt.Println("这里调用了post请求")
		fmt.Println(strPost)
	}
}

输出结果

这里调用了get请求
{"code":200,"data":{"content":"门户新闻内容001","limit":0,"newsType":"1","page":0,"title":"门户首页公司新闻标题001","userIp":"127.0.0.1"},"msg":"ok"}
这里调用了post请求
{"code":200,"data":{"content":"门户新闻内容001","limit":0,"newsType":"1","page":0,"title":"门户首页公司新闻标题001","userIp":"127.0.0.1"},"msg":"ok"}

3.进阶版

如何获取data里title的值

以下是作为map类型取值,但这做法不建议,尽量写个结构体去接收

params := map[string]string{
	"newsType": "1",
}
str, err := request.GetRequest("http://127.0.0.1:22002/api/v1/portal/news", params, nil)
if err == nil {
	fmt.Println("这里调用了get请求")
	fmt.Println(str)
	
	var result map[string]interface{}
	json.Unmarshal([]byte(str), &result)
	//判断code状态是否为200,如果是,取出data里的title值
	if result["code"].(float64) == 200 {
		data := result["data"].(map[string]interface{})
		fmt.Println(data["title"].(string))
	}
}

输出结果

这里调用了get请求
{"code":200,"data":{"content":"门户新闻内容001","limit":0,"newsType":"1","page":0,"title":"门户首页公司新闻标题001","userIp":"127.0.0.1"},"msg":"ok"}
门户首页公司新闻标题001

4.结束语
如有错误,欢迎批评纠正

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值