Restful api 踩坑记录

关于put没有参数的问题

有以下两个路由 因为用户鉴权是做在headers中的 所以.. 对自己的操作.. 应该不会有 user/{userId} 这个层级了

  • 用户 删除 图片 [delete] /image/{imageId} 这个路由已经确定
  • 用户 添加/修改 图片(可以修改多个)

按道理来说,第二个路由 理想中应该是 [PUT] image 但是因为restful 的缘故 PUT 方法后面必须加一个参数 ,所以 我很难受.. 就换成post了

最终路由定义

$router->delete('image/{imageId}', ['as' => 'xxx', 'uses' => 'xxx@xxx']);
# 这里用post的原因 在上面说明了 我用 image/{id} 这个{id}含义模糊不清又显得多余
$router->post('image', ['as' => 'xxx', 'uses' => 'xx@xxx']);

关于是否返回404 code的问题

加入你访问 用户 接口..这个用户不存在 我会返回 返回如下Json 并且Http 响应是 404

# 这里的http响应是404
{
    "code": 4040000,
    "message": "Not Found",
    "data": []
}

但是这里就有问题了.. 因为客户端访问一个资源的状态码也是404 所以.. 容易造成客户端判断的问题[到底是他们不做呢..还是怎么地.反正最后因为业务太急] 我最后Http状态码 换成了 200

删除成功是否返回204 http code

http 204状态码 是不能返回响应的... 所以 当某个资源删除了之后.. 我就返回 201 http状态码了 因为这样才能返回响应啊

是否需要 code data message 这几个层

请求成功的结构

{
    "code": 2000000,
    "message": "OK",
    "data":[]
}

请求失败的结构

{
    "code": 4010000,
    "message": "not found authenticate in headers",
    "details": {}
}

对于这点 我其实有点纠结的.. 我又想让客户端 使用 服务端提供的 message (毕竟不像让他们写死) 但是 当 2xx 这种请求 其实返回 code message 又很没用 当然只要不是2xx的响应 都应该有 错误状态码 错误消息

如果我现在再来定义.. 我可能会保留 code message data 三个层级..

业务基本的code不能重复,更不能通用

if(钱不够){
    return utils()->apiResponse()->forbidden('余额不足');
}

这里的4030000 我定义的时候是一个通用的code 代表 权限不够..被拒绝..

这里我返回了一个通用的code 4030000,其实这样是不对的.. 这样客户端就会拿着4030000 作为钱不足的判断 如果说,在这个判断前面,,还有其他 403 权限类的错误.. 我再返回 4030000 就容易导致让客户端以为是钱不够...

关于业务code状态码的定义