本文介紹了錯誤碼和調用接口的說明示例。
錯誤代碼表
客戶端錯誤ErrorCode錯誤代碼 | Message錯誤信息 | HTTP狀態碼 |
---|---|---|
OperationDenied | Your account does not open SCDN service yet. | 403 |
InsufficientBalance | Your account does not have enough balance. | 400 |
Forbidden.NotVerified | Your account is not verified yet. | 403 |
UnsupportedOperation | The specified action is not supported. | 400 |
NoSuchVersion | The specified version does not exist. | 400 |
UnsupportedParameter | The parameter <parameter name> is not supported. | 400 |
MissingParameter | The input parameter <parameter name> that is mandatory for processing this request is not supplied. | 400 |
InvalidParameter | The specified parameter <parameter name> is not valid.Or The specified image does not support the specified instance type. | 400 |
Throttling | Request was denied due to request throttling. | 400 |
InvalidAccessKeyId.NotFound | The Access Key ID provided does not exist in our records. | 404 |
Forbidden | User not authorized to operate on the specified resource. | 403 |
Forbidden.RiskControl | This operation is forbidden by Aliyun Risk Control system. | 403 |
Forbidden.AccessTooManyOthersResource | This operator is forbidden because too many other one’s resource to be accessed. | 403 |
SignatureDoesNotMatch | The signature we calculated does not match the one you provided. Please refer to the API reference about authentication for details. | 403 |
SignatureNonceUsed | The request signature nonce has been used. | 400 |
IdempotentParameterMismatch | Request uses a client token in a previous request but is not identical to that request. | 400 |
ChargeTypeViolation | Operations on this kind of resources are not permitted. | 403 |
InsufficientBalance | Your account does not have enough balance. | 400 |
QuotaExceeded | Living instances quota exceeded. | 400 |
OperationDenied | Specified operation is denied as your resource is locked for security reasons. | 403 |
RiskControl.Refused | Your action was.refused by RiskControl. | 400 |
QuotaExceeded.Snapshot | Snapshot quota exceeded. | 400 |
QuotaExceeded.Image | Image quota exceeded. | 400 |
錯誤代碼 | 錯誤信息 | HTTP狀態碼 |
---|---|---|
InternalError | The request processing has failed due to some unknown error, exception or failure. | 500 |
ServiceUnAvailable | The request has failed due to a temporary failure of the server. | 503 |
如何調用接口
對SCDN服務接口的調用是通過向SCDN服務端發送HTTP請求(可以通過HTTP或HTTPS通道發送),并獲取SCDN服務對該請求響應結果的過程。SCDN服務端在接收到用戶請求后,對請求做必要的身份驗證和參數驗證,在所有驗證成功后根據請求的指定參數提交或完成相應操作,并把處理的結果以HTTP響應地形式返回給調用者。
請求組成
- HTTP方法——目前SCDN服務的所有接口只支持
GET
方法的調用。 - 請求URL——請求的服務地址、要執行的操作名稱、操作參數和公共請求參數都包含在請求的URL中。
- 服務端地址:SCDN服務的域名是http://scdn.aliyuncs.com/和https://scdn.aliyuncs.com/。為了保證請求的安全性,強烈推薦您使用HTTPS通道。 (HTTPS加入了SSL層對通信進行了加密,可以防止通信被截獲而導致敏感信息泄露。)
- 操作名稱:每個接口都需要指定要執行的操作名稱,即Action參數。
- 操作參數:根據要執行的操作不同,需要傳入不同的操作參數,詳見每個接口的說明。
- 公共請求參數:包含時間戳、簽名信息等每個請求都要包含的參數。
為了使服務端能夠正確地驗證用戶的身份并授權請求執行,請求在提交前要進行簽名處理。簽名的規則參見簽名機制一節。
{
"RequestId": "4C467B38-3910-447D-87BC-AC049166F216",
/* 返回結果數據 */
}
返回結果:客戶端可以解析響應的消息體,得到執行結果。
調用示例
以DescribeScdnService接口為例:
對應的Action是DescribeScdnService。在添加了所有公共請求參數(除Signature)后,請求的URL是(為了便于閱讀,這里是進行URL編碼前的URL):
http://scdn.aliyuncs.com/?TimeStamp=2012-12-26T10:33:56Z&Format=XML&AccessKeyId=testid&Action= DescribeScdnService &SignatureMethod=HMAC-SHA1&SignatureNonce=NwDAxvLU6tFE0DVb&Version=2013-01-10&SignatureVersion=1.0
按照簽名計算規則,先構造出規范化請求字符串(Canonicalized Query String),如下:
http://scdn.aliyuncs.com/?TimeStamp=2012-12-26T10:33:56Z&Format=XML&AccessKeyId=testid&Action= DescribeScdnService &SignatureMethod=HMAC-SHA1&SignatureNonce=NwDAxvLU6tFE0DVb&Version=2013-01-10&SignatureVersion=1.0
再構造出用于簽名的字符串StringToSign值為:
GET&%2F&AccessKeyId%3Dtestid&Action% DescribeScdnService &Format%3DXML&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3DNwDAxvLU6tFE0DVb&SignatureVersion%3D1.0&TimeStamp%3D2012-12-26T10%253A33%253A56Z&Version%3D2013-01-10
以下Java示例代碼演示了如何添加公共請求參數、如何構造用請求參數構造規范化請求字符串,以及如何構造StringToSign字符串。示例假定所有請求參數放在一個Map <String, String>對象里,使用的Access Key ID是“testid”。
final String HTTP_METHOD = "GET";
……………………………………
其中需要注意的是,TimeStamp參數要求符合ISO8601規范,并注意使用UTC時間,否則會遇到錯誤。下面的示例代碼演示了如何生成符合規范的TimeStamp字符串:
private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private static String formatIso8601Date(Date date) {
SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
df.setTimeZone(new SimpleTimeZone(0, "GMT"));
return df.format(date);
}
生成規范化請求字符串(示例中的canonicalizedQueryString變量),以及stringToSign時,都需要進行必要的編碼。編碼的規則在簽名機制一節中有詳細描述。下面的示例代碼演示了如何用java.net.URLEncoder類完成編碼:
private static final String ENCODING = "UTF-8";
private static String percentEncode(String value)
throws UnsupportedEncodingException{
return value != null ?
URLEncoder.encode(value, ENCODING).replace("+", "%20")
.replace("*", "%2A").replace("%7E", "~")
: null;
}
假定使用的Access Key Id
是“testid”,Access Key Secret
是“testsecret”,用于計算HMAC的Key就是“testsecret&”,最終計算得到的簽名值為:
SDFQNvyH5rtkc9T5Fwo8DOjw5hc=
計算簽名的示例代碼(Java):
// 以下是一段計算簽名的示例代碼
final String ALGORITHM = "HmacSHA1";
final String ENCODING = "UTF-8";
key = "testsecret&";
Mac mac = Mac.getInstance(ALGORITHM);
mac.init(new SecretKeySpec(
key.getBytes(ENCODING), ALGORITHM));
byte[] signData = mac.doFinal(
stringToSign.getBytes(ENCODING));
String signature =
new String(Base64.encodeBase64(signData));
增加簽名參數后,請按照RFC3986規則進行URL編碼后得到的
http://scdn.aliyuncs.com/?TimeStamp=2012-12-26T10%3A33%3A56Z&Format=XML&AccessKeyId=testid&Action= DescribeScdnService &SignatureMethod=HMAC-SHA1&RegionId=region1&SignatureNonce=NwDAxvLU6tFE0DVb&Version=2012-09-13&SignatureVersion=1.0&Signature=SDFQNvyH5rtkc9T5Fwo8DOjw5hc%3d
接下來,通過HTTP請求的方式向上面的URL地址發送HTTP請求,并得到SCDN服務端的響應結果(示例):
none
通過解析這個XML結果即可以得到所有可用的地域ID和LocalName的列表。如果在提交請求時,指定Format參數為JSON,那么返回結果的格式為JSON格式。
如何保證冪等性
當通過調用創建實例接口在SCDN中創建云服務器時,如果遇到了請求超時或服務器內部錯誤時,客戶端可能會嘗試重發請求,這時客戶端可以通過提供可選參數ClientToken
避免服務器創建出比預期要多的實例,也就是通過提供ClientToken
參數保證請求的冪等性。ClientToken
是一個由客戶端生成的唯一的、大小寫敏感、不超過64個ASCII字符的字符串。
如果用戶使用同一個ClientToken
值調用創建實例接口,則服務端會返回相同的請求結果,包含相同的InstanceId。因此用戶在遇到錯誤進行重試的時候,可以通過提供相同的ClientToken值,來確保SCDN只創建一個實例,并得到這個實例的InstanceId。
如果用戶提供了一個已經使用過的ClientToken,但其他請求參數不同,則SCDN會返回IdempotentParameterMismatch的錯誤代碼。但需要注意的是,SignatureNonce、Timestamp和Signature參數在重試時是需要變化的,因為scdn使用SignatureNonce來防止重放攻擊,使用Timestamp來標記每次請求時間,所以再次請求必須提供不同的SignatureNonce和Timestamp參數值,這同時也會導致Signature值的變化。
通常客戶端只需要在500(InternetError)或503(ServiceUnAvailable)錯誤、或者無法得到響應結果的情況下進行重試操作。返回結果是200時,重試可以得到上次相同的結果,但不會對服務端狀態帶來任何影響。而對4xx的返回錯誤,除非提示信息里明確出現“try it later”,通常重試也是不能成功的。
欠費狀態下的API行為
下列表中“-”表示無關,“正常邏輯”表示按照接口的正常邏輯執行并返回結果。
賬戶欠費時
接口 | 行為 |
---|---|
OpenScdnService | 正常 |