芝麻信用golang SDK
芝麻信用有一套SDK接入芝麻信用API,但是在下载页面中只支持Java、Python、C#、PHP几种语言。闲着没事写了个golang的,go-zmxy。
安装
1 |
go get http://github.com/delostik/go-zmxy |
使用
在request包里有很多request,继承自ZhimaRequest。需要访问某API时,只需构造该API对应的Request,然后使用client.Execute(req)执行即可。
1 2 3 4 5 6 7 8 9 10 11 |
// 初始化 gateWay := "https://zmopenapi.zmxy.com.cn/sandbox.do" client, err := zmxy.NewZhimaClient(gateWay, appId, charset, privKeyPath, pubKeyPath) // do something ... ... // 以查询芝麻分为例 req := new(Requests.ZhimaCreditScoreGetRequest) req.InitBizParams(openId, productCode, transactionId) data, err := client.Execute(req) // do something |
Trick
本项目实现了数十个接口,要一个一个写这些接口非常麻烦,有米有啥方法快速搞定呢?
我的设计跟官方的SDK是基本一致的,例如在官方的PythonSDK中,也是每个接口对应一个xxxRequest类文件,而且格式非常规范(一看也是生成出来的)。所以我们可以写脚本来机器翻译这些python类。
具体代码实现在tools/requestGenerator.py中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
import os pythonSdkPath = "/Users/yiz96/foss/zmxy-sdk/python/zmop/request/" # process python sdk def camelCase2_Case(str): res = [] str += 'A' cur = "" for c in str: if c >= 'A' and c <= 'Z': res += [cur.lower()] cur = "" cur += c return "_".join(res) def WriteSetter(fileHandler, className, param, type): fileHandler.write("\nfunc (m *" + className + ") Set" + param[0].upper() + param[1:] + "(" + param + " " + type + ") {\n") fileHandler.write("m." + param + " = " + param + "\n") fileHandler.write("}\n\n") def WriteGetter(fileHandler, className, param, type): fileHandler.write("\nfunc (m *" + className + ") Get" + param[0].upper() + param[1:] + "() " + type + " {\n") fileHandler.write("return m." + param + "\n") fileHandler.write("}\n\n") files = os.listdir(pythonSdkPath) for basedir in files: if basedir == "__init__.py": continue members = [] comments = [] className = basedir.split(".py")[0] f = open(pythonSdkPath + basedir) fout = open("../requests/" + className + ".go", "w") fout.write("package requests\n\nimport (\n\"github.com/delostik/go-zmxy/interfaces\"\n)\n\n") fout.write("type " + className + " struct {\n") for i in range(3): f.readline() methodName = f.readline().split(" ")[2] for i in range(7): f.readline() line = f.readline() while line != "\n": member = line.strip().split(".__")[1].split(" ")[0] if member == "type": member = "opType" members += [member] comments += [line.strip().split('#')[1]] line = f.readline() for idx, member in enumerate(members): fout.write(member + " string //" + comments[idx] + "\n") fout.write("\ninterfaces.ZhimaRequestParams\n}\n\n") fout.write("func (m *" + className + ") InitBizParams(" + ' ,'.join(members) + " string) {\n") fout.write("m.ApiParams = &map[string]string{}\nm.FileParams = &map[string]string{}\n") for member in members: if member != "file": fout.write("\n(*m.ApiParams)[\"" + camelCase2_Case(member) + "\"] = " + member + "\n") else: fout.write("\n(*m.FileParams)[\"" + camelCase2_Case(member) + "\"] = " + member + "\n") fout.write("m." + member + " = " + member + "\n") fout.write("}\n") # ApiMethodName fout.write("\nfunc (*" + className + ") GetApiMethodName() string {\nreturn \"" + methodName + "\"\n}\n") WriteGetter(fout, className, "ApiParams", "*map[string]string") WriteGetter(fout, className, "FileParams", "*map[string]string") WriteSetter(fout, className, "ApiVersion", "string") WriteGetter(fout, className, "ApiVersion", "string") WriteSetter(fout, className, "Scene", "string") WriteGetter(fout, className, "Scene", "string") WriteSetter(fout, className, "Channel", "string") WriteGetter(fout, className, "Channel", "string") WriteSetter(fout, className, "Platform", "string") WriteGetter(fout, className, "Platform", "string") WriteSetter(fout, className, "ExtParams", "string") WriteGetter(fout, className, "ExtParams", "string") f.close() fout.close() os.system("go fmt ../requests/" + className + ".go") |