实现RESTful 服务资源的常用状态码

因为RESTful是基于http协议的,所以状态码也是基于http的,
  200-2xx 成功
  300-3xx 重定向
  400-4xx 客户请求错误
  500-5xx 服务器错误
我们在实现服务资源的时候,通常只需要考虑4xx 和5xx的情形。其中最经常使用的是 401、403、404、406和500。那么应该在什么情况下,使用哪个状态码呢。

500最好理解了,只要是服务器出现的问题,都是500。当然了,大部分的5xx错误,都由Apache、drupal、rest_server给出了,经过层层过滤还能达到资源本身这里的,已经寥寥无几。比较典型的是file资源,文件本身无法保存在服务器,通常是路径权限问题
return services_error(t("Could not write file to destination"), 500);
再就是各种奇怪问题,file和node资源都会返回
return services_error(t('An unknown error occurred'), 500);
这时需要客户端在用户面前为服务器挽留颜面,不能冷嘲热讽恶语相向激化矛盾。

401是说客户端没登陆,这个很简单,客户端要求用户登录就是了。
403比较nb了,是401的升级版,是说登录了也没有权限。比如删除管理员用户就属于这种情况。客户端需要礼貌的提醒用户,没有权限。比如user资源会返回
return services_error(t('The admin user cannot be deleted.'), 403);
404大家都懂得,什么资源被外星人劫持了,或者被河蟹吃掉了,或者帮忙找小孩啦。客户端随意发挥就是了。比如node资源的 return services_error(t('Node @nid not found', array('@nid' => $old_node->nid)), 404);comment资源的return services_error(t('There is no comment found with id @cid', array('@cid' => $cid)), 404);
406也比较nb,是404的升级版,意思是说资源找到了,但是这个资源不支持你提交的action。就像一个类没有相关的属性和方法一样。你不能驾驶一棵树,不能问美女的体重。比如node资源在客户端尝试修改node::type时,返回return services_error(t('Node type cannot be changed'), 406);
客户端遇到406,首先需要自查自纠。确实错不在自己时,才善意提醒用户。比如user资源返回return services_error(t('Sorry, %name is not recognized as a user name or an e-mail address.', array('%name' => $name)), 406);