cloudsso/access_configurations.go (94 lines of code) (raw):
package cloudsso
import (
"encoding/json"
"fmt"
"github.com/aliyun/aliyun-cli/v3/cli"
"io"
"net/http"
"strconv"
)
// AccessConfigurationsParameter is a struct that holds the parameters for accessing configurations.
type AccessConfigurationsParameter struct {
UrlPrefix string `json:"urlPrefix"`
AccessToken string `json:"accessToken"`
AccountId string `json:"accountId"`
HttpClient *http.Client `json:"-"`
}
// AccessConfigurationsRequest 表示获取访问配置的请求参数
type AccessConfigurationsRequest struct {
AccountId string
NextToken string
MaxResults int
}
// AccessConfigurationsResponse 表示访问配置的响应
type AccessConfigurationsResponse struct {
AccessConfigurationsForAccount []AccessConfiguration `json:"AccessConfigurationsForAccount"`
NextToken string `json:"NextToken"`
IsTruncated bool `json:"IsTruncated"`
}
// AccessConfiguration 表示单个访问配置
type AccessConfiguration struct {
AccessConfigurationId string `json:"AccessConfigurationId"`
AccessConfigurationName string `json:"AccessConfigurationName"`
AccessConfigurationDescription string `json:"AccessConfigurationDescription"`
}
// ListAccessConfigurationsForAccount 获取单次访问配置列表
func (p *AccessConfigurationsParameter) ListAccessConfigurationsForAccount(req AccessConfigurationsRequest) (*AccessConfigurationsResponse, error) {
// 构建URL
url := fmt.Sprintf("%s/access-assignments/access-configurations", p.UrlPrefix)
// 添加查询参数
query := url + "?AccountId=" + req.AccountId
if req.NextToken != "" {
query += "&NextToken=" + req.NextToken
}
if req.MaxResults > 0 {
query += "&MaxResults=" + strconv.Itoa(req.MaxResults)
}
// 创建HTTP请求
httpReq, err := http.NewRequest("GET", query, nil)
if err != nil {
return nil, err
}
// 设置请求头
httpReq.Header.Set("Accept", "application/json")
httpReq.Header.Set("Content-Type", "application/json")
httpReq.Header.Set("Authorization", "Bearer "+p.AccessToken)
httpReq.Header.Set("User-Agent", "aliyun/CLI-"+cli.Version)
// 发送请求
client := p.HttpClient
if client == nil {
client = http.DefaultClient
}
resp, err := client.Do(httpReq)
if err != nil {
return nil, err
}
defer resp.Body.Close()
// 读取响应体
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
// 检查错误
if resp.StatusCode >= 400 && resp.StatusCode < 500 {
var errResp struct {
ErrorCode string `json:"ErrorCode"`
ErrorMessage string `json:"ErrorMessage"`
RequestId string `json:"RequestId"`
}
if err := json.Unmarshal(body, &errResp); err != nil {
return nil, err
}
return nil, fmt.Errorf("%s: %s %s", errResp.ErrorCode, errResp.ErrorMessage, errResp.RequestId)
}
// 解析响应
var result AccessConfigurationsResponse
if err := json.Unmarshal(body, &result); err != nil {
return nil, err
}
return &result, nil
}
// ListAllAccessConfigurations 获取所有访问配置列表
func (p *AccessConfigurationsParameter) ListAllAccessConfigurations(req AccessConfigurationsRequest) ([]AccessConfiguration, error) {
var configurations []AccessConfiguration
// 获取第一页数据
response, err := p.ListAccessConfigurationsForAccount(req)
if err != nil {
return nil, err
}
configurations = append(configurations, response.AccessConfigurationsForAccount...)
// 如果有更多页,继续请求
for response.IsTruncated {
req.NextToken = response.NextToken
response, err = p.ListAccessConfigurationsForAccount(req)
if err != nil {
return nil, err
}
configurations = append(configurations, response.AccessConfigurationsForAccount...)
}
return configurations, nil
}