内容简介:RESTful是一种开发理念,REST是Roy Thomas Fileding在他博文提出的.REST特点;url简洁,将参数通过url传递到服务器,简单就是说URL定位资源,用HTTP动词描述操作.API接口应该部署到专用的域名下,如果API不需要扩展,可以放到主域名下,API版本号放到URL中或者放到请求头信息中,路径就是表示API的具体网站,每个网站都有对应的资源,API中的名词应该使用复数,github(api.github.com)
什么是RESTful?
RESTful是一种开发理念,REST是Roy Thomas Fileding在他博文提出的.REST特点;url简洁,将参数通过url传递到服务器,简单就是说URL定位资源,用HTTP动词描述操作.
RESTful架构:
- 每一个URL代表一种资源;
- 客户端和服务器之间,传递这种资源的某种表现层;
- 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
- URL节后不能含有动词
- 一般接口返回的是JSON和XML类型的,JSON一般用的多
- 定义接口统一,使用起来比较方便
RESTful设计方法:
API接口应该部署到专用的域名下,如果API不需要扩展,可以放到主域名下,API版本号放到URL中或者放到请求头信息中,路径就是表示API的具体网站,每个网站都有对应的资源,API中的名词应该使用复数,
常见的HTTP的动词
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
- DELETE(DELETE):从服务器删除资源。
不常用的HTTP动词
- PATCH(UPDATE):在服务器更新(更新)资源(客户端提供改变的属性)。
- HEAD:获取资源的元数据。
- OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
过滤信息
?limit=10:指定返回记录的数量 ?offset=10:指定返回记录的开始位置。 ?page=2&per_page=100:指定第几页,以及每页的记录数。 ?sortby=nameℴ=asc:指定返回结果按照哪个属性排序,以及 排序 顺序。 ?animal_type_id=1:指定筛选条件
常见的状态码
- 200 OK - [GET]:服务器成功返回用户请求的数据
- 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
- 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
- 204 NO CONTENT - [DELETE]:用户删除数据成功。
- 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作
- 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
- 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
- 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
- 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
- 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
- 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
- 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
返回处理
- GET /collection:返回资源对象的列表(数组)
- GET /collection/resource:返回单个资源对象
- POST /collection:返回新生成的资源对象
- PUT /collection/resource:返回完整的资源对象
- PATCH /collection/resource:返回完整的资源对象
- DELETE /collection/resource:返回一个空文档
超媒体(Hypermedia API)
github(api.github.com)
访问第一个
Django开发REST接口
一个简单的REST接口案例
# 路由
urlpatterns = [
url(r'^games/$', views.GamesAPIView.as_view()),
url(r'^games/(?P<id>\d+)/$', views.GameAPIView.as_view())
]
视图函数代码
class GamesAPIView(View):
"""
查询所有的游戏
"""
def get(self, request):
games = GameInfo.objects.all()
game_list = []
for game in games:
game_list.append({
'id': game.id,
'gtitle': game.gtitle,
'game_date': game.game_date,
'game_download': game.game_download,
'gcommnet': game.gcommnet,
'image': game.image.url if game.image else ''
})
# 要命令序列化就需要把safe设置成False
return JsonResponse(game_list, safe=False)
def post(self, request):
"""
新增游戏
:param request:
:return:
"""
body_data = request.body
data_str = body_data.decode()
game_dict = json.loads(data_str)
game = GameInfo.objects.create(
gtitle=game_dict['gtitle'],
game_date= game_dict['game_date'],
)
return JsonResponse({
'id': game.id,
'gtitle': game.gtitle,
'game_date': game.game_date,
'game_download': game.game_download,
'gcommnet': game.gcommnet,
'image': game.image.url if game.image else ''
}, status=201)
class GameAPIView(View):
def get(self, request, id):
"""
获取单个游戏的信息
:param request:
:param pk:
:return:
"""
try:
game = GameInfo.objects.get(id=id)
except GameInfo.DoesNotExist:
return HttpResponse(status=404)
print(game)
return JsonResponse({
'id': game.id,
'gtitle': game.gtitle,
'game_date': game.game_date,
'game_download': game.game_download,
'gcommnet': game.gcommnet,
'image': game.image.url if game.image else ''
})
def put(self, request, id):
"""
修改游戏信息
:param request:
:param pk:
:return:
"""
try:
game = GameInfo.objects.get(id=id)
except GameInfo.DoesNotExist:
return HttpResponse(status=404)
body_data = request.body
data_str = body_data.decode()
game_dict = json.loads(data_str)
game.gtitle = game_dict['gtitle']
game.game_date = game_dict['game_date']
game.save()
return JsonResponse({
'id': game.id,
'gtitle': game.gtitle,
'game_date': game.game_date,
'game_download': game.game_download,
'gcommnet': game.gcommnet,
'image': game.image.url if game.image else ''
})
def delete(self, request, pk):
"""
删除游戏
:param request:
:param pk:
:return:
"""
try:
game = GameInfo.objects.get(id=id)
except GameInfo.DoesNotExist:
return HttpResponse(status=404)
game.delete()
return HttpResponse(status=204)
查询所有数据
增加数据(post提交后面要加/)
获取单个数据
修改数据
删除数据
REST接口的核心
1.将数据转换成模型类的对象(将前端的数据,反序列化为模型类对象,保存到数据库中)
2.将模型类的对象转换为响应的数据
3.操作数据库(将数据库数据序列化为前端需要的格式)
序列化:
把将一种对象的状态信息装换成可以存储或者可以传输形式的过程,比如将模型类转换成JSON数据,整个过程将序列化(序列化和反序列化执行的过程相似的,也就是可以封装代码)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
编程珠玑(第2版•修订版)
[美] Jon Bentley 乔恩•本特利 / 黄倩、钱丽艳 / 人民邮电出版社 / 2014-12 / 39
历史上最伟大的计算机科学著作之一 融深邃思想、实战技术与趣味轶事于一炉的奇书 带你真正领略计算机科学之美 多年以来,当程序员们推选出最心爱的计算机图书时,《编程珠玑》总是位于前列。正如自然界里珍珠出自细沙对牡蛎的磨砺,计算机科学大师Jon Bentley以其独有的洞察力和创造力,从磨砺程序员的实际问题中凝结出一篇篇不朽的编程“珠玑”,成为世界计算机界名刊《ACM通讯》历史上最受欢......一起来看看 《编程珠玑(第2版•修订版)》 这本书的介绍吧!
RGB转16进制工具
RGB HEX 互转工具
SHA 加密
SHA 加密工具