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.结束语
如有错误,欢迎批评纠正