基于配置的 API 接口写法设计讨论

2017-06-19 15:13:08 +08:00
 prasanta

现在市面上的开源框架, 不管是 tornado, django 或者 flask. 写起 API 总感觉没有 Nodejs 中的 hapijs 框架爽, 根据 hapijs 的设计原理, 我设想了下面的写法. 大家一起来讨论. 基于配置的方法去写接口感觉真的很舒适. 部分代码如下. (框架还没有, 只是设想. )

app.js

from api import *
from .apis.post import post
from .apis.user import user
from .plugins.my_plugin import MyPlugin

app = App()

app.plugin(MyPlugin)
app.plugin(AuthorizationPlugin('jwt'))

app.publish(user)
app.publish(post)

app.start(port=3000)

user.js

from api import *
from .services.user import UserService

user = BluePrint()
user.role('admin')


@user.cache({
    'expires_in': 30 * 1000,
    'privacy': 'private'
})
@user.query({
    'name': Field().string()
})
@user.role('all')
@user.get('/')
def list(self, request):
    users = UserService.list(**request.query)
    return Response(users)


@user.cache({
    'expires_in': 30 * 1000,
    'privacy': 'private'
})
@user.params({
    'id': Field().string()
})
@user.role('login_user')
@user.get('/{id}')
def retrieve(self, request):
    user = UserService.retrieve(id=request.params[id])
    return Response(user)


@user.payload({
    'name': Field().string()
})
@user.role('admin')
@user.post('/')
def create(self, request):
    user = UserService.create(request.payload)
    return Response(user)


@user.payload({
    'name': Field().string()
})
@user.params({
    'id': Field().string()
})
@user.role('admin')
@user.patch('/{id}')
def update(self, request):
    user = UserService.update(id=request.params[id], payload=request.payload)
    return Response(user)


@user.payload({
    'name': Field().string()
})
@user.params({
    'id': Field().string()
})
@user.role('admin')
@user.put('/{id}/name')
def replace_name(self, request):
    user = UserService.update(id=request.params[id], payload=request.payload)
    return Response(user)

2791 次点击
所在节点    Python
8 条回复
guyskk
2017-06-19 20:13:46 +08:00
Flask 稍微封装一下也可以写出这种效果,待我回去截个图
zjq426
2017-06-20 09:31:25 +08:00
araraloren
2017-06-20 09:32:26 +08:00
~~ 看不懂,也没个注释 讲解,进来一脸懵逼
guyskk
2017-06-20 11:13:29 +08:00
API 写法

Flask 封装




这样写还是比较方便的,不过不建议造新框架,生态很重要
guyskk
2017-06-20 11:22:03 +08:00
doc_view 里面我用模板生成了 .apib (API Blueprint https://apiblueprint.org/) 格式的文档。
这些代码没从项目里抽取出来,要做成通用的框架或插件要考虑很多使用场景的问题。我这里约定 全部 POST,全部 JSON,所以省了很多事。
guyskk
2017-06-20 11:29:00 +08:00
文档效果
RaymondLiu
2017-06-30 21:19:46 +08:00
@guyskk flask-restful 自带函数验证
guyskk
2017-06-30 21:35:43 +08:00
@RaymondLiu 你指的是 RequestParser 吗,感觉有点繁琐,另外它不方便生成文档

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/369557

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX