121 lines
3.3 KiB
Go
121 lines
3.3 KiB
Go
package q_bida
|
||
|
||
import (
|
||
"bytes"
|
||
"encoding/json"
|
||
"errors"
|
||
"fmt"
|
||
"git.rosy.net.cn/baseapi/platformapi"
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"net/http"
|
||
"sync"
|
||
"time"
|
||
)
|
||
|
||
type Api struct {
|
||
token string // 登录凭证
|
||
expirationTime int64 // 过期时间
|
||
account string // 账号
|
||
password string // 密码
|
||
locker sync.RWMutex
|
||
client *http.Client
|
||
config *platformapi.APIConfig
|
||
}
|
||
|
||
// SetToken 设置token
|
||
func (a *Api) SetToken(token string) {
|
||
a.locker.Lock()
|
||
defer a.locker.Unlock()
|
||
a.token = token
|
||
}
|
||
|
||
// SetExpirationTime 设置过期时间
|
||
func (a *Api) SetExpirationTime(expiration int64) {
|
||
a.locker.Lock()
|
||
defer a.locker.Unlock()
|
||
a.expirationTime = expiration
|
||
}
|
||
|
||
// NewQBiDa 初始化token
|
||
func NewQBiDa(account, password string, config ...*platformapi.APIConfig) *Api {
|
||
if account == "" || password == "" {
|
||
account = "18048531223"
|
||
password = "18080188338"
|
||
//panic("账号密码不能为空")
|
||
}
|
||
// 获取token,设置token和过期时间
|
||
curConfig := platformapi.DefAPIConfig
|
||
if len(config) > 0 {
|
||
curConfig = *config[0]
|
||
}
|
||
api := &Api{
|
||
token: "",
|
||
expirationTime: 0,
|
||
account: account,
|
||
password: password,
|
||
locker: sync.RWMutex{},
|
||
client: &http.Client{Timeout: curConfig.ClientTimeout},
|
||
config: &curConfig,
|
||
}
|
||
if err := api.CheckTokenExpiration(); err != nil {
|
||
fmt.Println(err)
|
||
}
|
||
|
||
return api
|
||
}
|
||
|
||
// CheckTokenExpiration 检查token是否存在,或者是否过期
|
||
func (a *Api) CheckTokenExpiration() error {
|
||
if a.account == "" || a.password == "" {
|
||
return errors.New("账号或者密码为空")
|
||
}
|
||
|
||
// 获取token NewQBiDa
|
||
if a.token == "" || a.expirationTime < time.Now().Unix() {
|
||
return a.GetToken()
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// AccessInfo 发送请求
|
||
func (a *Api) AccessInfo(baseUrl, url, requestMethods string, param map[string]interface{}) (retVal map[string]interface{}, err error) {
|
||
err = platformapi.AccessPlatformAPIWithRetry(a.client,
|
||
func() *http.Request {
|
||
var request *http.Request
|
||
if requestMethods == http.MethodPost {
|
||
fullURL := utils.GenerateGetURL(baseUrl, url, nil)
|
||
// 获取json结构体的参数体
|
||
requestBody := new(bytes.Buffer)
|
||
json.NewEncoder(requestBody).Encode(param)
|
||
// 发送请求
|
||
request, _ = http.NewRequest(http.MethodPost, fullURL, requestBody)
|
||
request.Header.Set("Content-Type", "application/json")
|
||
} else {
|
||
request, _ = http.NewRequest(http.MethodGet, utils.GenerateGetURL(baseUrl, url, param), nil)
|
||
}
|
||
if url != LogInUrl {
|
||
request.Header.Set("token", a.token)
|
||
}
|
||
return request
|
||
},
|
||
a.config,
|
||
func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) {
|
||
if jsonResult1 == nil {
|
||
return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil")
|
||
}
|
||
retVal = jsonResult1
|
||
if jsonResult1["code"] == nil {
|
||
return platformapi.ErrLevelGeneralFail, fmt.Errorf("返回结果格式不正常")
|
||
}
|
||
code := int(utils.MustInterface2Int64(jsonResult1["code"]))
|
||
if code == ResponseCodeSuccess {
|
||
retVal, _ = jsonResult1["data"].(map[string]interface{})
|
||
return platformapi.ErrLevelSuccess, nil
|
||
}
|
||
newErr := utils.NewErrorIntCode(jsonResult1["msg"].(string), code)
|
||
return platformapi.ErrLevelCodeIsNotOK, newErr
|
||
})
|
||
return retVal, err
|
||
}
|