Day 9 - 编写API
自从Roy Fielding博士在2000年他的博士论文中提出REST(Representational State Transfer)风格的软件架构模式后,REST就基本上迅速取代了复杂而笨重的SOAP,成为Web API的标准了。
什么是Web API呢?
如果我们想要获取一篇Blog,输入http://localhost:9000/blog/123
,就可以看到id为123
的Blog页面,但这个结果是HTML页面,它同时混合包含了Blog的数据和Blog的展示两个部分。对于用户来说,阅读起来没有问题,但是,如果机器读取,就很难从HTML中解析出Blog的数据。
如果一个URL返回的不是HTML,而是机器能直接解析的数据,这个URL就可以看成是一个Web API。比如,读取http://localhost:9000/api/blogs/123
,如果能直接返回Blog的数据,那么机器就可以直接读取。
REST就是一种设计API的模式。最常用的数据格式是JSON。由于JSON能直接被JavaScript读取,所以,以JSON格式编写的REST风格的API具有简单、易读、易用的特点。
编写API有什么好处呢?由于API就是把Web App的功能全部封装了,所以,通过API操作数据,可以极大地把前端和后端的代码隔离,使得后端代码易于测试,前端代码编写更简单。
一个API也是一个URL的处理函数,我们希望能直接通过一个@api
来把函数变成JSON格式的REST API,这样,获取注册用户可以用一个API实现如下:
@get('/api/users')
def api_get_users(*, page='1'):
page_index = get_page_index(page)
num = yield from User.findNumber('count(id)')
p = Page(num, page_index)
if num == 0:
return dict(page=p, users=())
users = yield from User.findAll(orderBy='created_at desc', limit=(p.offset, p.limit))
for u in users:
u.passwd = '******'
return dict(page=p, users=users)
只要返回一个dict
,后续的response
这个middleware
就可以把结果序列化为JSON并返回。
我们需要对Error进行处理,因此定义一个APIError
,这种Error是指API调用时发生了逻辑错误(比如用户不存在),其他的Error视为Bug,返回的错误代码为internalerror
。
客户端调用API时,必须通过错误代码来区分API调用是否成功。错误代码是用来告诉调用者出错的原因。很多API用一个整数表示错误码,这种方式很难维护错误码,客户端拿到错误码还需要查表得知错误信息。更好的方式是用字符串表示错误代码,不需要看文档也能猜到错误原因。
可以在浏览器直接测试API,例如,输入http://localhost:9000/api/users
,就可以看到返回的JSON:
参考源码
相关文章
- [python]进阶学习之阅读代码
- Python Image Library fails with message “decoder JPEG not available” - PIL
- [python]使用virtualenvWrapper
- [python]初探socket
- [python]新手写爬虫v2.5(使用代理的异步爬虫)
- [python]爬代理ip v2.0(未完待续)
- [python]抽象方法
- [pyhton]python内建方法
- [python]非常小的下载图片脚本(非通用)
- [python]decimal常用操作和需要注意的地方
- [python实用代码片段]python获取当前时间的前一天,前一周,前一个月
- 5 分钟,教你用 Python 制作一个生日提醒!
- 今年十八,蓝桥速刷(Python-I)
- 使用python-jenkins管理Jenkins
- python爬百度翻译demo
- python将获取到的数据保存到文本
- python:使用xpath获取想要的数据
- 接口测试第2讲:Python测试框架——unittest
- 接口测试第3讲:Python测试框架——pytest
- [python]pythonic的字典常用操作