
# OPTIONS桶-OptionsBucket
#### 功能介绍
OPTIONS称为预检请求（Preflight Request），是浏览器在发送跨域请求前自动发出的检测请求，通常被用于检测客户端是否具有对服务端进行操作的权限。只有当预请求成功返回，客户端才开始执行后续的请求。
OBS允许在桶内保存静态的网页资源，在正确的使用下，OBS的桶可以成为网站资源。在这种使用场景下，OBS中的桶作为服务端，需要处理客户端发送的OPTIONS预请求。
#### 接口约束
要处理OPTIONS，OBS的桶必须已经配置CORS，否则OPTIONS请求将返回403 Forbidden。关于CORS的使用说明，请参见章节[设置桶的CORS配置-SetBucketCors](https://support.huaweicloud.com/api-obs/obs_04_0074.html)。
#### 与OPTIONS对象的区别
OPTIONS对象需在URL中指定对象名；OPTIONS桶提交的URL为桶域名，无需指定对象名。两者的请求行分别为：
```
OPTIONS /object HTTP/1.1
```
```
OPTIONS / HTTP/1.1
```
#### URI
OPTIONS /
#### 调用方法
请参见[如何调用API](https://support.huaweicloud.com/api-obs/obs_04_0006.html)。调用前需要先[计算API签名](https://support.huaweicloud.com/api-obs/obs_04_0009.html)，并将签名添加到请求中。
您还可以使用[API Explorer](https://console.huaweicloud.com/apiexplorer/#/openapi/OBS/doc?api=CheckBucketOptions)在线调试接口。
#### 请求消息样式
```
OPTIONS / HTTP/1.1 
Host: bucketname.obs.cn-north-4.myhuaweicloud.com 
Date: date
Authorization: authorization
Origin: origin
Access-Control-Request-Method: method
```
其中有关Authorization，在使用API Explorer或curl调试时需要携带该头域，浏览器发起的CORS预检请求不需要。
#### URI参数（URI Parameters）
该请求消息中不使用消息参数。
#### 请求头参数（Request headers）
该请求使用的消息头如下[表1]所示。
 表1OPTIONS请求头参数（Request headers） 
| 消息头名称                          | 是否必选 | 类型     | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|:---|
| Origin                         | 是    | String | **参数解释：** 预请求指定的跨域请求Origin（通常为域名）。 **约束限制：** 值不能为空。 **取值范围：** 合法的域名格式。 **默认取值：** 不涉及。                                                                                                                                                                                                    |
| Access-Control-Request-Method  | 是    | String | **参数解释：** 实际请求可以带的HTTP方法，可以带多个方法头域。 **约束限制**： 有效的HTTP方法。 **取值范围：** GET：获取 PUT：写/改 HEAD：查询信息 POST：写/改 DELETE：删除 默认取值： 不涉及。 |
| Access-Control-Request-Headers | 否    | String | **参数解释：** 实际请求可以带的HTTP头域，可以带多个头域。 **约束限制：** 可以带多个头域。 **取值范围：** 任意HTTP头域名称。 **默认取值：** 不涉及。                                                                                                                                                                                                   |
   
#### 请求体参数（Request body）
该请求消息中不带请求体参数。
#### 响应消息样式
```
HTTP/1.1 status_code
Access-Control-Allow-Origin: origin
Access-Control-Allow-Methods: method
Access-Control-Allow-Headers: header
Access-Control-Max-Age: time
Access-Control-Expose-Headers: header
Access-Control-Allow-Credentials: credentials
Date: date
Content-Length: length
```
#### 响应头 (Response Headers)
该响应使用的消息头如下[表2]所示。
 表2CORS响应头 (Response Headers) 
| 消息头名称                         | 类型      | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|
| Access-Control-Allow-Origin   | String  | **参数解释：** 如果请求的Origin满足服务端的CORS配置，则在响应中包含这个Origin。 **取值范围：** CORS配置中允许的Origin。                                                                                                                                                                                                                                |
| Access-Control-Allow-Headers  | String  | **参数解释：** 如果请求的headers满足服务端的CORS配置，则在响应中包含这个headers。 **取值范围：** CORS配置中允许的Headers。                                                                                                                                                                                                                          |
| Access-Control-Max-Age        | Integer | **参数解释：** 服务端CORS配置中的MaxAgeSeconds。 **取值范围：** 秒数，正整数。                                                                                                                                                                                                                                                    |
| Access-Control-Allow-Methods  | String  | **参数解释：** 如果请求的Access-Control-Request-Method满足服务端的CORS配置，则在响应中包含这条rule中的Methods。 **取值范围：** GET：获取 PUT：写/改 HEAD：查询信息 POST：写/改 DELETE：删除 |
| Access-Control-Expose-Headers | String  | **参数解释：** 服务端CORS配置中的ExposeHeader。 **取值范围：** 自定义响应头名称。                                                                                                                                                                                                                                                     |
   
#### 响应体 (Response Body)
该请求的响应消息中不带消息元素。
#### 错误响应消息
此请求可能的特殊错误如下[表3]描述。
 表3特殊错误 
| 错误码             | 描述                                                                                                                                                                                                                                                                                                                          | HTTP状态码        |
|:---|:---|:---|
| Bad Request     | Invalid Access-Control-Request-Method: null 桶配置了CORS，OPTIONS桶时，没有加入method头域。                                                                                                                                                                                                            | 400 BadRequest |
| Bad Request     | Insufficient information. Origin request header needed. 桶配置了CORS，OPTIONS桶时，没有加入origin头域。                                                                                                                                                                                                | 400 BadRequest |
| AccessForbidden | CORSResponse: This CORS request is not allowed. This is usually because the evaluation of Origin, request method / Access-Control-Request-Method or Access-Control-Request-Headers are not whitelisted by the resource's CORS spec. 桶配置了CORS，OPTIONS桶时，Origin、method、Headers与任一rule匹配不上。 | 403 Forbidden  |
   
其余错误已经包含在[错误码概述](https://support.huaweicloud.com/api-obs/obs_04_0115.html)中。
#### 请求示例
```
OPTIONS / HTTP/1.1
User-Agent: curl/7.29.0
Host: examplebucket.obs.cn-north-4.myhuaweicloud.com
Accept: */*
Date: Wed, 01 Jul 2015 04:02:15 GMT
Authorization: OBS H4IPJX0TQTHTHEBQQCEC:7RqP1vjemo6U+Adv9/Y6eGzWrzA=
Origin: www.example.com
Access-Control-Request-Method: PUT
```
#### 响应示例
```
HTTP/1.1 200 OK
Server: OBS
x-obs-request-id: BF260000016436314E8FF936946DBC9C
Access-Control-Allow-Origin: www.example.com
Access-Control-Allow-Methods: POST,GET,HEAD,PUT,DELETE
Access-Control-Max-Age: 100
Access-Control-Expose-Headers: ExposeHeader_1,ExposeHeader_2
Access-Control-Allow-Credentials: true
x-obs-id-2: 32AAAQAAEAABAAAQAAEAABAAAQAAEAABCTlYimJvOyJncCLNm5y/iz6MAGLNxTuS
Date: Wed, 01 Jul 2015 04:02:15 GMT
Content-Length: 0
```
#### 相关文档
- 了解更多有关跨域资源共享信息，请参见[配置跨域资源共享](https://support.huaweicloud.com/usermanual-obs/obs_03_0706.html)。
- API操作涉及的计费项参见[计费项](https://support.huaweicloud.com/price-obs/obs_42_0002.html)。
 
