每天进步一点点——Swift中HTTP返回码解析

来源:互联网 发布:淘宝为什么会被删评价 编辑:程序博客网 时间:2024/04/29 11:50

转载请说明出处:http://blog.csdn.net/cywosp/article/details/20469261


    在刚开始接触Swift的时候,为了能更好的完成项目开发,当时花了点时间简单总结了一下Swift返回码所对应的意思以及产生的原因。现在拿出来分享一下,希望对需要的朋友有用。


根据Swift官方文档所描述对外的值主要有:200,201,202,204,400,403,404,405,408,409,411,412,500,503,507。下面将根据Swift特性(Account/Container/Object)来分别讨论各个返回码产生的原因及其代表的意思。

1. Account

200  

列取账户下的容器成功

201

创建账户成功

202

获取账户的元数据信息成功

204

1. 创建或者更新元数据成功

2. 获取元数据成功

3. 删除元数据成功

400

创建Account的名字长度大于256个字节

403

删除了一个账户,但是Swift内部并未来得急将其删除,只是将其标志为删除且在等待收割进程将其回收,而此时又发起了创建该账户的请求

404

账户不存在

405

错误的请求方法(PUT DELETE POST HEAD GET等之外的方法

409

删除账户,账户正在被删除而此时发起了创建账户请求则会返回该值

412

1. 列取容器时传入了无法解析的delimiter

2. 列取容器时传入的limiter大于了ACCOUNT_LISTING_LIMIT(默认10000)

3. HTTP请求中包含了非UTF-8的字符

2. Container

200  

列取容器下的对象成功

201

创建容器成功

202

创建容器时容器已经存在

204

1. 删除容器成功

2. 获取元数据成功

3. 创建或者更新元数据成功

4. 删除元数据

400

1. 创建的容器名长度大于256个字符

403

如果设置了每个账户下最多能有容器个数的限制(max_containers_per_account),当账户下达到该限制时会返回该值,默认可以创建无限个容器。

404

1. 当容器不存在时返回该值

2. 在对容器操作时对应的账户不存在

405

错误的请求方法(PUT DELETE POST HEAD GET等之外的方法

409

1. 删除一个还有对象的容器会返回该值

2. 容器正在被删除而此时又发起了删除该容器的请求

3. 容器正在被删除而此时又发起了创建该容器的请求

412

1. 列取对象时传入了无法解析的delimiter

2. 列取对象时传入的limiter大于了CONTAINER_LISTING_LIMIT(默认10000)

3. HTTP请求中包含了非UTF-8的字符

3. Object

200

列取对象元数据成功

201

创建对象成功

202

创建或者更新对象元数据成功

204

删除对象成功

400

POST或者PUT请求中传入的x-delete-after值无法转化或者传入的值是一个针对当前系统来说是个过去的时间

404

1. 创建、删除对象时容器不存在

2. 列取对象相关信息时对象本身不存在或者容器不存在

3. 如果对象使用了超时则超时后对象暂时还未被回收进程删除,此时请求该对象也会返回该值

405

错误的请求方法(PUT DELETE POST HEAD GET COPY等之外的方法

408

请求对象超时

411

创建对象时在请求中没有Content-Length项

412

1. 对象正在被删除此时又发起了获取对象的请求

2. 在对象有多版本时出现了相关的容器不存在可能会返回该值

3. 在使用了对象过时自动删除功能时,删除对象时时间戳不对

4. HTTP请求中包含了非UTF-8的字符

5. 在HTTP请求的头中有if-match类似的匹配查找时,由于条件无法满足

6. COPY请求中没有传入目标值或者传入的值不满足container/object的格式

7. 总之就是请求中的某些字段不满足服务端的处理逻辑就会返回该值

413

当创建的对象大小超过MAX_FILE_SIZE(默认5GB)

499

上传对象的过程中连接断开或者本应该上传的数据与实际上传的数据长度不一致

4. 服务不可用类型的返回值

5 00

Account-Server Container-Server Object-Server在出现不可处理的请求时会给Proxy-Server返回该值或者在处理Proxy-Server的请求超时时

503

ESwift中出现该值的情况很多

1. Proxy服务无法连接Account,Container,Object等服务或者连接超时,那么Proxy会统一将这种情况以该值反馈给swift的客户端

2. 当Swift被配置为多个副本,多节点的时候,如果请求某个资源,Proxy服务将会计算出该资源所处的位置(有多少个副本就有多少个位置),然后向所有位置所在的节点发起请求,如果有少于一半的节点由于各种原因(网络超时、遇到未知情况无法完成请求、所请求节点没有Swift或者相关服务没又开启、节点之间时间不同步,磁盘出问,有一半以上的节点数据被破坏但是有些节点的数据又是完整的等)没有正常返回,那么Proxy经过处理之后也将给客户端返回该值。所以对于客户端来说很难知道Swift到底出了什么情况,只能通过Swift日志来排查问题。当在实际使用过程中遇到该值客户端只能通过不断重试来获取想要的数据,具体重试多少次就得因问题而异了。

50 7

对应的磁盘没有被挂载,而是直接使用了系统的目录 


注:以上总结都是在没有认证模块的基础上做的,并不是非常完全,或许还有不正确的地方。


2 0
原创粉丝点击