restful接口规范
接口
接口:
联系两个物质的媒介,完成信息交互
web程序中:联系前台页面与后台数据库的媒介
web接口组成:
- url:长得像返回数据的url链接
- 请求参数:前台按照指定的key提供数据给后台
- 响应数据:后台与数据库交互后将数据反馈给前台
规范
web数据请求接口设计规范
# 分两部分
1. url:
1
)通常使用https请求
2
)域名:有api关键字出现
-- https://
api.example.com (存在跨域问题)
-- https://example.com/
api
3
)版本:不同版本需要标注
-- https://example.com/api/v1 | -- https://example.com/api/1
-- https://example.com/api/v2 | -- https://example.com/api/2
4
)资源:请求的目标数据称之为资源,资源一般都有名词复数表示
-- https://example.com/api/v1/books (之前不规范的案例: /get_books/
)
5
)操作方式:不从请求链接体现操作方式,从请求方式上决定操作方式(一条url对应get或post等多种操作,所以后端采用CBV)
-- get:https://example.com/api/v1/
books 获取所有
-- post:https://example.com/api/v1/
books 新增一本
-- put:https://example.com/api/v1/book/1 更新id=
1的一本(整体更新)
-- patch:https://example.com/api/v1/book/1 更新id=
1的一本(局部更新)
-- delete:https://example.com/api/v1/book/1 删除id=
1的一本
6)资源过滤:通过接口传递参数来过滤资源 -
筛选、排序、限制
-- https://example.com/api/v1/books?limit=10
限制10条
2.响应部分:
7)状态码:返回数据要标准状态码,通过在数据中 {
"status": 200
}
-- SUCCESS(
"0",
"查询成功")
-- NODATA(
"1xx",
"非正确,无数据,显示基本信息")
-- FEAILED(
"2xx",
"查询失败")
8)错误信息:请求失败需要标注错误信息 {
"message":
"请求参数不合法"}
9)操作结果:请求操作成功的返回结果 {
"results": []}
-- get:返回资源列表 |
返回单一资源
--
post:返回单一新增资源
--
put:返回更新的资源
--
patch:返回更新的资源
--
delete:返回空文档
10)子资源返回资源接口:返回的资源如果有子资源,返回子资源的链接地址,如查找书,书的封面图片就可以url表示
基于restful规范的原生django接口
主路由: url.py
from django.conf.urls
import url,include
from django.contrib
import admin
urlpatterns =
[
url(r'^admin/', admin.site.urls),
# 路由分发
url(r
'^api/',include(
'api.urls')),
]
api应用的子路由: api/url.py
from django.conf.urls
import url
from .
import views
urlpatterns =
[
# get查所有,post添加数据
url(r
'^books/$', views.Book.as_view()),
# 查一个,删一个,更新(整体,局部)一个
url(r
'^books/(?P<pk>.*)/', views.Book.as_view())
]
模型层: model.py
from django.db
import models
# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=64
)
price = models.DecimalField(max_digits=5, decimal_places=2
)
class Meta:
# 表名
db_table =
'red_book'
verbose_name =
'书籍'
verbose_name_plural =
verbose_name
def __str__(self):
return self.title
后台: admin.py
from django.contrib
import admin
from .
import models
admin.site.register(models.Book)
数据库迁移
>
: python manage.py makemigrations
>
: python manage.py migrrate
>: python manage.py createsuperuser
视图层: views.py
from django.http
import JsonResponse
from django.views
import View
from .
import models
class Book(View):
# View 源码中判断wsgiref处理好的request中的请求方式,是GET,还是POST等,并自动掉对应的函数方法(通过调度(dispatch)分发请求)
def get(self, request, *args, **
kwargs):
# GRT请求时,url后拼接的数据放到了request.GET中
print(request.GET)
print(kwargs)
# 有名分组的数据被放到kwargs中
pk = kwargs.get(
'pk')
if not pk:
# 群查
book_obj_list =
models.Book.objects.all()
# 数据信息列表
book_list =
[]
for obj
in book_obj_list:
dic =
{}
dic['title'] =
obj.title
dic['price'] =
obj.price
book_list.append(dic)
# 响应数据(遵循接口规范:响应状态码, 提示信息, 操作结果)
return JsonResponse({
'status': 0,
# 响应状态码
'msg':
'ok',
# 提示信息
'results': book_list
# 操作结果
}, json_dumps_params={
'ensure_ascii': False})
else:
# 单查
book_dic = models.Book.objects.filter(pk=pk).values(
'title',
'price').first()
print(book_dic,type(book_dic))
if book_dic:
return JsonResponse({
'status': 0,
'msg':
'ok',
'results': book_dic
}, json_dumps_params={
'ensure_ascii': False})
return JsonResponse({
'status': 0,
'msg':
'无结果',
}, json_dumps_params={
'ensure_ascii': False})
def post(self, request, *args, **
kwargs):
print(request.POST)
# print(request.POST.dict())
# print(request.body)
print(request.FILES)
# POST请求时的Content-Type有三种:urlencoded,json,formdata
# urlencoded:将request.body中的二进制数据处理放到对应的request.GET或request.POST中
# json:数据以二进制形式存放在request.body中不进行处理
try:
book_obj = models.Book.objects.create(**
request.POST.dict())
print(book_obj, type(book_obj))
if book_obj:
return JsonResponse({
'status': 0,
'msg':
'ok',
'results': {
'title':book_obj.title,
'price':book_obj.price}
}, json_dumps_params={
'ensure_ascii':False})
except:
return JsonResponse({
'status': 1
,
'msg':
'参数有误',
}, json_dumps_params={
'ensure_ascii': False})
return JsonResponse({
'status': 2
,
'msg':
'新增失败',
}, json_dumps_params={
'ensure_ascii': False})
补充:
# postman可以完成不同方式的请求:get | post | put ...
# postman发送数据包有三种方式:form-data | urlencoding | json
# 原生django对urlencoding方式数据兼容最好