VeryCloud对象存储服务 (VSS, VeryCloud Storage Service) 提供兼容S3的API访问接口,以方便用户使用对象存储。 为了访问VSS开放接口,VSS为每个用户分配访问的令牌和密码(ACCESS KEY和ACCESS SECRET),每个访问请求都需要携带ACCESS KEY 以及使用SECRET对请求数据的数字签名。用户可以在VSS管理界面的”私钥管理” 查询ACCESS KEY以及ACCESS SECRET。
VSS RESTful API与Amazon S3兼容,使用标准的 HTTP Authorization 标头来传递身份验证信息。其格式如下:
Authorization: AWS AccessKey:Signature
Signature 是请求中选定元素拼接的字符串StringToSign 基于用户的SECRET的 RFC 2104HMAC-SHA1值。
VSS RESTful API 签名生成方法如下:
Authorization = "AWS" + " " + ACCESS KEY + ":" + Signature;
Signature = base64_encode(hmacsha1(ACCESS SECRET, StringToSign));
StringToSign = HTTP-Verb + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedAmzHeaders +
CanonicalizedResource;
要构建 StringToSign 的 CanonicalizedAmzHeaders 部分,请选择所有以“x-amz-”开头的 HTTP 请求标头(使用不区分大小写的对比方式)并遵循以下步骤:
1. 将每个 HTTP 标头名称转换为小写。例如,“X-Amz-Date”改为“x-amz-date”。
2. 根据标头名称按字典顺序排列标头集。
3. 按照 RFC 2616 中第 4.2 节中的规定,将相同名称的标头字段合并为一个“header-name:comma-separated-value-list”对,各值之间不留空格。
例如可以将元数据标头“x-amz-meta-username: fred”和“x-amz-meta-username: barney”合并为单个标头“x-amz-meta-username: fred,barney”。
4. 通过将折叠空格(包括换行符)替换为单个空格,“展开”跨多个行的长标头(按照 RFC 2616 中第 4.2 节允许的方式)。
例如“x-amz-meta-username: barney”替换为“x-amz-meta-username: barney”。
5. 删除标头中冒号周围的空格。例如,标头“x-amz-meta-username: fred,barney”改为“x-amz-meta-username:fred,barney”。
6. 最后,请向生成的列表中的每个标准化标头附加换行字符 (U+000A)。通过将此列表中所有的标头规范化为单个字符串,构建 CanonicalizedResource 元素。
由HTTP请求路径和HTTP请求参数二部分构成。
HTTP请求路径
HTTP请求的路径部分。GIT S例如下面的请求:
GET /images/?acl HTTP/1.1
Host: vss.verycloud.cn
Date: Tue, 27 Mar 2016 19:36:42 +0000
Authorization: AWS AKIAIOSFODNN7EXAMPLE: bWq2s1WEIj+Ydj0vQ697zp+IXMU=
该请求中HTTP路径为“/images/”。
HTTP请求参数
必须包含的请求参数包括:?versioning、?acl、?logging、?versions、?uploads、?partNumber、?uploadId、?delete。 由参数名、参数值(如果有)和问号组成。如果有多个参数则按照参数名的字典顺序排序并使用“&”进行分隔(例如,?partNumber=值&uploadId=值)。 例如下面的请求:
GET /images/?acl HTTP/1.1
Host: vss.verycloud.cn
Date: Tue, 27 Mar 2016 19:36:42 +0000
Authorization: AWS AKIAIOSFODNN7EXAMPLE: bWq2s1WEIj+Ydj0vQ697zp+IXMU=
该请求的参数部分为“?acl”
有效的时间戳对于经身份验证的请求是必须的(使用 HTTP Date 标头或 x-amz-date 替代项)。此外,经身份验证的请求随附的客户端时间戳必须处于收到请求时的 VSS 系统时间的 15 分钟之内。否则,请求将失败并出现 RequestTimeTooSkewed 错误代码。施加这些限制的目的是为了防止对方重新使用已拦截的请求。 要更好地防范窃听,请对经身份验证的请求使用 HTTPS 传输。某些 HTTP 客户端库不提供为请求设置 Date 标头的功能。如果您在标准化标头中包含“Date”标头的值 时遇到困难,您可以改用“x-amz-date”标头为请求设置时间戳。x-amz-date 标头的值必须采用 RFC 2616 格式 (http://www.ietf.org/rfc/rfc2616.txt) 中的 任意格式。x-amz-date 标头位于请求中时,系统将在计算请求签名时忽略任何 Date 标头。因此,如果包含了 x-amz-date 标头,请在构建 StringToSign 时使用 Date 的空字符串。
请求
GET /images/test.png HTTP/1.1
Host: vss.verycloud.cn
Date: Tue, 27 Mar 2016 19:36:42 +0000
Authorization: AWS AKIAIOSFODNN7EXAMPLE: bWq2s1WEIj+Ydj0vQ697zp+IXMU=
StringToSign
GET\n
\n
\n
Tue, 27 Mar 2016 19:36:42 +0000\n
/images/test.png
默认情况下,VeryCloud的Bucket和Object是私有的,预签名授权访问通过在URL中加入签名信息,实现第三方用户的授权访问。预签名 URL 仅在指定的持续时间内有效。
预签名 URL 中至少包含Signature,Expires,AWSAccessKeyId三个参数。 其请求示例如下:
http://vss.verycloud.cn/images/test.png?AWSAccessKeyId=a245d11009644262b9b3a74e1d4e8500&Expires=1435222561&Signature=v5zekrYCTyhaSkLQNz2JGhaP4S8%3D
各参数的定义如下:
名称 | 示例值 | 描述 |
---|---|---|
AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE | 用户的ACCESS KEY。 |
Expires | 1435222561 | 将签名过期时间指定为自 Epoch(1970 年 1 月 1 日 00:00:00 UTC)以来的秒数。将拒绝在此时间(根据服务器)之后收到的请求。 |
Signature | vjbyPxybdZaNmGa%2ByT272YEAiv4%3D | 采用 StringToSign 的 HMAC-SHA1 Base64 编码的 URL 编码。 |
其签名与前面普通的签名稍有差异,不同之处仅在于 StringToSign 元素的格式。其中Signature签名生成方法如下:
Signature = base64_encode( hmacsha1( ACCESS SECRET, StringToSign ) );
StringToSign = HTTP-Verb + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Expires + "\n" +
CanonicalizedAmzHeaders +
CanonicalizedResource;
请注意,在 StringToSign 中,HTTP Date 位置元素已替换为 Expires。CanonicalizedAmzHeaders 和 CanonicalizedResource 是相同的。
请求
GET /images/test.png?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=NpgCjnDzrM%2BWFzoENXmpNDUsSn8%3D&Expires=1175139620 HTTP/1.1
Host: vss.verycloud.cn
StringToSign
GET\n
\n
\n
1461224331\n
/images/test.png
VeryCloud的RESTful接口中使用了一些公共请求头。这些请求头可以被所有的VeryCloud请求所使用,其详细定义如下:
名称 | 描述 |
---|---|
Authorization | 用于验证请求合法性的认证信息。 使用场景:非匿名请求。 |
Content-Length | RFC2616中定义的HTTP请求内容长度。 在使用PUT 请求时需要。 |
Content-Type | RFC2616中定义的HTTP请求内容类型。 例如: text/plain。 |
Content-MD5 | 根据协议RFC 1864对消息内容(不包括头部)计算MD5值获得128比特位数字, 对该数字进行base64编码为一个消息的Content-MD5值。该请求头可用于消息 合法性的检查(消息内容是否与发送时一致)。 |
Date | HTTP 1.1协议中规定的GMT时间,例如:Wed, 05 Sep. 2012 23:00:00 GMT, 在携带Authorization头部时,需要设定x-amz-date 或者Date头部。 |
Expect | 100-Continue握手的目的,是为了允许客户端在发送请求内容之前,判断 源服务器是否愿意接受 请求(基于请求头部)在发送body的时候才能使用该头部。 有效值:100-continue。 |
Host | 访问Host值,这里固定为vss.verycloud.cn。 |
x-amz-date | 发送请求的当前时间,在携带Authorization头部时,需要设定x-amz-date 或者Date头部, 如果二个都设置了,则选择x-amz-date。 |
VeryCloud的RESTful接口中使用了一些公共响应头。这些响应头可以被所有的VeryCloud请求所使用,其详细定义如下:
名称 | 描述 |
|
|
|
|
|
|
|
|
|
|
|
|
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
delimiter | string | delimiter 是一个用于对bucket内具有共同前缀的objects进行聚合的分隔符。(“/”为常用的delimiter,用于表示伪目录) | |
marker | string | 设定返回的objects中的起始object。sever端会对objects进行字典序排列。 | |
max-keys | string | 设定此次请求的最大objects数量。如果用户设定了max-keys且符合条件的objects数量大于该值,则server端将只返回max-keys个objects,同时包含true。 | |
prefix | string | 设定bucket中objects的前缀名,只有包含该前缀的objects才会返回。 |
名称 | 类型 | 说明 |
---|---|---|
Contents | XML metadata | Metadata about each object returned。 |
CommonPrefixes | String | 当request中包含delimiter时,response中会包含CommonPrefixes。CommonPrefixes为objects name(以第一个delimiter结尾的)共同前缀集合。 |
Delimiter | String | delimiter 是一个用于对bucket内具有共同前缀的objects进行聚合的分隔符。 |
DisplayName | String | object对应的所有者信息。 |
ETag | String | Object 内容的MD5 hash值。 |
ID | String | object对应的所有者ID。 |
IsTruncated | Boolean | 指明是否所有的结果都返回。true表示还有结果未返回,false表示所有结果都已返回。当results的数量超过MaxKeys设定值时,IsTruncated会设置为true。 |
Key | String | object名称。 |
LastModified | Date | object最后修改时间。 |
Marker | String | 返回的objects中的起始object。当request中设定Marker时,response会带该字段。 |
MaxKeys | String | 此次返回objects的最大数量。 |
Name | String | bucket名称。 |
NextMarker | String | 当response 的IsTruncated为true时,下一次(ListBucket)可以以此为marker,将未返回的结果返回。 |
Owner | String | Bucket owner。 |
Prefix | String | bucket中objects的共同前缀名。 |
Size | String | object的大小。 |
StorageClass | String | STANDARD。 |
curl -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/mybucket/object_key"
ning 1000 false object_key 2016-4-08T06:13:14.000Z M2V8Y17A2SZ2CZRORVJX-2 456 STANDARD user1 testuser
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
x-amz-acl | string | ACL权限类型。 取值: "private", "public-read", "public-read-write", "authenticated-read" private:自己拥有全部权限,其他人没有任何权限 public-read:自己拥有全部权限,其他人拥有读权限 public-read-write:自己拥有全部权限,其他人拥有读写权限 authenticated-read:自己拥有全部权限,被授权的用户拥有读权限 |
curl -X PUT -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/mybucket"
HTTP/1.1 200 OK Date: Fri, 31 Aug 2015 01:10:00 GMT Server: nginx Content-Type: application/xml Connection
curl -X DELETE -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/mybucket"
HTTP/1.1 204 No Content Date: Fri, 31 Aug 2015 01:10:00 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 0
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
x-amz-acl | string | ACL权限类型。 取值: "private", "public-read", "public-read-write", "authenticated-read" private:自己拥有全部权限,其他人没有任何权限 public-read:自己拥有全部权限,其他人拥有读权限 public-read-write:自己拥有全部权限,其他人拥有读写权限 authenticated-read:自己拥有全部权限,被授权的用户拥有读权限 |
curl -X PUT -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/mybucket?acl"
HTTP/1.1 200 OK Date: Fri, 31 Aug 2015 01:10:00 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 0
名称 | 类型 | 说明 |
---|---|---|
AccessControlList | Container | 存储ACL信息的容器。 父节点: AccessControlPolicy |
AccessControlPolicy | Container | 保存Get Bucket ACL结果的容器。 父节点: None |
DisplayName | String | Bucket拥有者的名称。(目前和ID一致)。 父节点: AccessControlPolicy.Owner |
Grant | Container | Grantee and Permission的容器。 父节点: AccessControlPolicy.AccessControlList |
Grantee | Container | 包含具有权限的user的DisplayName和ID信息的容器。 父节点: AccessControlPolicy.AccessControlList.Grant |
ID | String | bucket所有者ID。 父节点: AccessControlPolicy.Owner |
Owner | Container | 包含bucket所有者DisplayName和ID信息的容器。 父节点: AccessControlPolicy |
Permission | String | 赋予user的Bucket的ACL权限。 父节点: AccessControlPolicy.AccessControlList.Grant |
curl -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/mybucket?acl"
HTTP/1.1 200 OK Date: Fri, 31 Aug 2015 01:10:00 GMT Last-Modified: Fri, 31 Aug 2015 01:05:00 GMT Content-Length: 124 Content-Type: text/plain Connection: close user1 testuser user1 testuser FULL_CONTROL
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
Range | string | 指定文件传输的范围。如,设定 bytes=0-99,表示传送第0到第99这100个字符。 | |
If-Modified-Since | string | 如果指定的时间早于实际修改时间,则正常传送文件,并返回200 OK;否则返回304 not modified。 | |
If-Unmodified-Since | string | 如果传入参数中的时间等于或者晚于文件实际修改时间,则正常传输文件,并返回200 OK;否则返回412 precondition failed错误。 | |
If-Match | string | 如果传入期望的ETag和object的 ETag匹配,则正常传输文件,并返回200 OK;否则返回412 precondition failed错误。 | |
If-None-Match | string | 如果传入的ETag值和Object的ETag不匹配,则正常传输文件,并返回200 OK;否则返回304 Not Modified。 |
名称 | 类型 | 说明 | |
---|---|---|---|
x-amz-meta-* | string | 用户自定义变量,其中一个用处是:用户客户端加密时,秘钥对相关信息基于该字段返回。 |
curl -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/ "
HTTP/1.1 200 OK Date: Fri, 31 Aug 2015 01:10:00 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 0
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
Cache-Control | string | 指定该Object被下载时的网页的缓存行为;更详细描述请参照RFC2616。 | |
Content-Disposition | string | 指定该Object被下载时的名称;更详细描述请参照RFC2616。 | |
Content-Encoding | string | 指定该Object被下载时的内容编码格式;更详细描述请参照RFC2616。 | |
Content-MD5 | string | 根据协议RFC 1864对消息内容(不包括头部)计算MD5值获得128比特位数字,对该数字进行base64编码为一个消息的Content-MD5值。该请求头可用于消息合法性的检查(消息内容是否与发送时一致)。 | |
x-amz-acl | string | canned ACL权限类型。 | |
Expires | string | 过期时间(milliseconds);更详细描述请参照RFC2616。 | |
x-amz-meta- | string | 用户自定义变量,其中一个用处是:用户客户端加密时,设置秘钥对相关信息。 |
curl -X PUT -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/ "
HTTP/1.1 200 OK Date: Fri, 31 Aug 2015 01:10:00 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 0
curl -X DELETE -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/ "
HTTP/1.1 204 NoContent Date: Fri, 31 Aug 2015 01:10:00 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 0
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
Cache-Control | string | 指定该Object被下载时的网页的缓存行为;更详细描述请参照RFC2616。 | |
Content-Disposition | string | 指定该Object被下载时的名称;更详细描述请参照RFC2616。 | |
Content-Encoding | string | 指定该Object被下载时的内容编码格式;更详细描述请参照RFC2616。 | |
Content-MD5 | string | 根据协议RFC 1864对消息内容(不包括头部)计算MD5值获得128比特位数字,对该数字进行base64编码为一个消息的Content-MD5值。该请求头可用于消息合法性的检查(消息内容是否与发送时一致)。 | |
x-amz-acl | string | canned ACL权限类型。 | |
Expires | string | 过期时间(milliseconds);更详细描述请参照RFC2616。 | |
x-amz-meta- | string | 用户自定义变量,其中一个用处是:用户客户端加密时,设置秘钥对相关信息。 |
名称 | 类型 | 说明 |
---|---|---|
InitiateMultipartUploadResult | Container | 保存Initiate Multipart Upload请求结果的容器。 |
Bucket | String | 初始化Multipart Upload事件所在的Bucket名称。 |
Key | String | 初始化一个Multipart Upload事件的Object名称。 |
UploadId | String | 唯一标示此次Multipart Upload事件的ID。 |
curl -X POST -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/ ?uploads"
HTTP/1.1 200 OK Date: Mon, 1 Nov 2016 20:34:56 GMT Content-Length: 197 Connection: keep-alive example-bucket example-object V2Wpbmcn3ZpaWWpbmcn3ZpZwbG9hWpbmcn3ZpZA
名称 | 类型 | 说明 |
---|---|---|
CompleteMultipartUploadResult | Container | 保存Complete Multipart Upload请求结果的容器。 |
Location | String | 新创建Object的URL。 |
Key | String | 新创建Object的名字。 |
ETag | String | ETag (entity tag) 在每个Object生成的时候被创建,用于标示一个Object的内容。Complete Multipart Upload请求创建的Object,ETag值是其内容的UUID。ETag值可以用于检查Object内容是否发生变化。 |
curl -X POST -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/ ?upload_id=123456789"
HTTP/1.1 200 OK Content-Length: 360 Content-Type: application/xml Date: Wed, 03 Jun 2016 07:43:26 GMT Connection: keep-alive mybucket/test-object mybucket test-object 123456789
curl -X PUT -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/ ?upload_id= &part_number= "
HTTP/1.1 200 OK Content-Length: 360 Content-Type: application/xml Date: Wed, 03 Jun 2016 07:43:26 GMT Connection: keep-alive
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
uploadId | String | Multipart Upload事件的ID。 | |
max-parts | Container | 规定在vss响应的最大Part数目。 |
名称 | 类型 | 说明 |
---|---|---|
ListPartsResult | Container | 保存List Part请求结果的容器。 |
Bucket | String | Bucket名称。 |
Key | String | Object名称。 |
UploadId | String | Upload ID。 |
Initiator | Container | 发起分片上传的account信息容器。 |
ID | String | 发起分片上传的account ID 信息。 |
DisplayName | String | 发起分片上传的account name 信息与ID相同。 |
Owner | Container | 与Initiator含义相同,内容也相同。 |
StorageClass | String | 存储object的类型,固定值 STANDARD。 |
PartNumberMarker | String | 本次List结果的Part Number起始位置。 |
NextPartNumberMarker | String | 如果本次没有返回全部结果,响应请求中将包含NextPartNumberMarker元素,用于标明接下来请求的PartNumberMarker值。。 |
MaxParts | String | 返回请求中最大的Part数目。 |
IsTruncated | Boolean | 标明是否本次返回的List Part结果列表被截断。“true”表示本次没有返回全部结果;“false”表示本次已经返回了全部结果。 |
Part | String | 保存Part信息的容器。 |
PartNumber | Int | 标示Part的数字。 |
LastModified | Date | Part上传的时间。 |
ETag | String | 已上传Part内容的ETag。 |
Size | String | 已上传Part大小。 |
curl -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/ ?upload_id= "
HTTP/1.1 200 OK X-Trans-Id: tx20af64a5df6e5d09bfafc-00556e668c Date: Wed, 28 Oct 2016 22:32:00 GMT ETag: fba9dede5f27731c9771645a39863338 Content-Length: 985 Content-Type: text/plain Connection: keep-alive mybucket test-object mybucket/test-object testuser testuser testuser testuser STANDARD false 1000 1 1 78c347078c10335b32ec5b417b2c52e4 2016-04-03T07:01:53.148980+00:00 10485760 2 e9eb772c226db5629a5b927ef6d3c3c6 2016-04-03T07:01:56.315310+00:00 10485760 3 2ed3f71937bdec5d528dd8eeb68b447b 2016-04-03T07:01:59.684700+00:00 2668250
curl -X DELETE -v
-H "Host: vss.verycloud.cn"
-H "Date: Fri, 31 Aug 2015 01:10:00 GMT"
-H "Authorization: AWS XNB5GEMGT47UBS7Z6JCF:oHgKhmAOb5kSZsqAdptwGGQH5c0zWrHalCi0cobt="
"https://vss.verycloud.cn/ ?upload_id= "
HTTP/1.1 204 NoContent Content-Length: 360 Content-Type: application/xml Date: Wed, 03 Jun 2016 07:43:26 GMT Connection: keep-alive