huaweicloud-sdk-go-v3
huaweicloud-sdk-go-v3 copied to clipboard
自动获取DomainID失败无法返回原始错误信息
在v0.1.84本版的core/auth/global/global_icredential.go文件中的78行和83行使用了panic,且值是字符串, 直接使用err如何
在v0.1.84本版的core/auth/global/global_icredential.go文件中的78行和83行使用了panic,且值是字符串, 直接使用err如何
v0.1.84版本SDK内部已使用recover处理panic问题,参考README中的代码示例,使用SafeBuild方法不会导致panic:
package main
import (
"os"
"fmt"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
vpc "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/vpc/v2"
vpcModel "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/vpc/v2/model"
vpcRegion "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/vpc/v2/region"
)
func main() {
// 配置认证信息
// 可通过环境变量等方式配置认证信息,参考2.4认证信息管理章节
auth, err := basic.NewCredentialsBuilder().
WithAk(os.Getenv("HUAWEICLOUD_SDK_AK")).
WithSk(os.Getenv("HUAWEICLOUD_SDK_SK")).
SafeBuild()
if err != nil {
fmt.Println(err)
return
}
// Get available region
region, err := vpcRegion.SafeValueOf("cn-north-4")
if err != nil {
fmt.Println(err)
return
}
// 创建服务客户端
hcClient, err := vpc.VpcClientBuilder().
WithRegion(region).
WithCredential(auth).
SafeBuild()
if err != nil {
fmt.Println(err)
return
}
client := vpc.NewVpcClient(hcClient)
// 发送请求并获取响应
request := &vpcModel.ListVpcsRequest{}
response, err := client.ListVpcs(request)
if err == nil {
fmt.Printf("%+v\n", response)
} else {
fmt.Println(err)
}
}
在v0.1.84本版的core/auth/global/global_icredential.go文件中的78行和83行使用了panic,且值是字符串, 直接使用err如何
v0.1.84版本SDK内部已使用recover处理panic问题,参考README中的代码示例,使用SafeBuild方法不会导致panic:
package main import ( "os" "fmt" "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic" vpc "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/vpc/v2" vpcModel "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/vpc/v2/model" vpcRegion "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/vpc/v2/region" ) func main() { // 配置认证信息 // 可通过环境变量等方式配置认证信息,参考2.4认证信息管理章节 auth, err := basic.NewCredentialsBuilder(). WithAk(os.Getenv("HUAWEICLOUD_SDK_AK")). WithSk(os.Getenv("HUAWEICLOUD_SDK_SK")). SafeBuild() if err != nil { fmt.Println(err) return } // Get available region region, err := vpcRegion.SafeValueOf("cn-north-4") if err != nil { fmt.Println(err) return } // 创建服务客户端 hcClient, err := vpc.VpcClientBuilder(). WithRegion(region). WithCredential(auth). SafeBuild() if err != nil { fmt.Println(err) return } client := vpc.NewVpcClient(hcClient) // 发送请求并获取响应 request := &vpcModel.ListVpcsRequest{} response, err := client.ListVpcs(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } }
我知道有个SafeBuild方法了, 我的问题不是出现panic, 而是panic无法获取原始的错误,例如sdkerr.ServiceResponseError. 我现在需要调用KeystoneListProjects方法用来获取项目列表,我没有填写DomainID,所以SDK自动获取了,自动获取失败时的错误信息就是个字符串. 或者有没有手动获取DomainID的方法
package main
import (
"fmt"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/global"
iam "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/iam/v3"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/iam/v3/model"
)
func main() {
ak := ""
sk := ""
auth, err := global.NewCredentialsBuilder().
WithAk(ak).
WithSk(sk).
SafeBuild()
if err != nil {
fmt.Println(err)
return
}
hcHttpClient, err := iam.IamClientBuilder().
WithEndpoints([]string{"https://iam.myhuaweicloud.com"}).
WithCredential(auth).
SafeBuild()
if err != nil {
fmt.Println(err)
return
}
client := iam.NewIamClient(hcHttpClient)
request := &model.KeystoneListAuthDomainsRequest{}
response, err := client.KeystoneListAuthDomains(request)
if err == nil {
fmt.Printf("%+v\n", response)
} else {
fmt.Println(err)
}
}
参考 https://console.huaweicloud.com/apiexplorer/#/openapi/IAM/doc?api=KeystoneListAuthDomains
原来是使用了region结构体才会自动获取DomainID, KeystoneListProjects似乎不需要DomainID