首先,我签署了标题是炎症的,休息API不是真实的,我总是梦想着写作其中一个" XXX被认为有害"文章,所以这里是。点i'在这里制作的点是休息线的更多是一个贝尔不方便的,而且可以做出一些微小的改进,使其更令人愉快。
休息的东西,就是在它的核心,它基本上是一个rpc(远程过程调用)那个' Ve一直在http协议中迅撞。没有充分的理由这样做。 httpwasn' t为此,我们应该抽象那个图层,而不是试图用它来用作它'不是履行。
休息的主要问题是,有太多方法可以通过争论!以下是列表:
这意味着我们最终需要每个路由来创建一个抓住钉的处理函数,无论他们来自哪里,都将它们传递给我们的实际功能。在Express / nodejs中,它将是如下所示:
// frontend fetch(`/ user / $ {id} /上传?标记= $ {tag}`,{method:' post',body:file})// backend const用户=要求(& #39;模型/用户')路由器。帖子(' / user /:id /上传'(eckpermissions,(req,res)=> {const id = req。params。id const标记= req。查询。标签const文件= req。文件[0]用户。上传(ID,标记,文件)})
这是如此冗长!毕竟,我们真正想要的只是能够从前端调用后端函数。一个理想的解决方案是完全声明的,并隐藏那些Peskytransport层细节:
//前端用户。上传(ID,标记,文件)//后端类用户{上载(ID,标记,文件){/ * ... * /}} API。公开(用户,{上传:CheckPermissions,})
没有这看起来更清楚了吗?实施细节已经一去不复返了,程序员在这里能够完全拓扑焦点,并确保权限和amp等重要细节。 Securitalare在他们应该这样的时候处理。
我一直在实施我最新项目中以这些原则为中心的HTTP RPC。我viden' inden-sourced它,因为它' s嵌入在一个封闭的源项目中,但如果有需要,我可能会这样做。但是,我的提议是如此简单的那样简单; d宁愿解释它。
该端点负责接收调用哪种方法以及哪些参数。通过了Howthose参数是,最终没有真正相关,运输只是需要做出自己的契好。在我的实现中,一切都在POST请求中作为多部分表单数据传递。这只是为了确保可以传递任何东西:原始类型,对象和文件。
获取(' / api' {方法:' post' body:createformdata({method:' user.upload',0:userid / * number * / ,1:标签/ *字符串* /,2:文件/ *文件对象* /,})})
简单而简单。一旦实施了我们的传输层,我们可以创建一个非常归档的API,即服务器:
API。公开(user,{create:权限。用户(创建),get:权限。用户(read),更新:权限。用户(写),删除:权限。用户(删除),})API。公开(组,{create:权限。组(创建),获取:权限。组(读取),更新:权限。组(写),删除:权限。组(删除),})API。暴露(/ *等* /)
对于NodeJS Express应用程序,这意味着我们可以摆脱整个路由器/目录!拥有这种明确和声明的API的好处也进一步进一步,因为我也使用了API.Expe方法来自动 - 以前端代码调用后端代码:
//自动生成的代码const api = {组:{create :(值,选项)=> apicall(' group.create',[值,选项]),更新:(id,字段)=> apicall(' group.update',[id,field]),destroy :( id)=> apicall(' group.destroy' [id]),得到:( id)=> apicall(' group.get' [id]),},user:{create :(值,选项)=> apicall(' user.create',[值,选项]),更新:(ID,字段)=> apicall(' user.update',[id,fields]),destroy :( id)=> apicall(' group.destroy' [id]),得到:( id)=> apicall(' user.get',[id]),},/ * etc * /} 这允许适当的自动完成,并且更多的仪器也可以添加甚至moresecurity的打字。 这一切,如果我有一句话总结这篇文章,那将是:不要忘记休息只是一个rpc!