You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 5.1 KiB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. # gaore-common-sdk-go
  2. ### 1.目录架构
  3. ```
  4. ├── README.md
  5. ├── sdk
  6. │   ├── auth `认证类`
  7. │   ├── client.go `客户端主入口类`
  8. │   ├── config.go
  9. │   ├── requests `请求类`
  10. │   ├── responses `响应类`
  11. │   └── utils `工具类`
  12. └── services
  13. └── jedi
  14. ```
  15. ### 2.引入
  16. ```go
  17. go get -u golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk
  18. ```
  19. 或 Go Module
  20. ```go
  21. import "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
  22. ```
  23. ### 3.服务端认证及返回处理
  24. 调用 `auth.UnSign` 方法,提供`*http.Request`请求实例,以及`signer.Signer` 签名器(签名器需要包括凭据)
  25. 即可完成整个验签过程
  26. 这里以`beego`为例 :
  27. ```go
  28. package applications
  29. import (
  30. "github.com/astaxie/beego"
  31. "github.com/astaxie/beego/context"
  32. "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth"
  33. "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth/credentials"
  34. "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth/signers"
  35. "golib.gaore.com/GaoreGo/grlogs"
  36. )
  37. func init() {
  38. // 过滤器
  39. beego.InsertFilter("/api/*", beego.BeforeRouter, func(context *context.Context) {
  40. httpRequest := context.Request
  41. err := auth.UnSign(httpRequest, signers.NewAccessKeySigner(&credentials.AccessKeyCredential{
  42. AccessKeyId: "aaaaaa",
  43. AccessKeySecret: "bbbbbb",
  44. AccessKeyFrom: context.Input.Param("access_from"),
  45. }))
  46. if err != nil {
  47. resp := response.NewJsonByDefaultFailed()
  48. resp.Msg = err.Error()
  49. resp.Code = 10086
  50. var (
  51. hasIndent = beego.BConfig.RunMode != beego.PROD
  52. )
  53. context.Output.Status = 500
  54. context.Output.JSON(resp, hasIndent, false)
  55. }
  56. })
  57. }
  58. ```
  59. 服务端返回的响应体为以下结构的json字符流, `code`,`status`,`msg` 这三个字段*最好*要包含且数据类型要一致 , `data` 部分为业务内容,自行定义
  60. ```json
  61. {
  62. "code": 1001,
  63. "msg": "不能为空",
  64. "status": false,
  65. "data": {
  66. ...
  67. }
  68. }
  69. ```
  70. ### 4.sdk编写
  71. 在`services`目录下以服务归类新建文件夹, 如`jedi`为短信服务,以 `RpcRequest` 和 `BaseResponse` 以基类写好请求子类和响应子类。一个请求接口对应一对请求和响应类。
  72. ```go
  73. import "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk"
  74. const (
  75. HOST = "jedi" // 如果非全域名会自动补全.gaore.com , 如jedi 会自动补全jedi.goare.com, 也可以打全域名 test.uu89.com
  76. VERSION = "2020-08-04"
  77. )
  78. type Client struct {
  79. sdk.Client
  80. }
  81. func NewClientWithAccessKey(accesskey, secrect, source string) (client *Client, err error) {
  82. client = &Client{}
  83. err = client.InitWithAccessKey(accesskey, secrect, source)
  84. return
  85. }
  86. func (c *Client) Test(req *DemoTestRequest) (response *DemoTestResponse, err error) {
  87. response = CreateDemoTestResponse()
  88. err = c.DoAction(req, response)
  89. return
  90. }
  91. ```
  92. 请求类,对参数用标签解释, 如 `position:"Query" field:"param_1" default:""` , 有三个字段 `position` , `field`, `default`
  93. - `position` 为标志该参数为请求体对应的位置, `Query` query参数, `Body` post请求体参数, `Head`请求头参数
  94. - `field` 解释成参数实际名称
  95. - `default` 默认值
  96. ```go
  97. type DemoTestRequest struct {
  98. *requests.RpcRequest
  99. Param1 string `position:"Query" field:"param_1" default:"" `
  100. Param2 int `position:"Query" field:"param_2" default:"10086" `
  101. Param3 bool `position:"Query" field:"param_3" default:"false" `
  102. }
  103. ```
  104. 对应解释成http请求为:
  105. ```go
  106. GET param_1=111&param_2=10086&param_3=false
  107. ```
  108. 完整示例:
  109. ```go
  110. package jedi
  111. import (
  112. "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
  113. "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
  114. )
  115. // 定义请求体
  116. type DemoTestRequest struct {
  117. *requests.RpcRequest
  118. Param1 string `position:"Query" field:"param_1" default:"" `
  119. Param2 int `position:"Query" field:"param_2" default:"10086" `
  120. Param3 bool `position:"Query" field:"param_3" default:"false" `
  121. }
  122. func CreateDemoTestRequest() (req *DemoTestRequest) {
  123. req = &DemoTestRequest{RpcRequest: &requests.RpcRequest{}}
  124. // InitWithApiInfo 初始化请求,有三个参数,域名,版本,和路径
  125. // 域名参数如果非全域名会自动补全.gaore.com , 如jedi 会自动补全jedi.goare.com, 也可以打全域名 test.uu89.com
  126. req.InitWithApiInfo(HOST, VERSION, "/api/sms/Index")
  127. // 定义 请求方法 POST 或 GET
  128. req.Method = requests.GET
  129. return
  130. }
  131. // 定义响应体
  132. type DemoTestResponse struct {
  133. *responses.BaseResponse
  134. Data DemoTestResponseData `json:"data"`
  135. }
  136. type DemoTestResponseData struct {
  137. Account string `json:"account"`
  138. Total int `json:"total"`
  139. }
  140. func CreateDemoTestResponse() *DemoTestResponse {
  141. return &DemoTestResponse{
  142. BaseResponse: &responses.BaseResponse{},
  143. }
  144. }
  145. ```
  146. 终端调试打开方式, 需要在系统环境变量上加入(三选一):
  147. ```
  148. DEBUG=sdk,signer,request
  149. ```