通過IDE使用阿里云Go SDK
本文以在Windows操作系統(tǒng)上,通過VS Code使用阿里云SDK為例,幫助您了解如何快速使用阿里云Go SDK。
前提條件
已安裝Go,如您未安裝請參見在Windows安裝Go。
已安裝VS Code,如果您未安裝請參見在Windows搭建Go開發(fā)環(huán)境。
使用 SDK
使用OpenAPI門戶提供的代碼示例工程
可能會存在OpenAPI無法下載代碼示例工程的情況,您可以查看在已有項(xiàng)目中使用SDK的介紹。
進(jìn)入OpenAPI門戶的API調(diào)試頁面,選擇云產(chǎn)品和接口。例如我們以調(diào)用云服務(wù)器ECS的DescribeRegions接口為例,可在搜索欄中填入DescribeRegions,在搜索結(jié)果中單擊API名稱進(jìn)入API調(diào)試頁面。
在參數(shù)配置頁簽中填寫需要的參數(shù)信息。填寫時請參考右側(cè)文檔頁簽,充分了解接口的說明和注意事項(xiàng)(尤其是費(fèi)用相關(guān)信息),以及各參數(shù)的具體含義和使用方法。
如DescribeRegions接口支持傳入三個參數(shù):
參數(shù)名
是否必填
說明
InstanceChargeType
非必填
不同的實(shí)例計費(fèi)方式可能支持的地域不同。默認(rèn)值為PrePaid。
ResourceType
非必填
不同的資源類型可能支持的地域不同。默認(rèn)值為instance。
AcceptLanguage
非必填
設(shè)置返回結(jié)果的語言。默認(rèn)值為zh-CN。
在右側(cè)的SDK示例頁面,選擇語言,單擊下載完整工程按鈕,下載SDK完整工程至本地并解壓。
打開VS Code,在菜單欄單擊File->Open Folder,選擇解壓后的文件夾。
在VS Code菜單欄中單擊Terminal->New Terminal,將會在底部展示TERMINAL窗口。
在Terminal中執(zhí)行以下命令來整理和更新當(dāng)前模塊的依賴關(guān)系。
go mod tidy
運(yùn)行示例代碼。在Terminal中執(zhí)行以下命令,運(yùn)行main包下的示例代碼。
go run ./main
查看運(yùn)行結(jié)果。在Terminal中按下
Ctrl+F
,搜索statusCode
,如果看到"statusCode":200
表示調(diào)用成功。
在已有項(xiàng)目中使用SDK
打開VS Code,在VS Code菜單欄,單擊File->Open Folder,新建一個項(xiàng)目文件夾或者選擇一個已有的項(xiàng)目文件夾。例如文件夾名稱為gosdkproject,然后選擇該文件夾。
在VS Code菜單欄中單擊Terminal->New Terminal,將會在底部展示Terminal窗口。并在Terminal中執(zhí)行
go mod init gosdkprojects
進(jìn)行Go項(xiàng)目初始化。獲取SDK。
訪問SDK中心,選擇您想要使用的 SDK的云產(chǎn)品,這里以云服務(wù)器ECS為例。SDK版本選擇V2.0,語言選擇Go。
安裝SDK。
復(fù)制安裝命令到Terminal中,然后按下回車執(zhí)行。
創(chuàng)建一個.go文件。在項(xiàng)目名稱右邊,單擊New File...,填寫文件名稱,例如ecsDescribeRegions.go。
初始化客戶端。
如您想調(diào)用ECS的API,必須先對ECS的客戶端做初始化。
重要初始化客戶端時需要使用AccessKey完成身份驗(yàn)證,請?zhí)崆矮@取AccessKey。獲取方法請參見創(chuàng)建AccessKey。
獲取RAM用戶的AccessKey之后,還需要在環(huán)境變量中設(shè)置AccessKey,具體操作步驟請參見在Linux、macOS和Windows系統(tǒng)配置環(huán)境變量。
endpoint如何設(shè)置請參見服務(wù)接入點(diǎn)。
package main import ( "os" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client" "github.com/alibabacloud-go/tea/tea" ) // CreateClient 函數(shù)初始化并返回一個 ECS Client。 // 該函數(shù)不接受參數(shù),但需要確保環(huán)境變量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET 已經(jīng)設(shè)置。 // return *ecs20140526.Client // return error:如果在創(chuàng)建客戶端過程中遇到任何錯誤,則返回非 nil 錯誤對象。 func CreateClient() (_result *ecs20140526.Client, _err error) { // 初始化 openapi.Config 對象,用于配置 ECS 客戶端。 config := &openapi.Config{ AccessKeyId: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")), AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")), Endpoint: tea.String("ecs.cn-hangzhou.aliyuncs.com"), } // 使用配置信息創(chuàng)建并返回一個 ECS 客戶端實(shí)例。 return ecs20140526.NewClient(config) }
調(diào)用API。在調(diào)用OpenAPI之前,您需要先了解OpenAPI的詳細(xì)信息,請查看API文檔,以調(diào)用ECS的DescribeRegions為例。
說明每個API都有獨(dú)立的請求對象,命名規(guī)則為${API名稱}${Request},例如DescribeRegionsRequest。
package main import ( "os" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client" "github.com/alibabacloud-go/tea/tea" ) // CreateClient 函數(shù)初始化并返回一個 ECS Client。 // 該函數(shù)不接受參數(shù),但需要確保環(huán)境變量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET 已經(jīng)設(shè)置。 // return *ecs20140526.Client // return error:如果在創(chuàng)建客戶端過程中遇到任何錯誤,則返回非 nil 錯誤對象。 func CreateClient() (_result *ecs20140526.Client, _err error) { // 初始化 openapi.Config 對象,用于配置 ECS 客戶端。 config := &openapi.Config{ AccessKeyId: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")), AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")), Endpoint: tea.String("ecs.cn-hangzhou.aliyuncs.com"), } // 使用配置信息創(chuàng)建并返回一個 ECS 客戶端實(shí)例。 return ecs20140526.NewClient(config) } // InvokeApi 函數(shù)用于調(diào)用ECS的DescribeRegions接口,查詢可用的地域信息。 // // 返回值: // _result: 返回一個*ecs20140526.DescribeRegionsResponse類型的指針,包含查詢到的地域信息。 // _err: 返回一個error類型的錯誤信息,如果調(diào)用過程中發(fā)生錯誤,則該值非空。 func InvokeApi()(_result *ecs20140526.DescribeRegionsResponse, _err error) { // 創(chuàng)建ECS客戶端 client, _err := CreateClient() if _err != nil { // 如果創(chuàng)建客戶端過程中出現(xiàn)錯誤,直接返回錯誤信息 return _result, _err } // 創(chuàng)建DescribeRegions請求 describeRegionsRequest := &ecs20140526.DescribeRegionsRequest{} // 發(fā)起DescribeRegions請求,并返回結(jié)果 return client.DescribeRegions(describeRegionsRequest) }
異常處理。
阿里云Go SDK通過返回報錯信息來處理異常,詳情請參見異常處理。但是在某些不可預(yù)料的情況下,可能需要使用
panic
和recover
來處理異常。Go語言中使用panic
來處理異常時,會立即停止當(dāng)前函數(shù)的執(zhí)行。所以一般還會搭配defer一起使用,在defer
中通過recover
函數(shù)捕獲當(dāng)前的panic
,使正常執(zhí)行流程恢復(fù)。因此,合理使用panic
,defer
和recover
可以幫助構(gòu)建更健壯的錯誤處理邏輯,尤其是在處理可能引起程序崩潰的嚴(yán)重錯誤時。package main import ( "fmt" "os" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v4/client" "github.com/alibabacloud-go/tea/tea" ) // CreateClient 函數(shù)初始化并返回一個 ECS Client。 // 該函數(shù)不接受參數(shù),但需要確保環(huán)境變量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET 已經(jīng)設(shè)置。 // return *ecs20140526.Client // return error:如果在創(chuàng)建客戶端過程中遇到任何錯誤,則返回非 nil 錯誤對象。 func CreateClient() (_result *ecs20140526.Client, _err error) { // 初始化 openapi.Config 對象,用于配置 ECS 客戶端。 config := &openapi.Config{ AccessKeyId: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")), AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")), Endpoint: tea.String("ecs.cn-hangzhou.aliyuncs.com"), } // 使用配置信息創(chuàng)建并返回一個 ECS 客戶端實(shí)例。 return ecs20140526.NewClient(config) } // InvokeApi 函數(shù)用于調(diào)用ECS的DescribeRegions接口,查詢可用的地域信息。 // // 返回值: // _result: 返回一個*ecs20140526.DescribeRegionsResponse類型的指針,包含查詢到的地域信息。 // _err: 返回一個error類型的錯誤信息,如果調(diào)用過程中發(fā)生錯誤,則該值非空。 func InvokeApi() (_result *ecs20140526.DescribeRegionsResponse, _err error) { // 創(chuàng)建ECS客戶端 client, _err := CreateClient() if _err != nil { // 如果創(chuàng)建客戶端過程中出現(xiàn)錯誤,直接返回錯誤信息 return _result, _err } // 創(chuàng)建DescribeRegions請求 describeRegionsRequest := &ecs20140526.DescribeRegionsRequest{} // 發(fā)起DescribeRegions請求,并返回結(jié)果 return client.DescribeRegions(describeRegionsRequest) } // 該函數(shù)主要實(shí)現(xiàn)了通過調(diào)用API獲取地域信息,并在發(fā)生異常時進(jìn)行恢復(fù)和處理。 func main() { // 在深度遞歸或無法預(yù)料的報錯等場景下,才推薦使用defer defer func() { if err := tea.Recover(recover()); err != nil { // 當(dāng)捕獲到異常時,根據(jù)異常類型進(jìn)行處理 if sdkError, ok := err.(*tea.SDKError); ok { // 打印SDK錯誤信息、錯誤碼和相關(guān)數(shù)據(jù) fmt.Println(tea.StringValue(sdkError.Message)) fmt.Println(tea.StringValue(sdkError.Code)) fmt.Println(tea.StringValue(sdkError.Data)) } else { // 打印其他類型錯誤信息 fmt.Println(err) } } }() // 調(diào)用API獲取結(jié)果 result, _ := InvokeApi() // 遍歷并打印結(jié)果中的地域信息 for _, region := range result.Body.Regions.Region { fmt.Println("regionId: " + tea.StringValue(region.RegionId)) } // 打印RequestId fmt.Println("RequestId: " + tea.StringValue(result.Body.RequestId)) }
在TERMINAL中使用
go run
命令運(yùn)行。