2023-02-21 20:46:05 +08:00
|
|
|
package requests
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
2023-02-21 20:58:53 +08:00
|
|
|
"golib.gaore.com/GaoreGo/haiwai-common-sdk-go/sdk/utils"
|
2023-02-21 20:46:05 +08:00
|
|
|
"io"
|
|
|
|
"math/cmplx"
|
|
|
|
"reflect"
|
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
RPC = "RPC"
|
|
|
|
ROA = "ROA"
|
|
|
|
|
|
|
|
HTTP = "HTTP"
|
|
|
|
HTTPS = "HTTPS"
|
|
|
|
|
|
|
|
JSON = "JSON"
|
|
|
|
XML = "XML"
|
|
|
|
|
|
|
|
DefaultHttpPort = "80"
|
|
|
|
|
|
|
|
GET = "GET"
|
|
|
|
PUT = "PUT"
|
|
|
|
POST = "POST"
|
|
|
|
DELETE = "DELETE"
|
|
|
|
PATCH = "PATCH"
|
|
|
|
HEAD = "HEAD"
|
|
|
|
OPTIONS = "OPTIONS"
|
|
|
|
|
|
|
|
Json = "application/json"
|
|
|
|
Xml = "application/xml"
|
|
|
|
Raw = "application/octet-stream"
|
|
|
|
Form = "application/x-www-form-urlencoded"
|
|
|
|
|
|
|
|
Header = "Header"
|
|
|
|
Query = "Query"
|
|
|
|
Body = "Body"
|
|
|
|
Path = "Path"
|
|
|
|
|
|
|
|
TEST = "TEST"
|
|
|
|
PRE = "PRE"
|
|
|
|
RELEASE = "RELEASE"
|
|
|
|
|
|
|
|
HeaderSeparator = "\n"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Host struct {
|
|
|
|
Default string
|
2023-03-16 20:15:17 +08:00
|
|
|
Func func(string, string) string
|
2023-02-21 20:46:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
var debug utils.Debug
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
debug = utils.Init("request")
|
|
|
|
}
|
|
|
|
|
|
|
|
type AcsRequest interface {
|
|
|
|
GetReadTimeout() time.Duration
|
|
|
|
GetConnectTimeout() time.Duration
|
|
|
|
SetReadTimeout(readTimeOut time.Duration)
|
|
|
|
SetConnectTimeout(connectTimeOut time.Duration)
|
|
|
|
SetHTTPSInsecure(isInsecure bool)
|
|
|
|
GetHTTPSInsecure() *bool
|
|
|
|
GetQueryParams() map[string]string
|
|
|
|
GetFormParams() map[string]string
|
|
|
|
GetMethod() string
|
|
|
|
GetScheme() string
|
|
|
|
GetDomain() Host
|
|
|
|
SetDomain(host Host)
|
|
|
|
GetActionName() string
|
|
|
|
GetAcceptFormat() string
|
|
|
|
GetAccept() string
|
|
|
|
GetHeaders() map[string]string
|
|
|
|
GetStyle() string
|
|
|
|
InitWithApiInfo(domain Host, version, urlPath string)
|
|
|
|
GetEnv() string
|
|
|
|
SetEnv(string)
|
2023-03-16 20:15:17 +08:00
|
|
|
GetArea() string
|
|
|
|
SetArea(string)
|
2023-02-21 20:46:05 +08:00
|
|
|
|
|
|
|
BuildUrl() string
|
|
|
|
BuildQueries() string
|
|
|
|
|
|
|
|
SetScheme(scheme string)
|
|
|
|
SetContent(content []byte)
|
|
|
|
|
|
|
|
SetStringToSign(stringToSign string)
|
|
|
|
GetStringToSign() string
|
|
|
|
GetBodyReader() io.Reader
|
|
|
|
|
|
|
|
AddHeaderParam(key, value string)
|
|
|
|
addQueryParam(key, value string)
|
|
|
|
addFormParam(key, value string)
|
|
|
|
}
|
|
|
|
|
|
|
|
type baseRequest struct {
|
|
|
|
Scheme string
|
|
|
|
Method string
|
|
|
|
Port string
|
|
|
|
Domain Host
|
|
|
|
From string
|
|
|
|
ReadTimeout time.Duration
|
|
|
|
ConnectTimeout time.Duration
|
|
|
|
isInsecure *bool
|
|
|
|
Env string
|
|
|
|
|
|
|
|
AcceptFormat string
|
|
|
|
actionName string
|
|
|
|
|
|
|
|
userAgent map[string]string
|
|
|
|
product string
|
|
|
|
version string
|
|
|
|
|
|
|
|
QueryParams map[string]string
|
|
|
|
Headers map[string]string
|
|
|
|
FormParams map[string]string
|
|
|
|
Content []byte
|
|
|
|
|
|
|
|
queries string
|
|
|
|
stringToSign string
|
2023-03-16 20:15:17 +08:00
|
|
|
area string
|
2023-02-21 20:46:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetEnv() string {
|
|
|
|
return request.Env
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) SetEnv(e string) {
|
|
|
|
request.Env = e
|
|
|
|
}
|
|
|
|
|
2023-03-16 20:15:17 +08:00
|
|
|
func (request *baseRequest) GetArea() string {
|
|
|
|
return request.area
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) SetArea(area string) {
|
|
|
|
request.area = area
|
|
|
|
}
|
|
|
|
|
2023-02-21 20:46:05 +08:00
|
|
|
func (request *baseRequest) GetStringToSign() string {
|
|
|
|
return request.stringToSign
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) SetContent(content []byte) {
|
|
|
|
request.Content = content
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetAcceptFormat() string {
|
|
|
|
return request.AcceptFormat
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetAccept() string {
|
|
|
|
switch request.GetAcceptFormat() {
|
|
|
|
case JSON:
|
|
|
|
return Json
|
|
|
|
case XML:
|
|
|
|
return Xml
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetHeaders() map[string]string {
|
|
|
|
return request.Headers
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetActionName() string {
|
|
|
|
return request.actionName
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) SetScheme(scheme string) {
|
|
|
|
request.Scheme = scheme
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) SetDomain(host Host) {
|
|
|
|
request.Domain = host
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetScheme() string {
|
|
|
|
return request.Scheme
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetDomain() Host {
|
|
|
|
return request.Domain
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetMethod() string {
|
|
|
|
return request.Method
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetFormParams() map[string]string {
|
|
|
|
return request.FormParams
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetQueryParams() map[string]string {
|
|
|
|
return request.QueryParams
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) SetHTTPSInsecure(isInsecure bool) {
|
|
|
|
request.isInsecure = &isInsecure
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetHTTPSInsecure() *bool {
|
|
|
|
return request.isInsecure
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetReadTimeout() time.Duration {
|
|
|
|
return request.ReadTimeout
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) GetConnectTimeout() time.Duration {
|
|
|
|
return request.ConnectTimeout
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) SetReadTimeout(readTimeOut time.Duration) {
|
|
|
|
request.ReadTimeout = readTimeOut
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) SetConnectTimeout(connectTimeOut time.Duration) {
|
|
|
|
request.ConnectTimeout = connectTimeOut
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) SetStringToSign(stringToSign string) {
|
|
|
|
request.stringToSign = stringToSign
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) AddHeaderParam(key, val string) {
|
|
|
|
request.Headers[key] = val
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) addQueryParam(key, val string) {
|
|
|
|
request.QueryParams[key] = val
|
|
|
|
}
|
|
|
|
|
|
|
|
func (request *baseRequest) addFormParam(key, val string) {
|
|
|
|
request.FormParams[key] = val
|
|
|
|
}
|
|
|
|
|
|
|
|
func defaultBaseRequest() (request *baseRequest) {
|
|
|
|
request = &baseRequest{
|
|
|
|
Scheme: HTTP,
|
|
|
|
AcceptFormat: JSON,
|
|
|
|
Method: GET,
|
|
|
|
QueryParams: make(map[string]string),
|
|
|
|
Headers: map[string]string{
|
2023-02-21 20:58:53 +08:00
|
|
|
"Gr-Sdk-Client": "golang/1.19.4",
|
2023-02-21 20:46:05 +08:00
|
|
|
"Gr-Sdk-Invoke-Type": "normal",
|
|
|
|
"Accept-Encoding": Json,
|
|
|
|
},
|
|
|
|
FormParams: make(map[string]string),
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func InitParam(request AcsRequest) (err error) {
|
|
|
|
reflectValue := reflect.ValueOf(request).Elem()
|
|
|
|
err = flatRepeatedList(reflectValue, request, "")
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func flatRepeatedList(reflectValue reflect.Value, request AcsRequest, position string) (err error) {
|
|
|
|
reflectType := reflectValue.Type()
|
|
|
|
for i := 0; i < reflectType.NumField(); i++ {
|
|
|
|
field := reflectType.Field(i)
|
|
|
|
name, isContiansNameTag := field.Tag.Lookup("field")
|
|
|
|
|
|
|
|
fieldPosition := position
|
|
|
|
if fieldPosition == "" {
|
|
|
|
fieldPosition, _ = field.Tag.Lookup("position")
|
|
|
|
}
|
|
|
|
|
|
|
|
fieldDefault, _ := field.Tag.Lookup("default")
|
|
|
|
debug("%s %s %s", name, fieldPosition, fieldDefault)
|
|
|
|
if isContiansNameTag {
|
|
|
|
var value string
|
|
|
|
switch field.Type.Kind() {
|
|
|
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
|
|
value = strconv.FormatInt(reflectValue.Field(i).Int(), 10)
|
|
|
|
case reflect.Uintptr, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
|
|
|
value = strconv.FormatUint(reflectValue.Field(i).Uint(), 10)
|
|
|
|
case reflect.Float32, reflect.Float64:
|
|
|
|
value = strconv.FormatFloat(reflectValue.Field(i).Float(), 'E', -1, 64)
|
|
|
|
case reflect.Bool:
|
|
|
|
value = strconv.FormatBool(reflectValue.Field(i).Bool())
|
|
|
|
case reflect.Complex64, reflect.Complex128:
|
|
|
|
value = fmt.Sprint(cmplx.Sqrt(reflectValue.Field(i).Complex()))
|
|
|
|
default:
|
|
|
|
value = reflectValue.Field(i).String()
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(value) == 0 {
|
|
|
|
value = fieldDefault
|
|
|
|
}
|
|
|
|
|
|
|
|
if value == "0" && fieldDefault != "" && fieldDefault != "0" {
|
|
|
|
value = fieldDefault
|
|
|
|
}
|
|
|
|
|
|
|
|
err = addParam(request, fieldPosition, name, value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func addParam(request AcsRequest, position, key, value string) (err error) {
|
|
|
|
if len(value) > 0 {
|
|
|
|
switch position {
|
|
|
|
case Header:
|
|
|
|
request.AddHeaderParam(key, value)
|
|
|
|
case Query:
|
|
|
|
request.addQueryParam(key, value)
|
|
|
|
case Body:
|
|
|
|
request.addFormParam(key, value)
|
|
|
|
default:
|
|
|
|
errmsg := fmt.Sprintf("unsupport positions add param `%s`", position)
|
|
|
|
err = errors.New(errmsg)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|