接入指南
更新時間 2024-09-19 10:42:44
最近更新時間: 2024-09-19 10:42:44
分享文章
智能邊緣云的 API 使用指南
一、 前置步驟
如何獲取 AK/SK
- Access Key:簡寫為AK,對http請求進行簽名,簽名機制是為了訪問更加安全, access key為用戶獨有,并作為身份標識;
- Secret Key:簡寫為SK,用戶私有的,請勿給他人。
調用智能邊緣云 OpenAPI 需要 AK/SK 認證鑒權,下面為 AK/SK 獲取方法:
AK/SK 從 天翼云 IAM 申請,獲取地址://vip.ctcdn.cn/
登錄頁面中選擇【天翼云賬號】登錄,如下圖所示:
登錄后,在左側【個人中心】下,選擇【AccessKey管理】,點擊【新增】,工作區選擇【系統內置工作區】。
創建 AK 后,點擊查看,驗證后就可以獲取到 SK。
充值與集群自助權限申請
調用 OpenAPI 開通資源前,需要確保賬戶下有集群自助權限,確認地址://ecx.daliqc.cn/vm/vm/list ;
- 賬號充值:按需開通資源時,要求可用現金余額最少100元;
- 如果在租戶控制臺創建資源時沒有集群可選項(下圖 ①),請找售后或運營申請集群自助權限;
- 如果在租戶控制臺看到集群下沒有配額(下圖 ②),請找售后或運營申請資源配額。
調用地址
API 的調用地址://ecx-global.ctapi.daliqc.cn
二、簽名示例
認證頭部header部分
| 名稱 | 描述 | 是否必選 | 示例 |
|---|---|---|---|
| Content-Type | 消息體的類型 | 是 | application/json |
| ctyun-eop-request-id | 流水號 | 是 | 0ffb9b07-d5a8-4e19-b3ce-12dfb9705a1d |
| Eop-Authorization | 簽名認證信息 | 是 | 4a4bdc57e06542199b5f98d4cd107be2 Headers=ctyun-eop-request-id;eop-date Signature=b2WEo4nh9ewn6SWOP0ii5g8L0z9CT5gprpDWntlCX9I= |
| Eop-date | 時間,15分鐘有效期(實際傳時間為北京東八區UTC+8時間。TZ僅為格式,非UTC時間。) | 是 | 20221107T093029Z |
Python
Python SDK 下載地址://eop.daliqc.cn/ebp/static/sdk/py/ctapi_sdk_python.py
調用方法:將下面代碼復制到下載的 sdk 代碼最下面后執行
# 認證信息
ak = "your ak"
sk = "your sk"
endpoint = "//ecx-global.ctapi.daliqc.cn"
# 請求路徑
path1 = "/v3/cluster/describeRegionClusters"
path2 = "/v3/cluster/describeInstanceSpec"
path3 = "/v3/vpc/createVPC"
# 請求參數
params1 = {}
params2 = {"nodeCode": "hn-changde-1"}
params3 = {"nodeCode": "hn-changde-1"}
# 發起請求
response1 = get(f"{endpoint}{path1}", params1)
response2 = get(f"{endpoint}{path2}", params2)
response3 = post(f"{endpoint}{path2}", "", params3)
# 打印響應
print("Response for describeRegionClusters:")
print(json.loads(response1))
print("\nResponse for describeInstanceSpec:")
print(json.loads(response2))
Golang
Go SDK 下載地址://eop.daliqc.cn/ebp/static/sdk/go/ctapi_sdk_go.zip
調用方法:下面代碼包括了 sdk 代碼和調用示例
package main
import (
"bytes"
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"sort"
"strings"
"time"
"github.com/google/uuid"
)
const (
METHOD_GET = "GET"
METHOD_POST = "POST"
METHOD_HEAD = "HEAD"
METHOD_PATCH = "PATCH"
METHOD_PUT = "PUT"
METHOD_DELETE = "DELETE"
)
var (
ak = "ak"
sk = "sk"
endpoint = "//ecx-global.ctapi.daliqc.cn"
)
func hmacSHA256(secret, data string) []byte {
h := hmac.New(sha256.New, []byte(secret))
h.Write([]byte(data))
return h.Sum(nil)
}
func base64OfHmac(data []byte) string {
return base64.StdEncoding.EncodeToString(data)
}
func getRequestUUID() string {
return uuid.New().String()
}
func getSortedStr(data map[string]interface{}) string {
keys := make([]string, 0, len(data))
for k := range data {
keys = append(keys, k)
}
sort.Strings(keys)
var strList []string
for _, k := range keys {
strList = append(strList, fmt.Sprintf("%s=%v", k, data[k]))
}
return strings.Join(strList, "&")
}
func buildSign(ak, sk string, queryParams, bodyParams map[string]interface{}, eopDate, requestUUID, method string, file bool, contentType string) string {
var bodyStr string
if !file {
if bodyParams != nil {
bodyBytes, _ := json.Marshal(bodyParams)
bodyStr = string(bodyBytes)
}
}
var bodyDigest string
if method == METHOD_POST || method == METHOD_PUT {
if file {
bodyDigest = fmt.Sprintf("%x", sha256.Sum256([]byte(bodyStr)))
} else {
bodyBytes, _ := json.Marshal(bodyParams)
bodyDigest = fmt.Sprintf("%x", sha256.Sum256(bodyBytes))
}
} else {
bodyDigest = fmt.Sprintf("%x", sha256.Sum256([]byte(bodyStr)))
}
headerStr := fmt.Sprintf("ctyun-eop-request-id:%s\neop-date:%s\n", requestUUID, eopDate)
queryStr := getSortedStr(queryParams)
signatureStr := fmt.Sprintf("%s\n%s\n%s", headerStr, queryStr, bodyDigest)
printLog(fmt.Sprintf("signature_str is: %s", signatureStr))
kTime := hmacSHA256(sk, eopDate)
kAk := hmacSHA256(string(kTime), ak)
kDate := hmacSHA256(string(kAk), strings.Split(eopDate, "T")[0])
signatureBase64 := base64OfHmac(hmacSHA256(string(kDate), signatureStr))
signHeader := fmt.Sprintf("%s Headers=ctyun-eop-request-id;eop-date Signature=%s", ak, signatureBase64)
return signHeader
}
func getSignHeaders(ak, sk string, queryParams, body map[string]interface{}, method, contentType string, file bool, uuid string) map[string]string {
now := time.Now()
eopDate := now.Format("20060102T150405Z")
headers := map[string]string{
"Content-type": contentType,
"ctyun-eop-request-id": uuid,
"Eop-Authorization": buildSign(ak, sk, queryParams, body, eopDate, uuid, method, file, contentType),
"Eop-date": eopDate,
}
return headers
}
func execute(ak, sk, urlStr, method string, queryParams, bodyParams map[string]interface{}, headerParams map[string]string, contentType string, file bool) (string, error) {
queryStr := getSortedStr(queryParams)
requestUUID := getRequestUUID()
headers := getSignHeaders(ak, sk, queryParams, bodyParams, method, contentType, file, requestUUID)
for k, v := range headerParams {
headers[k] = v
}
if len(queryStr) > 0 {
urlStr = fmt.Sprintf("%s?%s", urlStr, queryStr)
}
var reqBody []byte
if bodyParams != nil {
reqBody, _ = json.Marshal(bodyParams)
}
fmt.Println("Request URL:", urlStr)
fmt.Println("Request Method:", method)
fmt.Println("Request Headers:", headers)
fmt.Println("Request Body:", string(reqBody))
req, err := http.NewRequest(method, urlStr, bytes.NewBuffer(reqBody))
if err != nil {
return "", err
}
for k, v := range headers {
req.Header.Set(k, v)
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println("Response Status:", resp.Status)
fmt.Println("Response Headers:", resp.Header)
fmt.Println("Response Body:", string(body))
return string(body), nil
}
/* ********************************* 調用示例 *********************************************** */
func printLog(logInfo string) {
now := time.Now()
logInfo = fmt.Sprintf("[%s]: %s", now.Format("2006-01-02 15:04:05"), logInfo)
fmt.Println(logInfo)
}
func main() {
path1 := "/v3/cluster/describeRegionClusters"
path2 := "/v3/cluster/describeInstanceSpec"
params1 := map[string]interface{}{}
params2 := map[string]interface{}{"nodeCode": "hn-changde-1"}
response1, err := execute(ak, sk, endpoint+path1, METHOD_GET, params1, nil, nil, "application/json;charset=UTF-8", false)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Response for describeRegionClusters:")
fmt.Println(response1)
response2, err := execute(ak, sk, endpoint+path2, METHOD_GET, params2, nil, nil, "application/json;charset=UTF-8", false)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("\nResponse for describeInstanceSpec:")
fmt.Println(response2)
}
三、OpenAPI 接口文檔
接口文檔地址: //eop.daliqc.cn/ebp/ctapiDocument/search?sid=69&data=55
接口在線調試,如下圖所示,填寫 AK/SK 后測試接口:
SDK 下載地址: