mirror of
https://gitee.com/durcframework/SOP.git
synced 2025-08-11 21:57:56 +08:00
109 lines
2.8 KiB
Go
109 lines
2.8 KiB
Go
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, "")
|
||
}
|