web API接口及Restful接口规范
【一】web API接口
api接口应该有哪些东西
1.url地址
2.请求方式 如 get post delete post 等等
3.请求参数
- 地址栏中的参数: http://127.0.0.1:8000/index?name=green&age=18
- 请求体:编码格式
4.响应结果:json或者xml格式的数据
总结
web后端提供给前端的可以访问且拿到对应数据的url称之为api接口
【二】body的编码格式
- urlencoded,form-data,json
# 问题1
- get请求可以在地址栏携带参数如http://127.0.0.1:8000/index?name=green&age=18,那么能不能在body里面携带参数呢?
# 答
- 可以携带,也可以将参数提交到后端,但是django没有将它封装到POST里面,需要从request.body里面自己手动取出
# 问题2
- form-data格式,django是如何取出携带的文件和数据的
# 答
-文件:request.FILES.get('myfile')
-数据:request.POST.get('xxx')
# 问题3
- json格式的数据,django该如何取出
# 答
- 通过request.body取,注意需要自己转格式
【三】RESTful API介绍
- REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。
【1】规范十条
数据的安全保障
- 使用相对安全的https协议
url地址中带接口标识
- 用api关键字来标识接口url,看到api的字眼就应该知道这是用来完成前后端数据交互的
- 如 https://api.example.com , https://example.org/api/
版本
- 将版本放在url中,如:
- https://api.example.com/v1/, https://api.example.com/v2/
- 或者将版本信息放在请求头之中
数据即是资源
- 网络上的任何东西都是资源,都是用名词来表示,可以用复数,如:
- 在url中尽量不出现动词,以下是错误示范!!!
- 特殊的接口可以出现动词,因为这些接口一般没有一个明确的资源,或是动词就是接口的核心含义
请求方式,增删改查 crud
- GET :从服务器取出资源(一项或多项)
- POST :在服务器新建一个资源
- PUT :在服务器更新资源(客户端提供改变后的完整资源)
- PATCH :在服务器更新资源(客户端提供改变的属性)
- DELETE :从服务器删除资源
过滤
-
通过在url上传参的形式提交搜索条件,达到过滤数据的效果
-
https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
-
https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
响应中带状态码
-http响应状态码
-1xx 请求正在处理
-2xx 正常响应
-3xx 资源重定向
-4xx 客户端异常
-5xx 服务端异常
-自定制状态码
- 自己定义一些状态码,会在接口文档中描述该状态码是什么意思
响应中带信息描述
如
{
'code':200,
'message':'请求成功'
}
针对不同操作有不同规范
如
查询一条数据
{
code:200,
message:查询成功,
result:{...}
}
查询多条数据
{
code:200,
message:查询成功,
result:[{...},{...},{...}]
}
返回数据中带链接
- 有时候返回图片需要返回图片地址链接
【四】序列化和反序列化
- aip接口开发最核心常见的一个过程就是序列化,所谓序列化就是把数据转换格式
- 序列化分为两个阶段【序列化和反序列化】
- 序列化:把自己能识别的对象转变成别人能识别的对象
- 反序列化:把自己不能识别的对象转换为能识别的对象
【五】CBV源码分析
浏览器输入地址,首先执行的就是views.IndexView.as_view()
可以分析出as_view()是一个绑定给类的方法
点进去发现as_view是一个闭包函数,调用as_view相当于调用view
view里面有这么一行代码self = cls(**initkwargs),这里的cls指的是IndexView
所以self指的就是IndexView类的对象
继续看view 可以发现view返回值是self.dispatch(request, *args, **kwargs)
所以本质就是IndexView类的对象调用了dispatch方法
点进dispath方法查看
def dispatch(self, request, *args, **kwargs):
# 可以发现他就是拿到当前的请求方法,将方法小写,然后做一个成员判断
if request.method.lower() in self.http_method_names:
# 这里的self就是当前视图类的对象,在这个对象里面去找有没有对应的方法
# 很显然对于常见的get post请求都是有的
# 将这个方法赋值给handler
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
# 最后的fan'hu
return handler(request, *args, **kwargs)