restful规范和django源码写接口
一、restful规范
1、restful规范是什么,如何来的?
一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中 的规范
Roy Fielding的博士论文提出的
2、以后写接口,大致都要遵循如下规范
-1 数据的安全保障-》url链接一般都采用https协议进行传输--》它比http安全
-2 接口特征表现--》url中带api标识
-https://api.baidu.com/books/
-https://www.baidu.com/api/books/
-3 多数据版本共存--》url中带版本信息
https://api.baidu.com/v1/books
https://www.baidu.com/api/v2/books
-4 数据即是资源,均使用名词(可复数)-->前后台交互,交互的数据称之为资源
-数据即资源,前后端交互的数据称之为资源,url尽量使用名字
-https://127.0.0.1/api/v1/books/ -->表示对图书操作:增加,删除,查询,修改,都用这一个地址
-https://127.0.0.1/api/v1/get_all_books/ # 不符合restful规范
-https://127.0.0.1/api/v1/delete_books/# 不符合restful规范
-5 资源操作由请求方式决定
-get 请求获取数据(获取所有,获取单条)
-post 新增数据
-put 修改数据
-delete 删除数据
https://api.baidu.com/books - get请求:获取所有书
https://api.baidu.com/books/1 - get请求:获取主键为1的书
https://api.baidu.com/books - post请求:新增一本书书
https://api.baidu.com/books/1 - put请求:整体修改主键为1的书
https://api.baidu.com/books/1 - delete请求:删除主键为1的书
-6 请求地址中带过滤条件---》只针对于搜索所有接口
-7 响应状态码(两层)
-http响应状态码: 1xx,2xx,3xx,4xx,5xx:https://www.sohu.com/a/278045231_120014184
-成功都返回200,而在响应体中带 状态码--->code不同公司就不一样
{
"code": 101,
"msg": "用户名或密码错误"
}
-补充一:mysql 错误操作都会有个 数字(10060) 文字解释
-补充二:
-https://open.weibo.com/wiki/Error_code
-8 响应中带错误信息
{
"code": 101,
"msg": "用户名或密码错误"
}
-9 不同操作,返回格式符合如下标准
GET /collection:返回资源对象的列表(数组)
# [{name:西游记,price:19},{name:三国,price:19}]
GET /collection/resource:返回单个资源对象
# {name:三国,price:19}
POST /collection:返回新生成的资源对象
# {name:三国,price:19}
PUT /collection/resource:返回完整的资源对象
# {name:三国演绎,price:19}
DELETE /collection/resource:返回一个空文档
#
---》大家都这么做
{
code:100
msg:查询成功
restult:[{name:西游记,price:19},{name:三国,price:19}]
}
-10 响应中带链接
二、django原生写books五个接口
1、将5个接口进行分类:带id的和不带id的各写一个视图函数
http://127.0.0.1/books/ get查询所有 http://127.0.0.1/books/ post新增一条 http://127.0.0.1/books/id put修改一条 http://127.0.0.1/books/id delete删除一条 http://127.0.0.1/books/id get查询一条
2、views
class BookView(View):
def get(self, request, *args, **kwargs):
books = Book.objects.all() # qs对象,不是列表,不能 序列化
# 自己做---->序列化
l = []
for itme in books:
l.append({'name': itme.name, 'price': itme.price})
res = {'code': 100, 'msg': '查询成功', 'result': l}
return JsonResponse(res)
def post(self, request):
in_data_dic = json.loads(request.body) # 获取前端的post方法的json请求
name = in_data_dic.get('name')
price = in_data_dic.get('price')
new_book = Book.objects.create(name=name, price=price)
res = {'code': 100, 'msg': '添加成功', 'result': {'name': new_book.name, 'price': new_book.price}}
return JsonResponse(res)
class BookDetailView(View):
def put(self, request, pk): # 修改数据
# 取出前端传入的json数据---》request.body
in_data_dic = json.loads(request.body)
name = in_data_dic.get('name')
price = in_data_dic.get('price')
book = Book.objects.get(pk=pk)
book.name = name
book.price = price
book.save()
return JsonResponse({'code': 100, 'msg': '查询成功', 'result': {'name': book.name, 'price': book.price}})
def delete(self, request, pk):
book = Book.objects.get(pk=pk)
Book.objects.filter(pk=pk).delete()
return JsonResponse({'code': 200, 'msg': '删除成功', 'result': {'name': book.name}})
def get(self, request, pk):
try:
book = Book.objects.get(pk=pk)
except:
return JsonResponse({'code': 200, 'msg': '查询的书籍不存在'})
return JsonResponse({'code': 200, 'msg': '查询成功', 'result': {'name': book.name}})