請求協(xié)議說明
本文介紹使用輕量消息隊列(原 MNS)發(fā)送HTTP請求調(diào)用API時的請求結(jié)構(gòu)、公共參數(shù)、返回結(jié)果及簽名認(rèn)證方式。
請求結(jié)構(gòu)
服務(wù)地址
輕量消息隊列(原 MNS)支持多個地域,每個地域分別提供了公網(wǎng)訪問地址、內(nèi)網(wǎng)訪問地址。更多信息,請參見功能開服和接入點。
請求方法
輕量消息隊列(原 MNS)支持通過HTTP協(xié)議進(jìn)行請求通信。使用HTTP的PUT、POST、GET、DELETE等HTTP Method發(fā)送不同的請求。
發(fā)送的請求需要帶上正確的請求參數(shù)、請求頭和請求正文,請求及返回結(jié)果都使用UTF-8字符集進(jìn)行編碼。
公共參數(shù)
公共請求參數(shù)(Header)
參數(shù) | 是否必選 | 說明 |
Authorization | 是 | 驗證字符串。更多信息,請參見請求簽名機(jī)制。 |
Content-Length | 是 | HTTP消息體的長度。 |
Content-Type | 是 | 請求內(nèi)容的MIME類型,目前請求僅支持text或xml格式。 |
Content-MD5 | 否 | HTTP消息體的MD5值。更多信息,請參見The Content-MD5 Header Field。 |
Date | 是 | 請求的構(gòu)造時間。目前只支持GMT格式,如果和SMQ的服務(wù)器時間前后差異超過15分鐘將返回本次請求非法。 |
Host | 針對HTTP/1.1為必選,針對HTTP/1.0為可選。 | 從阿里云官網(wǎng)獲取AccountId,從API文檔中獲取各地域SMQ訪問地址,格式如下: |
x-mns-version | 是 | 調(diào)用SMQ接口的版本號。當(dāng)前版本為2015-06-06。 |
x-mns-date | 否 | Date替代字段。用于解決部分瀏覽器上用戶程序無法設(shè)置HTTP請求Date字段的場景。 |
公共返回參數(shù)
參數(shù) | 說明 |
Content-Length | HTTP消息體返回的長度。 |
Connection | HTTP連接狀態(tài)。 |
Date | 響應(yīng)的返回時間,目前只支持GMT格式。 |
Server | 請求響應(yīng)的SMQ服務(wù)器名。 |
x-mns-request-id | 此次Request操作的編號。 |
x-mns-version | SMQ接口的版本編號,當(dāng)前版本是2015-06-06。 |
返回結(jié)果
調(diào)用API服務(wù)后返回數(shù)據(jù)采用統(tǒng)一格式。返回的HTTP狀態(tài)碼為2xx,說明調(diào)用成功;返回的HTTP狀態(tài)碼為4xx或5xx,說明調(diào)用失敗。調(diào)用成功返回的數(shù)據(jù)格式為XML格式。
XML返回結(jié)果包括請求是否成功信息和具體的業(yè)務(wù)數(shù)據(jù)。示例如下:
<?xml version="1.0" encoding="utf-8"?>
<!--結(jié)果的根結(jié)點-->
<根節(jié)點 xmlns="http://mns.aliyuncs.com/doc/v1/">
<!--返回的子節(jié)點-->
</根節(jié)點>
調(diào)用接口出錯后,將不會返回結(jié)果數(shù)據(jù),HTTP請求返回一個4xx或5xx的HTTP狀態(tài)碼。返回的消息體中是具體的錯誤代碼及錯誤信息。另外還包含一個全局唯一的請求ID:RequestId和一個您本次請求訪問的站點ID:HostId。
具體的錯誤信息。請參見錯誤碼。
請求簽名機(jī)制
簽名機(jī)制介紹
輕量消息隊列(原 MNS)服務(wù)會對每個訪問的請求進(jìn)行驗證,每個請求向輕量消息隊列(原 MNS)提交時,都需要在該請求的Header中包含簽名。輕量消息隊列(原 MNS) SDK已實現(xiàn)自動完成簽名,建議您采用SDK的方式發(fā)起請求,即可免去手動簽名的過程。
簽名過程可分為如下步驟:
步驟一:構(gòu)造待簽名字符串(StringToSign)
按照以下偽代碼構(gòu)造待簽名的字符串(StringToSign)
StringToSign = HttpMethod + "\n"
+ CONTENT-MD5 + "\n"
+ CONTENT-TYPE + "\n"
+ DATE + "\n"
+ CanonicalizedMNSHeaders
+ CanonicalizedResource;
參數(shù) | 描述 |
HttpMethod | 大寫的HTTP方法。例如:PUT、GET、POST、DELETE。 |
Content-Md5 | 請求內(nèi)容數(shù)據(jù)的MD5值,若無則為空。 |
CONTENT-TYPE | 請求內(nèi)容的類型,若無則為空。 |
DATE | 本次操作的時間。
|
CanonicalizedMNSHeaders | HTTP中的
|
CanonicalizedResource | HTTP所請求資源的URI,是指對應(yīng)訂閱配置的HTTP接收端地址去除域名端口的部分。例如配置的接收端地址是 |
步驟二:計算簽名值(Signature)
Signature = Base64( HMAC-SHA1( ${AccessSecret}, UTF-8-Encoding-Of(${StringToSign})) )
其中,各參數(shù)的含義如下:
參數(shù) | 說明 |
Base64 | Base64編碼。 |
HMAC-SHA1 | 簽名的方法采用RFC 2104中定義的 |
AccessSecret | 阿里云用戶AccessKey Secret,和簽名的AccessKey ID對應(yīng)。 |
UTF-8-Encoding-Of | 指UTF-8 格式。 |
StringToSign | 自定義構(gòu)建的待簽名字符串,即步驟一:構(gòu)造待簽名字符串(StringToSign)生成的值。 |
步驟三:將簽名添加到請求中
addHeader("Authorization","MNS " + ${AccessKeyId}+ ":" + ${Signature})
Key為常量的字符串Authorization
,Value為基于AccessKeyId和Sigature兩個變量拼接成的字符串,整體格式為MNS ${accessKeyId}:${Signature}
。其中Sigature
為輕量消息隊列(原 MNS)自定義構(gòu)建的簽名,即步驟二:計算簽名值(Signature)生成的值。
簽名示例
請求示例如下:
PUT /queues/$queueName?metaOverride=true HTTP/1.1
Host: $AccountId.mns.cn-hangzhou.aliyuncs.com
Date: Wed, 08 Mar 2012 12:00:00 GMT
Authorization: MNS 15B4D3461F177624****:xQE0diMbL****f3YB+FIEXAMPLE=
<?xml version="1.0" encoding="UTF-8" ?>
<Queue xmlns="http://mns.aliyuncs.com/doc/v1/">
<VisibilityTimeout >60</VisibilityTimeout>
<MaximumMessageSize>1024</MaximumMessageSize>
<MessageRetentionPeriod>120</MessageRetentionPeriod>
<DelaySeconds>30</DelaySeconds>
</Queue>
返回示例如下:
示例一
如果傳入的AccessKeyId不存在或disabled,返回403 Forbidden。
Content-Type: text/xml
Content-Length: 314
Date: Wed, 18Mar 2012 08:04:06 GMT
x-mns-request-id: 512B2A634403E52B1956****
<?xml version="1.0" encoding="utf-8"?>
<Error xmlns="http://mns.aliyuncs.com/doc/v1/">
<Code>AccessIDAuthError</Code>
<Message>
AccessID authentication fail, please check your AccessID and retry.
</Message>
<RequestId>512B2A634403E52B1956****</RequestId>
<HostId>mns.cn-hangzhou.aliyuncs.com</HostId>
</Error>
示例二
如果簽名驗證的時候,Header中沒有傳入Date或者格式不正確,返回403 Forbidden。
Content-Type: text/xml
Content-Length: 274
Date: Wed, 18Mar 2012 08:04:06 GMT
x-mns-request-id: 512B2A634403E52B1956****
<?xml version="1.0" encoding="UTF-8"?>
<Error xmlns="http://mns.aliyuncs.com/doc/v1/">
<Code>InvalidArgument</Code>
<Message>Date Header is invalid or missing.</Message>
<RequestId>7E1A5CF258F535884403****</RequestId>
<HostId>mns.cn-hangzhou.aliyuncs.com</HostId>
</Error>
示例三
傳入請求的時間在輕量消息隊列(原 MNS)服務(wù)器當(dāng)前時間之后的15分鐘以內(nèi),否則返回408超時。
Content-Type: text/xml
Content-Length: 283
Date: Wed, 11 May 2011 09:01:51 GMT
x-mns-request-id: 512B2A634403E52B1956****
<?xml version="1.0" encoding="UTF-8"?>
<Error xmlns="http://mns.aliyuncs.com/doc/v1/">
<Code>TimeExpired</Code>
<Message>
The http request you sent is expired.
</Message>
<RequestId>512B2A634403E52B1956****</RequestId>
<HostId>mns.cn-hangzhou.aliyuncs.com</HostId>
</Error>