简介

百度对象存储BOS(Baidu Object Storage),是百度云对外提供的稳定、安全、高效以及高扩展存储服务,支持文本、多媒体、二进制等任何类型的数据存储。数据多地域跨集群的存储,以实现资源统一利用,降低使用难度,提高工作效率。用户可以通过本文档提供的简单的RESTful API接口,进行资源管理以及数据上传下载等操作。

规范化字符串(UrlEncode)

通常一个字符串中可以包含任何Unicode字符。在编程中这种灵活性会带来不少困扰。因此引入“规范字符串”的概念。一个规范字符串只包含百分号编码字符以及URI(Uniform Resource Identifier)非保留字符(Unreserved Characters)。
RFC 3986规定URI非保留字符包括以下字符:字母(A-Z,a-z)、数字(0-9)、连字号(-)、点号(.)、下划线(_)、波浪线(~)。
将任意一个字符串转换为规范字符串的方式是:

  • 将字符串转换成UTF-8编码的字节流。
  • 保留所有URI非保留字符原样不变。
  • 对其余字节做一次RFC 3986中规定的百分号编码(Percent-Encoding),即一个%后面跟着两个表示该字节值的十六进制字母。字母一律采用大写形式。示例:
    原字符串:this is an example for 测试,
    对应的规范字符串:this%20is%20an%20example%20for%20%E6%B5%8B%E8%AF%95

说明:下面这段sample代码以java为例演示如何进行UrlEncode。其中input为输入字符串,encodeSlash用来控制是否对"/"进行编码。在有些情况下,做UrlEncode时需要忽略"/",具体情况可以参见“编码规范”。

public static String uri-encode(CharSequence input, boolean encodeSlash) {
          StringBuilder result = new StringBuilder();
          for (int i = 0; i < input.length(); i++) {
              char ch = input.charAt(i);
              if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') {
                  result.append(ch);
              } else if (ch == '/') {
                  result.append(encodeSlash ? "%2F" : ch);
              } else {
                  result.append(toHexUTF8(ch));
              }
          }
          return result.toString();
}

编码规范

  • 可解析内容,所有request/response body内容目前均使用UTF-8编码,后续会支持更多encoding类型。

  • 在请求时,需要对以下做UrlEncode:

    • Objectname,其中,Resource做UrlEncode的时候需要忽略“/”。
    • Querystring的Value。
    • x-bce-copy-source(忽略“/”)。
    • 自定义Meta:Meta Value只支持可见的ASCII字符,如果需要其它的字符,推荐使用UrlEncode处理。

请求语法风格

BOS API的请求语法支持不带“/v{version}/”的风格,也兼容“/v{version}/”的风格。以GetObject为例,下述两种写法的API调用方式都是正确的。

  • 不带/v{version}/的请求语法:GET /bucket/object HTTP/1.1
  • 带/v{version}/的请求语法:GET /v1/bucket/object HTTP/1.1

资源数目及大小规范

  • 用户可有的Bucket数目100。如果需要更多bucket,可以通过工单系统申请。

  • Bucket中的Object数不限。

  • 支持单个Object最大为5TB。

  • 用户请求Header大小不得超过8KB。其中用户自定义Meta(x-bce-meta-)不得超过2KB;Meta值不能为空,且只支持ASCII格式。

命名规范

Bucket格式要求:

  • 只能包括小写字母,数字和连字符“-”。

  • Bucket名开头和结尾必须是小写字母或数字。

  • 长度为3~63位。

Object格式要求:长度不能超过1024个字节的UTF-8字符。

日期与时间

日期与时间的表示有多种方式。为统一起见,除非是约定俗成或者有相应规范的,凡是HTTP标准中规定的表示日期和时间字段用GMT,其他日期时间表示的地方一律采用UTC时间,遵循ISO 8601,并做以下约束:

  • 表示日期一律采用YYYY-MM-DD方式,例如2014-06-01表示2014年6月1日。
  • 表示时间一律采用hh:mm:ss方式,并在最后加一个大写字母Z表示UTC时间。例如23:00:10Z表示UTC时间23点0分10秒。
  • 凡涉及日期和时间合并表示时,在两者中间加大写字母T,例如2014-06-01T23:00:10Z表示UTC时间2014年6月1日23点0分10秒。