美文网首页
一个新项目,接口实现的旅程

一个新项目,接口实现的旅程

作者: 艾希_可可 | 来源:发表于2019-07-30 17:16 被阅读0次

1、在main中init函数实现config配置文件

    data, _ := ioutil.ReadFile("config.yml")

在config中配置数据库、redis和一些全局配置,如

 mysql:
    host: rm-bp13p3c6om21314o.mysql.rds.aliyuncs.com:3306
    username: xb_root
    password: B19f63ec50761
    dbname: fund
  redis:
    addr: 192.168.1.:679
    password: m
  assetsideUrl: "http://192.68.1.6:8080"
  ucUrl: "http://192.16.1.14:8081

2、在main函数
初始化路由router

    r := routers.InitRouter()

3、路由中实现

r := gin.New()
    r.Use(Logger())
    r.Use(gin.Recovery())
    gin.SetMode(gin.ReleaseMode)
    xydGroup := r.Group(BASE_PATH + XIAOYUDIAN + VERSION1)
    /*base.Use(gin.BasicAuth(account))*/
    {
        //调用接口
        xydGroup.POST("/pushWholeOrder", xyd.PushWholeOrderControl)
        xydGroup.POST("/findLoanCalculate", xyd.FindLoanCalculateControl)

4、接口的实现

首先编写数据源结构体,如金额试算接口

package formTaoche
type FindLoanCalculateForm struct {
    //渠道号       Y
    Vendor string `json:"vendor" binding:"required"`
    //金额            Y
    RequestAmount string `json:"requestAmount" binding:"required"`
    //期数
    TotalPeriod int `json:"totalPeriod" binding:"required"`
    //生成随机外部订单号
    OutOrderNumber string `json:"outOrderNumber"`
    //渠道号标识
    FundSideVendor string `json:"fundSideVendor"`
    FundSideUrl string `json:"fundSideUrl" binding:"required"`
}

函数实现详情

func FindLoanCalculateControl(c *gin.Context) {
    var findLoanCalculateForm formTaoche.FindLoanCalculateForm//结构体
    if err := c.BindJSON(&findLoanCalculateForm); err != nil {//解析参数
        log.Error("findLoanCalculateForm BindJSON err: ", err)
        return
    }
    maps := common.StructToMap(findLoanCalculateForm) //结构体转换成map
    code, result := FindLoanCalculate(findLoanCalculateForm.FundSideUrl, maps)//内部实现
    if code == util.ResultSuccess {
        common.OkMsgResult(c, result)
    } else {
        common.ErrorMsgResult(c, result)
    }
}

内部实现

func FindLoanCalculate(fundSideUrl string, paramMap map[string]string) (string, interface{}) {
        requestAmount := paramMap["requestAmount"]
        if requestAmount == "" {
            requestAmount = "60000"
        }
        totalPeriod := paramMap["totalPeriod"]
        if totalPeriod == "" {
            totalPeriod = "3"
        }
        postMap := map[string]interface{}{
            "vendor":         paramMap["vendor"],
            "requestAmount":  util.StringToInt64Val(requestAmount),
            "outOrderNumber": paramMap["outOrderNumber"],
            "totalPeriod":    util.StringToInt(totalPeriod),
        }
        jsonByte, err := json.Marshal(postMap)//map转json
        if err != nil {
            log.Error(" FindLoanCalculate: err: ", err)
            return util.ResultFail, ""
        }
        paramJson, reqId := common.BuildAesSignedParamJson(jsonByte)//加密请求
        code, dat, str := common.RpcPostJson(fundSideUrl+"/api/dumiao/trial/amount",
            paramJson)
        common.SaveLog(paramMap["outOrderNumber"], reqId, str, "taoche: FindLoanCalculate", paramMap["vendor"], common.FUND_SIDE_VENDOR_TAOCHE, util.Response)//解密保存起来
        return code, dat
}

到这里一个接口算是结束了,在postman就可以调用咯
比如
url:http://localhost:8080/fund/taoche/v1/findLoanCalculate
参数:{
"requestAmount": "50000",
"totalPeriod": 6,
"outOrderNumber": "",
"vendor": "123456",
"fundSideVendor": "cc",
"fundSideUrl": "http://test.com/api"
}
可成功调用了
👏
新手的理解,可能也有偏差,不喜勿喷,仅供参考
下面可看可不看

结构体转map
func StructToMap(obj interface{}) map[string]string {
    obj1 := reflect.TypeOf(obj)
    obj2 := reflect.ValueOf(obj)
    log.Info("common: StructToMap: obj1.Kind(): ", obj1.Kind().String())
    if obj1.Kind().String() == "ptr" {
        obj1 = obj1.Elem()
        obj2 = obj2.Elem()
    }
    var data = make(map[string]string)
    for i := 0; i < obj1.NumField(); i++ {
        nameStr := obj1.Field(i).Name
        value := obj2.Field(i).Interface()
        var valueStr string
        switch value.(type) {
        case string:
            valueStr = value.(string)
        case int64:
            valueStr = util.Int64ToString(value.(int64))
        }
        if nameStr != "FundSideVendor" && nameStr != "FundSideUrl" {
            data[(strings.ToLower(nameStr[0:1]) + nameStr[1:])] = valueStr
        }
    }
    log.Info("routers: StructToMap: maps:", data)
    return data
}

相关文章

  • 一个新项目,接口实现的旅程

    1、在main中init函数实现config配置文件 在config中配置数据库、redis和一些全局配置,如 2...

  • springfox & swagger-ui 和 spr

    最近的一个新项目,在定义后端接口的时候,发现有些字段和接口名需要频繁的更改。以前的实现方式是定义一个wiki,通过...

  • golang-接口

    Go语言规定,只要实现了接口里面的方法,就是该接口的实现类 定义一个接口 接口实现1 接口实现 2 main方法

  • Java的接口

    接口将方法声明与实现分离,一个接口可以有多个实现类,一个类也可以实现多个接口。 定义接口 使用interface关...

  • TypeScript interface (四) 类类型 继承接

    类实现接口 一个类实现一个接口,与Java里接口的基本作用一样。 一个demo? 打印结果: 继承接口 接口可以相...

  • 栈的实现(基于动态数组)

    先定义一个接口 再定义一个栈的实现类,实现上述接口

  • 接口

    一个类实现多个接口,用,分开. 父类 对象名 = new 子类(); 接口 名字 = new接口的实现类 接口与抽...

  • Java中List和ArrayList的区别

    List是一个接口,而ArrayList是List接口的一个实现类。 ArrayList类继承并实现了List接口...

  • Java基础-接口

    基础:声明接口关键字interface,实现接口关键字implements。一个类可以实现多个接口。 接口里内容:...

  • JDK中的proxy动态代理原理剖析

    主要API类是: 先声明一个接口 实现该接口 实现InvocationHandler 接口,关键之处在这 测试: ...

网友评论

      本文标题:一个新项目,接口实现的旅程

      本文链接:https://www.haomeiwen.com/subject/ztnnrctx.html