go对接接口

前言:这是第一次使用go语言对接接口,记录一下碰到了那些知识。接口需求文档只有两个接口,一个是获取token,在header中使用;另一个是添加订单接口;大致意思就是从我这的系统中读取数据,到,对方的系统中。

相关知识点

  • 第一感觉,结构体很重要,很灵活,也很难,用起来有点生涩
  • go mod一个好用的包版本管理程序,可以让你的go项目放在电脑的任何文件夹下,从gopath/src下解放出来
  • sqlx的使用
  • 结构体的设计,映射
  • 在go中使用json struct做映射
  • 结构体中对字段可能为 null的处理,看数据类型的源码,有哪些方法,函数
  • 结构体首字母大写,进行json映射
  • for range的使用,切片的赋值,指针切片,结构体对象赋值
  • 时间格式相互转换
  • 字符串转数组,数组去空值
  • if 与 switch
  • go 结构体、数组、集合/字典和json字符串的相互转换
  • go定时任务详解

记一下步骤

  1. 先使用postman验证对面接口没有问题,测试越全面越好,包括那些必传字段,如果传空/空字符串会怎样,这样做的原因:可能我方数据库有些错误数据,或者正确但是奇怪的数据
  2. 创建go项目,go开发不需要操心本地和服务器上包的数量问题,放心好了,服务器上的环境绝对比你本地的包多,比你本地全。
  3. 使用go连接个数据库,这里使用sqlx包
  4. 连接数据库的代码成功后,移入init()初始化方法中
  5. 开始测试获取token接口,涉及到了go怎么模拟get/post,查找到了http包
  6. 获取token成功后,因为需要token值,所以获取token方法给了返回值,放入init()初始化方法中,这样就可以做到下面的如果有请求对方的接口,就可以获取token变量
  7. 获取列表/多条数据,考虑结构体 属性,类型,映射
  8. 对需要额外处理的字段进行处理
  9. 封装对方 添加订单接口需要的参数样子,同样需要一个结构体
  10. 进行post数据传输–带有头部参数的复杂的post请求
  11. 根据返回结果,如果成功,修改我方系统数据库中数据表的推送标志字段
  12. 优化:添加计数器,对推送数据,和推送成功数据,做一个有个的提示打印输出
  13. 优化:添加定时器,当第一次将历史数据推送结束后,每一小时执行一次,从而达到实时(延迟)的效果
相关小语法
  • 如何使用go进行sql的in查询
    //注意下面这些类型,如果是字符串切片就不用转类型了
    awesome_id_list := []int{3,5,8}
    var str string
    for _, value := range awesome_id_list {
        str += strconv.Itoa(value) + ","
    }
    query := "SELECT * FROM awesome_table WHERE id IN (" + str[:len(str)-1] + ")"
    
  • 加上一个定时器,达到实时推送的效果;定时器也就是个for循环,周期执行;为了方便,我们把原来的主要函数拿出来,放在一个方法里,main方法放个for就行了,这样代码既清晰又优美了一点
    示例:start就是主要程序部分,5秒执行一次
/**
每一个小时循环执行
*/
func main() {
	log.Println("**************main*************")
	//ticker := time.NewTicker(time.Hour*1)
	ticker := time.NewTicker(time.Second*5)
	for{
		Start()
		<-ticker.C
	}
}

func Start() {
	//执行方法a
	//执行方法b
	/执行。。。
	//结束
}
  • go发送post请求,带有数据参数;注意数据类型
/**
带有头部参数的复杂的post请求
*/
func httpPost(data []byte) (res Return) {
	client := &http.Client{}

	req, err := http.NewRequest("post", "请求接口url", bytes.NewBuffer(data))
	if err != nil {
		fmt.Println("there is httpPost,occur error", err)
		return
	}


	defer req.Body.Close()

	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("authorization", token.Token)

	resp, err := client.Do(req)
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("there is httpPost,occur error", err)
		return
	}
	//log.Println(string(body))
	json.Unmarshal([]byte(body), &res)
	return res
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值