構造請求
本節介紹REST API請求的組成,以調用彈性伸縮產品的"根據regionID查詢用戶資源"舉例說明如何調用該API。
請求示例
POST //scaling-xxxx.ctapi.daliqc.cn/v4/region/customerResources?prodInstId=11&startTime=2021-04-04T06:01:46ZHTTP/1.1
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:20221107T093029Z
請求URI
{URI-scheme}://{Endpoint}/{resource-path}?{query-string}
| 參數 | 描述 |
|---|---|
| URI-scheme | 表示用于傳輸請求的協議,當前所有API均采用HTTPS協議 |
| Endpoint | 指定承載REST服務端點的服務器域名或IP,不同服務不同區域的Endpoint不同,您可以從地區和終端節點獲取。例如彈性伸縮產品服務在某個區域的Endpoint為“scaling-xxxx.ctapi.daliqc.cn” |
| resource-path | 資源路徑,即API訪問路徑。從具體API的URI模塊獲取,例如"根據regionID查詢用戶資源"API的resource-path為“/v4/region/customerResources” |
| query-string | 查詢參數,是可選部分,并不是每個API都有查詢參數。查詢參數前面需要帶一個“?”,形式為“參數名=參數取值”,例如“?limit=10”,表示查詢不超過10條數據 |
示例:
彈性伸縮-根據regionID查詢用戶資源,則需使用彈性伸縮產品在對應區域的Endpoint(scaling-xxx.ctapi.daliqc.cn),并在"根據regionID查詢用戶資源"的URI部分找到resource-path(/v4/region/customerResources),拼接起來如下所示。
//scaling-xxx.ctapi.daliqc.cn/v4/region/customerResources
說明: 為方便查看,在每個具體API的URI部分,只給出resource-path部分,并將請求方法寫在一起。這是因為URI-scheme都是HTTPS,而Endpoint在同一個區域也相同,所以簡潔起見將這兩部分省略。
{resource-path}資源路徑,使用編碼的規范URI示例:
前:
/v4/region/customerResources api/code
后:
/v4/region/customerResources%20api/code
說明:
資源路徑{resource-path}是從HTTP Host結束到查詢字符串參數(如果有)的問號字符(“?”)中間的部分。 需要根據RFC 3986標準化URI路徑規范移除冗余和相對路徑部分。路徑中每個部分都必須進行URI編碼。
{query-string}查詢參數,使用規范查詢字符串示例:
前:
prodInstId=11&startTime=2021-04-04T06:01:46Z
后:
prodInstId=11&startTime=2021-04-04T06%3A01%3A46Z
說明:
{query-string}為鍵值對,使用等號字符(=)拼接。值需進行URI編碼,同樣需要滿足RFC 3986關于URL編碼規范的定義要求。鍵則不需要。對沒有值的參數使用空字符串。
在每個參數值后追加與字符(&),列表中最后一個值除外。
使用 %XY 對所有其他字符進行百分比編碼,其中“X”和“Y”為十六進制字符(0-9和大寫字母A-F)。例如,空格字符必須編碼為 %20(不像某些編碼方案那樣使用“+”),擴展UTF-8字符必須采用格式 %XY%ZA%BC。
RFC 3986規范的具體要求:
字符A-Z、a-z、0-9 以及字符-、_、.、不編碼。
對其它ASCII碼字符進行編碼。編碼格式為%加上16進制的ASCII碼。例如半角雙引號(")將被編碼為%22。空格編碼成%20,而不是加號(+)。
非ASCII碼通過UTF-8編碼。
請求方法
| 方法 | 說明 |
|---|---|
| GET | 請求服務器返回指定資源 |
| PUT | 請求服務器更新指定資源 |
| POST | 請求服務器新增資源或執行特殊操作 |
| DELETE | 請求服務器刪除指定資源,如刪除對象等 |
| HEAD | 請求服務器資源頭部 |
| PATCH | 請求服務器更新資源的部分內容 |
當資源不存在的時候,PATCH可能會去創建一個新的資源。
在"根據regionID查詢用戶資源"的URI部分,您可以看到其請求方法為“POST”,則其請求為:
POST //scaling-xxx.ctapi.daliqc.cn/v4/region/customerResources
請求消息頭
| 名稱 | 描述 | 是否必選 | 示例 |
|---|---|---|---|
| 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 |
Eop-Authorization簽名認證信息:
步驟一:構造代簽字符串sigture
sigture=需要進行簽名的Header排序后的組合列表+"\n"+encode的query+"\n"+toHex(sha256(原封的body))
| 名稱 | 描述 |
|---|---|
| 需要進行簽名的Header排序后的組合列表 | 將ctyun-eop-request-id、eop-date以 “header_name:header_value”的形式、以“\n”作為每個header的結尾符、以英文字母表作為header_name的排序依據將它們拼接起來。注意:EOP強制要求ctyun-eop-request-id、eop-date必須進行簽名。其他字段是否需要簽名看自身需求。例子(假設你需要將ctyun-eop-request-id、eop-date、host都要簽名):ctyun-eop-request-id:123456789\neop-date:20210531T100101Z\n |
| encode的query | uery以&作為拼接,key和value以=連接,值需要encode,Query參數全部都需要進行簽名 |
| toHex(sha256(原封的body)) | 傳進來的body參數進行sha256摘要,對摘要出來的結果轉十六進制 |
sigture示例1(假設query為空、需要進行簽名的Header排序后的組合列表為“ctyun-eop-request-id:27cfe4dc-e640-45f6-92ca-492ca73e8680\neop-date:20220525T160752Z\n”、body參數做sha256摘要后轉十六進制為e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855): ctyun-eop-request-id:27cfe4dc-e640-45f6-92ca-492ca73e8680\neop-date:20220525T160752Z\n\n\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
sigture示例2(假設query不為空、需要進行簽名的Header排序后的組合列表為“ctyun-eop-request-id:27cfe4dc-e640-45f6-92ca-492ca73e8680\neop-date:20220525T160752Z\n”、body參數做sha256摘要后轉十六進制為e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855): ctyun-eop-request-id:27cfe4dc-e640-45f6-92ca-492ca73e8680\neop-date:20220525T160930Z\n\naa=1&bb=2\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
步驟二:構造動態秘鑰kdate
1.使用eop-date作為數據,sk作為密鑰,算出ktime。
2.使用ak作為數據,ktime作為密鑰,算出kAk。
3.使用eop-date的年月日值作為數據,kAk作為密鑰,算出kdate。
| 名稱 | 描述 |
|---|---|
| eop-date | yyyyMMdd'T'HHmmss'Z'(20211221T163614Z)(年月日T時分秒Z)(實際傳時間為北京東八區UTC+8時間,TZ僅為格式,非UTC時間) |
| ktime | 使用eop-date作為數據,sk作為密鑰,算出ktime。ktime=hmacSHA256(eop-date,sk) |
| kAk | 使用ak作為數據,ktime作為密鑰,算出kAk。kAk=hmacSHA256(ak,ktime) |
| kdate | 使用eop-date的年月日值作為數據,kAk作為密鑰,算出kdate |
步驟三:構造signature
使用kdate作為密鑰、sigture作為數據,將其得到的結果進行base64編碼得出signature
| 名稱 | 描述 |
|---|---|
| Signature | hmacSHA256(sigture,kdate)將上一步的結果進行base64加密得出signature |
步驟四:構造Eop-Authorization
1.構造Headers。
2.得到Eop-Authorization。
Eop-Authorization:ak Headers=xxx Signature=xxx。
| 名稱 | 描述 |
|---|---|
| Headers | 將需要進行簽名的請求頭字段以 “header_name”的形式、以“;”作為間隔符、以英文字母表作為header_name的排序依據將它們拼接起來。例子(假設你需要將ctyun-eop-request-id、eop-date都要簽名):Headers=ctyun-eop-request-id;eop-date |
| Eop-Authorization | Eop-Authorization:ak Headers=xxx Signature=xxx。注意,ak、Headers、Signature之間以空格隔開。例如:Eop-Authorization:ak Headers=ctyun-eop-request-id;eop-date Signature=NlMHOhk5bVfZ9MwDSSJydcZjjENmDtpNYigJGVb。注意:如果你需要進行簽名的Header不止默認的ctyun-eop-request-id和eop-date,那么你需要在http_client的請求頭部中加上,并且Eop-Authorization中也需要增加 |
溫馨提示:
API可進入頁面,進行在線調試。