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.
 
 
 
 
 
 
SOP/sop-sdk/sdk-go/common/OpenClient.go

108 lines
2.8 KiB

package common
import (
"encoding/json"
"errors"
"reflect"
"strings"
"time"
)
var headers = map[string]string{
"Accept-Encoding": "identity",
}
type IClient interface {
Execute() string
}
type OpenClient struct {
AppId string
PrivateKey string
Url string
}
func (client OpenClient) ExecuteToken(iRequest IRequest, token string) []byte {
model := iRequest.GetModel()
bizModel := model.BizModel
types := reflect.TypeOf(bizModel)
values := reflect.ValueOf(bizModel)
params := make(map[string]interface{})
//遍历结构体的所有字段
for i := 0; i < values.NumField(); i++ {
// 获取到struct标签,需要通过reflect.Type来获取tag标签的值
fieldName := types.Field(i).Tag.Get("json")
// 如果该字段有tag标签就显示,否则就不显示
if fieldName != "" {
params[fieldName] = values.Field(i).Interface()
}
}
requestType := iRequest.GetRequestType()
var response string
allParams := client.buildParams(iRequest, params, token)
if model.Files != nil && len(model.Files) > 0 {
response = PostFile(client.Url, allParams, model.Files, headers)
} else {
switch requestType {
case GET:
response = Get(client.Url, allParams, headers)
case POST_FORM:
response = PostForm(client.Url, allParams, headers)
case POST_JSON:
response = PostJson(client.Url, allParams, headers)
case POST_UPLOAD:
response = PostFile(client.Url, allParams, model.Files, headers)
default:
panic(errors.New("GetRequestType()返回错误"))
}
}
return parseResponseResult(iRequest, response)
}
func parseResponseResult(iRequest IRequest, response string) []byte {
var responseRoot = map[string]interface{}{}
var err = json.Unmarshal([]byte(response), &responseRoot)
if err != nil {
panic(err)
}
var responseDataMap = responseRoot["error_response"]
if responseDataMap == nil {
dataName := strings.ReplaceAll(iRequest.GetMethod(), ".", "_") + "_response"
responseDataMap = responseRoot[dataName]
}
// json数据
dataJsonBytes, _ := json.Marshal(responseDataMap)
return dataJsonBytes
}
func (client OpenClient) buildParams(iRequest IRequest, params map[string]interface{}, token string) map[string]string {
allParams := map[string]string{
"app_id": client.AppId,
"method": iRequest.GetMethod(),
"charset": "UTF-8",
"sign_type": "RSA2",
"timestamp": time.Now().Format("2006-01-02 15:04:05"),
"version": iRequest.GetVersion(),
}
if token != "" {
allParams["access_token"] = token
}
bizParams := map[string]interface{}{}
// 添加业务参数
for k, v := range params {
bizParams[k] = v
}
allParams["biz_content"] = ToString(bizParams)
// 构建sign
sign := CreateSign(allParams, client.PrivateKey, "RSA2")
allParams["sign"] = sign
return allParams
}
func (client OpenClient) Execute(iRequest IRequest) []byte {
return client.ExecuteToken(iRequest, "")
}