common/go/client/client.go (638 lines of code) (raw):
// This file is auto-generated, don't edit it. Thanks.
package client
import (
"io"
mcutil "github.com/aliyun/aliyun-odps-go-sdk/tea/utils"
util "github.com/alibabacloud-go/tea-utils/v2/service"
credential "github.com/aliyun/credentials-go/credentials"
"github.com/alibabacloud-go/tea/tea"
)
type GlobalParameters struct {
Headers map[string]*string `json:"headers,omitempty" xml:"headers,omitempty"`
Queries map[string]*string `json:"queries,omitempty" xml:"queries,omitempty"`
}
func (s GlobalParameters) String() string {
return tea.Prettify(s)
}
func (s GlobalParameters) GoString() string {
return s.String()
}
func (s *GlobalParameters) SetHeaders(v map[string]*string) *GlobalParameters {
s.Headers = v
return s
}
func (s *GlobalParameters) SetQueries(v map[string]*string) *GlobalParameters {
s.Queries = v
return s
}
// Description:
//
// Model for initing client
type Config struct {
// project
Project *string `json:"project,omitempty" xml:"project,omitempty"`
// accesskey id
AccessKeyId *string `json:"accessKeyId,omitempty" xml:"accessKeyId,omitempty"`
// accesskey secret
AccessKeySecret *string `json:"accessKeySecret,omitempty" xml:"accessKeySecret,omitempty"`
// security token
//
// example:
//
// a.txt
SecurityToken *string `json:"securityToken,omitempty" xml:"securityToken,omitempty"`
// bearer token
//
// example:
//
// the-bearer-token
BearerToken *string `json:"bearerToken,omitempty" xml:"bearerToken,omitempty"`
// http protocol
//
// example:
//
// http
Protocol *string `json:"protocol,omitempty" xml:"protocol,omitempty"`
// http method
//
// example:
//
// GET
Method *string `json:"method,omitempty" xml:"method,omitempty"`
// region id
//
// example:
//
// cn-hangzhou
RegionId *string `json:"regionId,omitempty" xml:"regionId,omitempty"`
// read timeout
//
// example:
//
// 60
ReadTimeout *int `json:"readTimeout,omitempty" xml:"readTimeout,omitempty"`
// connect timeout
//
// example:
//
// 60
ConnectTimeout *int `json:"connectTimeout,omitempty" xml:"connectTimeout,omitempty"`
// credential
Credential credential.Credential `json:"credential,omitempty" xml:"credential,omitempty"`
// endpoint
//
// example:
//
// cs.aliyuncs.com
Endpoint *string `json:"endpoint,omitempty" xml:"endpoint,omitempty"`
// credential type
//
// example:
//
// access_key
Type *string `json:"type,omitempty" xml:"type,omitempty"`
// user agent
//
// example:
//
// maxcompute-openapi
UserAgent *string `json:"userAgent,omitempty" xml:"userAgent,omitempty"`
// suffix for endpoint
//
// example:
//
// aliyun
Suffix *string `json:"suffix,omitempty" xml:"suffix,omitempty"`
// Signature Version
//
// example:
//
// v2
SignatureVersion *string `json:"signatureVersion,omitempty" xml:"signatureVersion,omitempty"`
// Global Parameters
GlobalParameters *GlobalParameters `json:"globalParameters,omitempty" xml:"globalParameters,omitempty"`
}
func (s Config) String() string {
return tea.Prettify(s)
}
func (s Config) GoString() string {
return s.String()
}
func (s *Config) SetProject(v string) *Config {
s.Project = &v
return s
}
func (s *Config) SetAccessKeyId(v string) *Config {
s.AccessKeyId = &v
return s
}
func (s *Config) SetAccessKeySecret(v string) *Config {
s.AccessKeySecret = &v
return s
}
func (s *Config) SetSecurityToken(v string) *Config {
s.SecurityToken = &v
return s
}
func (s *Config) SetBearerToken(v string) *Config {
s.BearerToken = &v
return s
}
func (s *Config) SetProtocol(v string) *Config {
s.Protocol = &v
return s
}
func (s *Config) SetMethod(v string) *Config {
s.Method = &v
return s
}
func (s *Config) SetRegionId(v string) *Config {
s.RegionId = &v
return s
}
func (s *Config) SetReadTimeout(v int) *Config {
s.ReadTimeout = &v
return s
}
func (s *Config) SetConnectTimeout(v int) *Config {
s.ConnectTimeout = &v
return s
}
func (s *Config) SetCredential(v credential.Credential) *Config {
s.Credential = v
return s
}
func (s *Config) SetEndpoint(v string) *Config {
s.Endpoint = &v
return s
}
func (s *Config) SetType(v string) *Config {
s.Type = &v
return s
}
func (s *Config) SetUserAgent(v string) *Config {
s.UserAgent = &v
return s
}
func (s *Config) SetSuffix(v string) *Config {
s.Suffix = &v
return s
}
func (s *Config) SetSignatureVersion(v string) *Config {
s.SignatureVersion = &v
return s
}
func (s *Config) SetGlobalParameters(v *GlobalParameters) *Config {
s.GlobalParameters = v
return s
}
type Params struct {
Action *string `json:"action,omitempty" xml:"action,omitempty"`
Version *string `json:"version,omitempty" xml:"version,omitempty"`
Protocol *string `json:"protocol,omitempty" xml:"protocol,omitempty"`
Pathname *string `json:"pathname,omitempty" xml:"pathname,omitempty" require:"true"`
Method *string `json:"method,omitempty" xml:"method,omitempty" require:"true"`
AuthType *string `json:"authType,omitempty" xml:"authType,omitempty"`
BodyType *string `json:"bodyType,omitempty" xml:"bodyType,omitempty"`
ReqBodyType *string `json:"reqBodyType,omitempty" xml:"reqBodyType,omitempty"`
Style *string `json:"style,omitempty" xml:"style,omitempty"`
}
func (s Params) String() string {
return tea.Prettify(s)
}
func (s Params) GoString() string {
return s.String()
}
func (s *Params) SetAction(v string) *Params {
s.Action = &v
return s
}
func (s *Params) SetVersion(v string) *Params {
s.Version = &v
return s
}
func (s *Params) SetProtocol(v string) *Params {
s.Protocol = &v
return s
}
func (s *Params) SetPathname(v string) *Params {
s.Pathname = &v
return s
}
func (s *Params) SetMethod(v string) *Params {
s.Method = &v
return s
}
func (s *Params) SetAuthType(v string) *Params {
s.AuthType = &v
return s
}
func (s *Params) SetBodyType(v string) *Params {
s.BodyType = &v
return s
}
func (s *Params) SetReqBodyType(v string) *Params {
s.ReqBodyType = &v
return s
}
func (s *Params) SetStyle(v string) *Params {
s.Style = &v
return s
}
type OpenApiRequest struct {
Headers map[string]*string `json:"headers,omitempty" xml:"headers,omitempty"`
Query map[string]*string `json:"query,omitempty" xml:"query,omitempty"`
Body interface{} `json:"body,omitempty" xml:"body,omitempty"`
Stream io.Reader `json:"stream,omitempty" xml:"stream,omitempty"`
HostMap map[string]*string `json:"hostMap,omitempty" xml:"hostMap,omitempty"`
EndpointOverride *string `json:"endpointOverride,omitempty" xml:"endpointOverride,omitempty"`
}
func (s OpenApiRequest) String() string {
return tea.Prettify(s)
}
func (s OpenApiRequest) GoString() string {
return s.String()
}
func (s *OpenApiRequest) SetHeaders(v map[string]*string) *OpenApiRequest {
s.Headers = v
return s
}
func (s *OpenApiRequest) SetQuery(v map[string]*string) *OpenApiRequest {
s.Query = v
return s
}
func (s *OpenApiRequest) SetBody(v interface{}) *OpenApiRequest {
s.Body = v
return s
}
func (s *OpenApiRequest) SetStream(v io.Reader) *OpenApiRequest {
s.Stream = v
return s
}
func (s *OpenApiRequest) SetHostMap(v map[string]*string) *OpenApiRequest {
s.HostMap = v
return s
}
func (s *OpenApiRequest) SetEndpointOverride(v string) *OpenApiRequest {
s.EndpointOverride = &v
return s
}
type Client struct {
Endpoint *string
Project *string
RegionId *string
Protocol *string
Method *string
UserAgent *string
ReadTimeout *int
ConnectTimeout *int
Credential credential.Credential
SignatureVersion *string
Headers map[string]*string
Suffix *string
GlobalParameters *GlobalParameters
}
// Description:
//
// Init client with Config
//
// @param config - config contains the necessary information to create a client
func NewClient(config *Config)(*Client, error) {
client := new(Client)
err := client.Init(config)
return client, err
}
func (client *Client)Init(config *Config)(_err error) {
if tea.BoolValue(util.IsUnset(config)) {
_err = tea.NewSDKError(map[string]interface{}{
"code": "ParameterMissing",
"message": "'config' can not be unset",
})
return _err
}
if !tea.BoolValue(util.Empty(config.AccessKeyId)) && !tea.BoolValue(util.Empty(config.AccessKeySecret)) {
if !tea.BoolValue(util.Empty(config.SecurityToken)) {
config.Type = tea.String("sts")
} else {
config.Type = tea.String("access_key")
}
credentialConfig := &credential.Config{
AccessKeyId: config.AccessKeyId,
Type: config.Type,
AccessKeySecret: config.AccessKeySecret,
}
credentialConfig.SecurityToken = config.SecurityToken
client.Credential, _err = credential.NewCredential(credentialConfig)
if _err != nil {
return _err
}
} else if !tea.BoolValue(util.Empty(config.BearerToken)) {
cc := &credential.Config{
Type: tea.String("bearer"),
BearerToken: config.BearerToken,
}
client.Credential, _err = credential.NewCredential(cc)
if _err != nil {
return _err
}
} else if !tea.BoolValue(util.IsUnset(config.Credential)) {
client.Credential = config.Credential
}
client.Project = config.Project
client.Endpoint = config.Endpoint
client.Protocol = config.Protocol
client.Method = config.Method
client.RegionId = config.RegionId
client.UserAgent = config.UserAgent
client.ReadTimeout = config.ReadTimeout
client.ConnectTimeout = config.ConnectTimeout
client.SignatureVersion = config.SignatureVersion
client.GlobalParameters = config.GlobalParameters
client.Suffix = config.Suffix
return nil
}
// Description:
//
// Encapsulate the request and invoke the network
//
// @param action - api name
//
// @param version - product version
//
// @param protocol - http or https
//
// @param method - e.g. GET
//
// @param authType - authorization type e.g. AK
//
// @param bodyType - response body type e.g. String
//
// @param request - object of OpenApiRequest
//
// @param runtime - which controls some details of call api, such as retry times
//
// @return the response
func (client *Client) DoRequest(params *Params, request *OpenApiRequest, runtime *util.RuntimeOptions) (_result map[string]interface{}, _err error) {
_err = tea.Validate(params)
if _err != nil {
return _result, _err
}
_err = tea.Validate(request)
if _err != nil {
return _result, _err
}
_err = tea.Validate(runtime)
if _err != nil {
return _result, _err
}
_runtime := map[string]interface{}{
"timeouted": "retry",
"readTimeout": tea.IntValue(util.DefaultNumber(runtime.ReadTimeout, client.ReadTimeout)),
"connectTimeout": tea.IntValue(util.DefaultNumber(runtime.ConnectTimeout, client.ConnectTimeout)),
"retry": map[string]interface{}{
"retryable": tea.BoolValue(runtime.Autoretry),
"maxAttempts": tea.IntValue(util.DefaultNumber(runtime.MaxAttempts, tea.Int(3))),
},
"backoff": map[string]interface{}{
"policy": tea.StringValue(util.DefaultString(runtime.BackoffPolicy, tea.String("no"))),
"period": tea.IntValue(util.DefaultNumber(runtime.BackoffPeriod, tea.Int(1))),
},
"ignoreSSL": tea.BoolValue(runtime.IgnoreSSL),
}
_resp := make(map[string]interface{})
for _retryTimes := 0; tea.BoolValue(tea.AllowRetry(_runtime["retry"], tea.Int(_retryTimes))); _retryTimes++ {
if _retryTimes > 0 {
_backoffTime := tea.GetBackoffTime(_runtime["backoff"], tea.Int(_retryTimes))
if tea.IntValue(_backoffTime) > 0 {
tea.Sleep(_backoffTime)
}
}
_resp, _err = func()(map[string]interface{}, error){
request_ := tea.NewRequest()
request_.Protocol = util.DefaultString(client.Protocol, params.Protocol)
request_.Method = params.Method
if !tea.BoolValue(util.IsUnset(client.Suffix)) {
request_.Pathname = tea.String("/" + tea.StringValue(client.Suffix) + tea.StringValue(params.Pathname))
} else {
request_.Pathname = params.Pathname
}
globalQueries := make(map[string]*string)
globalHeaders := make(map[string]*string)
if !tea.BoolValue(util.IsUnset(client.GlobalParameters)) {
globalParams := client.GlobalParameters
if !tea.BoolValue(util.IsUnset(globalParams.Queries)) {
globalQueries = globalParams.Queries
}
if !tea.BoolValue(util.IsUnset(globalParams.Headers)) {
globalHeaders = globalParams.Headers
}
}
extendsHeaders := make(map[string]*string)
extendsQueries := make(map[string]*string)
if !tea.BoolValue(util.IsUnset(runtime.ExtendsParameters)) {
extendsParameters := runtime.ExtendsParameters
if !tea.BoolValue(util.IsUnset(extendsParameters.Headers)) {
extendsHeaders = extendsParameters.Headers
}
if !tea.BoolValue(util.IsUnset(extendsParameters.Queries)) {
extendsQueries = extendsParameters.Queries
}
}
request_.Query = tea.Merge(globalQueries,
extendsQueries,
request.Query)
// endpoint is setted in product client
request_.Headers = tea.Merge(map[string]*string{
"host": client.Endpoint,
"user-agent": client.GetUserAgent(),
"x-odps-user-agent": client.GetUserAgent(),
"Date": mcutil.GetApiTimestamp(),
},globalHeaders,
extendsHeaders,
request.Headers)
if !tea.BoolValue(util.IsUnset(request.Stream)) {
tmp, _err := util.ReadAsBytes(request.Stream)
if _err != nil {
return _result, _err
}
request_.Body = tea.ToReader(tmp)
}
if !tea.BoolValue(util.IsUnset(request.Body)) {
jsonObj := util.ToJSONString(request.Body)
request_.Body = tea.ToReader(jsonObj)
request_.Headers["content-type"] = tea.String("application/json; charset=utf-8")
}
canonicalString := mcutil.BuildCanonicalString(params.Method, params.Pathname, request_.Query, request_.Headers)
if !tea.BoolValue(util.EqualString(params.AuthType, tea.String("Anonymous"))) {
if tea.BoolValue(util.IsUnset(client.Credential)) {
_err = tea.NewSDKError(map[string]interface{}{
"code": "InvalidCredentials",
"message": "Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.",
})
return _result, _err
}
credentialModel, _err := client.Credential.GetCredential()
if _err != nil {
return _result, _err
}
authType := credentialModel.Type
if tea.BoolValue(util.EqualString(authType, tea.String("bearer"))) {
bearerToken := credentialModel.BearerToken
request_.Headers["x-odps-bearer-token"] = bearerToken
} else {
accessKeyId := credentialModel.AccessKeyId
accessKeySecret := credentialModel.AccessKeySecret
securityToken := credentialModel.SecurityToken
request_.Headers["Authorization"] = mcutil.GetSignature(canonicalString, accessKeyId, accessKeySecret)
if !tea.BoolValue(util.Empty(securityToken)) {
request_.Headers["authorization-sts-token"] = securityToken
}
}
}
response_, _err := tea.DoRequest(request_, _runtime)
if _err != nil {
return _result, _err
}
if tea.BoolValue(util.EqualNumber(response_.StatusCode, tea.Int(204))) {
_result = make(map[string]interface{})
_err = tea.Convert(map[string]map[string]*string{
"headers": response_.Headers,
}, &_result)
return _result, _err
}
if tea.BoolValue(util.Is4xx(response_.StatusCode)) || tea.BoolValue(util.Is5xx(response_.StatusCode)) {
err := map[string]interface{}{}
responseBody, _err := util.ReadAsString(response_.Body)
if _err != nil {
return _result, _err
}
_, tryErr := func()(_r map[string]interface{}, _e error) {
defer func() {
if r := tea.Recover(recover()); r != nil {
_e = r
}
}()
_res := util.ParseJSON(responseBody)
err, _err = util.AssertAsMap(_res)
if _err != nil {
return _result, _err
}
return nil, nil
}()
if tryErr != nil {
var error = &tea.SDKError{}
if _t, ok := tryErr.(*tea.SDKError); ok {
error = _t
} else {
error.Message = tea.String(tryErr.Error())
}
err = map[string]interface{}{}
err["Code"] = tea.String("Unknown")
err["Message"] = responseBody
}
requestId := mcutil.ToString(DefaultAny(response_.Headers["x-odps-request-id"], response_.Headers["X-Odps-Request-Id"]))
err["statusCode"] = response_.StatusCode
_err = tea.NewSDKError(map[string]interface{}{
"code": tea.ToString(DefaultAny(err["Code"], err["code"])),
"message": "code: " + tea.ToString(tea.IntValue(response_.StatusCode)) + ", " + tea.ToString(DefaultAny(err["Message"], err["message"])) + " request id: " + tea.StringValue(requestId),
"data": err,
"description": tea.ToString(DefaultAny(err["Description"], err["description"])),
"accessDeniedDetail": DefaultAny(err["AccessDeniedDetail"], err["accessDeniedDetail"]),
})
return _result, _err
}
if tea.BoolValue(util.EqualString(params.BodyType, tea.String("binary"))) {
resp := map[string]interface{}{
"body": response_.Body,
"headers": response_.Headers,
"statusCode": tea.IntValue(response_.StatusCode),
}
_result = resp
return _result , _err
} else if tea.BoolValue(util.EqualString(params.BodyType, tea.String("byte"))) {
byt, _err := util.ReadAsBytes(response_.Body)
if _err != nil {
return _result, _err
}
_result = make(map[string]interface{})
_err = tea.Convert(map[string]interface{}{
"body": byt,
"headers": response_.Headers,
"statusCode": tea.IntValue(response_.StatusCode),
}, &_result)
return _result, _err
} else if tea.BoolValue(util.EqualString(params.BodyType, tea.String("string"))) {
str, _err := util.ReadAsString(response_.Body)
if _err != nil {
return _result, _err
}
_result = make(map[string]interface{})
_err = tea.Convert(map[string]interface{}{
"body": tea.StringValue(str),
"headers": response_.Headers,
"statusCode": tea.IntValue(response_.StatusCode),
}, &_result)
return _result, _err
} else if tea.BoolValue(util.EqualString(params.BodyType, tea.String("json"))) {
obj, _err := util.ReadAsJSON(response_.Body)
if _err != nil {
return _result, _err
}
res, _err := util.AssertAsMap(obj)
if _err != nil {
return _result, _err
}
_result = res
return _result , _err
} else if tea.BoolValue(util.EqualString(params.BodyType, tea.String("array"))) {
arr, _err := util.ReadAsJSON(response_.Body)
if _err != nil {
return _result, _err
}
_result = make(map[string]interface{})
_err = tea.Convert(map[string]interface{}{
"body": arr,
"headers": response_.Headers,
"statusCode": tea.IntValue(response_.StatusCode),
}, &_result)
return _result, _err
} else {
anything, _err := util.ReadAsString(response_.Body)
if _err != nil {
return _result, _err
}
_result = make(map[string]interface{})
_err = tea.Convert(map[string]interface{}{
"body": tea.StringValue(anything),
"headers": response_.Headers,
"statusCode": tea.IntValue(response_.StatusCode),
}, &_result)
return _result, _err
}
}()
if !tea.BoolValue(tea.Retryable(_err)) {
break
}
}
return _resp, _err
}
func (client *Client) RequestWithModel (model interface{}, method *string, path *string, runtime *util.RuntimeOptions) (_result map[string]interface{}, _err error) {
_err = util.ValidateModel(model)
if _err != nil {
return _result, _err
}
req := &OpenApiRequest{
Body: util.ToMap(model),
}
openapiParams := &Params{
Pathname: path,
Method: method,
BodyType: tea.String("json"),
}
_result = make(map[string]interface{})
_body, _err := client.CallApi(openapiParams, req, runtime)
if _err != nil {
return _result, _err
}
_result = _body
return _result, _err
}
func (client *Client) RequestWithoutModel (model interface{}, method *string, path *string, runtime *util.RuntimeOptions) (_result map[string]interface{}, _err error) {
_err = util.ValidateModel(model)
if _err != nil {
return _result, _err
}
req := &OpenApiRequest{
Body: util.ToMap(model),
}
openapiParams := &Params{
Pathname: path,
Method: method,
BodyType: tea.String("none"),
}
_result = make(map[string]interface{})
_body, _err := client.CallApi(openapiParams, req, runtime)
if _err != nil {
return _result, _err
}
_result = _body
return _result, _err
}
func (client *Client) CallApi (params *Params, request *OpenApiRequest, runtime *util.RuntimeOptions) (_result map[string]interface{}, _err error) {
if tea.BoolValue(util.IsUnset(params)) {
_err = tea.NewSDKError(map[string]interface{}{
"code": "ParameterMissing",
"message": "'params' can not be unset",
})
return _result, _err
}
_result = make(map[string]interface{})
_body, _err := client.DoRequest(params, request, runtime)
if _err != nil {
return _result, _err
}
_result = _body
return _result, _err
}
// Description:
//
// Get user agent
//
// @return user agent
func (client *Client) GetUserAgent () (_result *string) {
userAgent := util.GetUserAgent(client.UserAgent)
_result = userAgent
return _result
}
// Description:
//
// Get accesskey id by using credential
//
// @return accesskey id
func (client *Client) GetAccessKeyId () (_result *string, _err error) {
if tea.BoolValue(util.IsUnset(client.Credential)) {
_result = tea.String("")
return _result, _err
}
accessKeyId, _err := client.Credential.GetAccessKeyId()
if _err != nil {
return _result, _err
}
_result = accessKeyId
return _result , _err
}
// Description:
//
// Get accesskey secret by using credential
//
// @return accesskey secret
func (client *Client) GetAccessKeySecret () (_result *string, _err error) {
if tea.BoolValue(util.IsUnset(client.Credential)) {
_result = tea.String("")
return _result, _err
}
secret, _err := client.Credential.GetAccessKeySecret()
if _err != nil {
return _result, _err
}
_result = secret
return _result , _err
}
// Description:
//
// Get security token by using credential
//
// @return security token
func (client *Client) GetSecurityToken () (_result *string, _err error) {
if tea.BoolValue(util.IsUnset(client.Credential)) {
_result = tea.String("")
return _result, _err
}
token, _err := client.Credential.GetSecurityToken()
if _err != nil {
return _result, _err
}
_result = token
return _result , _err
}
// Description:
//
// Get bearer token by credential
//
// @return bearer token
func (client *Client) GetBearerToken () (_result *string, _err error) {
if tea.BoolValue(util.IsUnset(client.Credential)) {
_result = tea.String("")
return _result, _err
}
token := client.Credential.GetBearerToken()
_result = token
return _result , _err
}
// Description:
//
// If inputValue is not null, return it or return defaultValue
//
// @param inputValue - users input value
//
// @param defaultValue - default value
//
// @return the final result
func DefaultAny (inputValue interface{}, defaultValue interface{}) (_result interface{}) {
if tea.BoolValue(util.IsUnset(inputValue)) {
_result = defaultValue
return _result
}
_result = inputValue
return _result
}