Go SDK使用說明
物聯(lián)網(wǎng)平臺提供Go語言的云端SDK供開發(fā)人員使用。本文介紹云端Go SDK的安裝和配置,以及使用Go SDK調(diào)用云端API的示例。
安裝SDK
安裝Go開發(fā)環(huán)境。
目前支持Go 1.13.0及以上版本。請訪問Go官網(wǎng)獲取。
Go安裝完畢后,新建系統(tǒng)變量GOPATH,并將其指向您的代碼目錄。
了解更多GOPATH相關(guān)信息,請執(zhí)行命令
go help gopath
。執(zhí)行以下命令安裝阿里云Go SDK,通過Go mod來管理項目依賴。
重要以下命令安裝的SDK版本為示例值,最新版本信息,請參見OpenAPI門戶物聯(lián)網(wǎng)平臺的SDK安裝方式。Go SDK的歷史版本信息,請參見SDK的Code。
了解Go SDK詳細(xì)信息,請訪問alibabacloud-go-sdk。
Go SDK安裝路徑默認(rèn)為 $GOPATH/src/github.com/alibabacloud-go/iot-20180120,$GOPATH可以通過命令
go env GOPATH
查看。若Go SDK依賴包缺少,可執(zhí)行命令
go mod tidy
拉取。
go get github.com/alibabacloud-go/iot-20180120/v6
初始化SDK
創(chuàng)建對象config,存放SDK初始化信息(AccessKey ID、AccessKey Secret、地域ID等)。
通過
iot.NewClient(config)
方法加載SDK信息,創(chuàng)建客戶端實例,完成SDK客戶端初始化。
以華東2(上海)地域及其服務(wù)接入地址為例,初始代碼如下。實際場景設(shè)置中,需使用您的物聯(lián)網(wǎng)平臺服務(wù)所在地域。
import (
"encoding/json"
"strings"
"fmt"
"os"
iot20180120 "github.com/alibabacloud-go/iot-20180120/v6/client"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
/**
* 使用AK&SK初始化賬號Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
func CreateClient (accessKeyId *string, accessKeySecret *string) (_result *iot20180120.Client, _err error) {
config := &openapi.Config{
// 必填,您的 AccessKey ID
AccessKeyId: accessKeyId,
// 必填,您的 AccessKey Secret
AccessKeySecret: accessKeySecret,
}
// Endpoint 請參考 https://api.aliyun.com/product/Iot
config.Endpoint = tea.String("iot.cn-shanghai.aliyuncs.com")
_result = &iot20180120.Client{}
_result, _err = iot20180120.NewClient(config)
return _result, _err
}
func _main (args []*string) (_err error) {
// 請確保代碼運行環(huán)境設(shè)置了環(huán)境變量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代碼泄露可能會導(dǎo)致 AccessKey 泄露,并威脅賬號下所有資源的安全性。以下代碼示例使用環(huán)境變量獲取 AccessKey 的方式進(jìn)行調(diào)用,僅供參考,建議使用更安全的 STS 方式
client, _err := CreateClient(tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")), tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")))
if _err != nil {
return _err
}
......
}
參數(shù) | 說明 |
accessKeyId | 您阿里云賬號的AccessKey ID。 您可在阿里云官網(wǎng)控制臺AccessKey管理中創(chuàng)建或查看您的AccessKey。 |
accessKeySecret | 您阿里云賬號的AccessKey Secret。 |
RegionId | 您的物聯(lián)網(wǎng)平臺服務(wù)的地域ID,用于拼接服務(wù)接入地址,格式為:iot.${RegionId}.aliyuncs.com。 您可在物聯(lián)網(wǎng)平臺控制臺左上方,查看當(dāng)前服務(wù)所在地域。 地域ID的表達(dá)方法,請參見地域和可用區(qū)。 |
SDK客戶端的HTTP請求配置、代理配置、超時機(jī)制、重試機(jī)制等配置方式,請參見V2.0 Go SDK。
為避免將AccessKey硬編碼到業(yè)務(wù)代碼中帶來的安全風(fēng)險,可采用配置環(huán)境變量的方法管理AccessKey。
您需在本地操作系統(tǒng)中添加環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET,并分別寫入已準(zhǔn)備好的AccessKey ID和AccessKey Secret。
在示例代碼中可以通過以下方法獲取:
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
更多鑒權(quán)訪問方式,請參見管理訪問憑證。
發(fā)起調(diào)用
物聯(lián)網(wǎng)平臺云端SDK為每個API封裝兩個類,分別命名為${API名稱}+"Request"
和${API名稱}+"Response"
,分別用于承載API的調(diào)用請求和調(diào)用結(jié)果。
調(diào)用步驟
已完成SDK客戶端初始化。具體內(nèi)容,請參見初始化SDK。
創(chuàng)建對應(yīng)API的調(diào)用請求,生成
${API名稱}+"Request"
類對象實例request。通過對象實例request,使用
request.${請求參數(shù)的名稱}
方法,設(shè)置API所需的請求參數(shù)值。創(chuàng)建
${API名稱}+"Response"
類的對象實例response承載響應(yīng)結(jié)果:使用Client對象實例client的${API名稱}(request)
方法,獲取API對應(yīng)request的響應(yīng)結(jié)果,包含服務(wù)端響應(yīng)的body和headers。
物聯(lián)網(wǎng)平臺云端API,請參見API列表。有關(guān)request中請求參數(shù)說明,及response中返回參數(shù)說明,請參見對應(yīng)API文檔。
本文以調(diào)用Pub接口發(fā)布消息到Topic為例。請求參數(shù)信息,請參見Pub。
以下代碼中iotInstanceId為實例ID。實例的詳細(xì)說明,請參見實例概述。
購買實例方法,請參見購買企業(yè)版實例。
獲取實例ID方法,請參見物聯(lián)網(wǎng)平臺實例相關(guān)問題。
pubRequest := &iot20180120.PubRequest{
ProductKey: tea.String("${productKey}"),
IotInstanceId: tea.String("${iotInstanceId}"),
DeviceName: tea.String("${deviceName}"),
TopicFullName: tea.String("/${productKey}/${deviceName}/user/get"),
MessageContent: tea.String("eyJ0ZXN0IjoidGFzayBwdWIgYnJvYWRjYXN0In0="),
}
runtime := &util.RuntimeOptions{}
tryErr := func() (_e error) {
defer func() {
if r := tea.Recover(recover()); r != nil {
_e = r
}
}()
resp, _err := client.PubWithOptions(pubRequest, runtime)
if _err != nil {
return _err
}
console.Log(util.ToJSONString(resp))
return nil
}()
完整代碼示例
實際場景中,請參照上文的參數(shù)說明,替換對應(yīng)參數(shù)值。
// This file is auto-generated, don't edit it. Thanks.
package main
import (
"encoding/json"
"strings"
"fmt"
"os"
iot20180120 "github.com/alibabacloud-go/iot-20180120/v6/client"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
/**
* 使用AK&SK初始化賬號Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
func CreateClient (accessKeyId *string, accessKeySecret *string) (_result *iot20180120.Client, _err error) {
config := &openapi.Config{
// 必填,您的 AccessKey ID
AccessKeyId: accessKeyId,
// 必填,您的 AccessKey Secret
AccessKeySecret: accessKeySecret,
}
// Endpoint 請參考 https://api.aliyun.com/product/Iot
config.Endpoint = tea.String("iot.cn-shanghai.aliyuncs.com")
_result = &iot20180120.Client{}
_result, _err = iot20180120.NewClient(config)
return _result, _err
}
func _main (args []*string) (_err error) {
// 請確保代碼運行環(huán)境設(shè)置了環(huán)境變量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代碼泄露可能會導(dǎo)致 AccessKey 泄露,并威脅賬號下所有資源的安全性。以下代碼示例使用環(huán)境變量獲取 AccessKey 的方式進(jìn)行調(diào)用,僅供參考,建議使用更安全的 STS 方式
client, _err := CreateClient(tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")), tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")))
if _err != nil {
return _err
}
pubRequest := &iot20180120.PubRequest{
// 產(chǎn)品ProductKey。
ProductKey: tea.String("${productKey}"),
// 物聯(lián)網(wǎng)平臺實例ID。
IotInstanceId: tea.String("${iotInstanceId}"),
DeviceName: tea.String("${deviceName}"),
// 要接收消息的設(shè)備的自定義Topic。
TopicFullName: tea.String("/${productKey}/${deviceName}/user/get"),
// 要發(fā)送的消息主體:{"test":"task pub broadcast"}
MessageContent: tea.String("eyJ0ZXN0IjoidGFzayBwdWIgYnJvYWRjYXN0In0="),
}
runtime := &util.RuntimeOptions{}
tryErr := func()(_e error) {
defer func() {
if r := tea.Recover(recover()); r != nil {
_e = r
}
}()
// 復(fù)制代碼運行請自行打印 API 的返回值
_, _err = client.PubWithOptions(pubRequest, runtime)
if _err != nil {
return _err
}
return nil
}()
if tryErr != nil {
var error = &tea.SDKError{}
if _t, ok := tryErr.(*tea.SDKError); ok {
error = _t
} else {
error.Message = tea.String(tryErr.Error())
}
// 此處僅做打印展示,請謹(jǐn)慎對待異常處理,在工程項目中切勿直接忽略異常。
// 錯誤 message
fmt.Println(tea.StringValue(error.Message))
// 診斷地址
var data interface{}
d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data)))
d.Decode(&data)
if m, ok := data.(map[string]interface{}); ok {
recommend, _ := m["Recommend"]
fmt.Println(recommend)
}
_, _err = util.AssertAsString(error.Message)
if _err != nil {
return _err
}
}
return _err
}
func main() {
err := _main(tea.StringSlice(os.Args[1:]))
if err != nil {
panic(err)
}
}
附錄:示例代碼
前往物聯(lián)網(wǎng)平臺云端SDK示例中心查看或下載API調(diào)用的示例代碼。示例代碼中包含Java、Python、PHP、Node.js、Go、C++和.NET等版本SDK示例。
阿里云OpenAPI開發(fā)者門戶提供API在線調(diào)試工具。在API調(diào)試頁面,您可以快速檢索和體驗調(diào)用API。系統(tǒng)會根據(jù)您輸入的參數(shù)同步生成各語言SDK的代碼示例。各語言SDK代碼示例顯示在頁面右側(cè)SDK示例頁簽下供您參考。在調(diào)用結(jié)果頁簽下,可查看API調(diào)用的真實請求URL和JSON格式的返回結(jié)果。