huaweicloud-sdk-go-v3 icon indicating copy to clipboard operation
huaweicloud-sdk-go-v3 copied to clipboard

自动获取DomainID失败无法返回原始错误信息

Open ykaii opened this issue 11 months ago • 4 comments

在v0.1.84本版的core/auth/global/global_icredential.go文件中的78行和83行使用了panic,且值是字符串, 直接使用err如何

ykaii avatar Mar 07 '24 07:03 ykaii

在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)
    }
}

mawenbo-huawei avatar Mar 07 '24 07:03 mawenbo-huawei

在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的方法

ykaii avatar Mar 07 '24 08:03 ykaii

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

mawenbo-huawei avatar Mar 07 '24 08:03 mawenbo-huawei

原来是使用了region结构体才会自动获取DomainID, KeystoneListProjects似乎不需要DomainID

ykaii avatar Mar 07 '24 08:03 ykaii