什么是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&order=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数据,整个过程将序列化(序列化和反序列化执行的过程相似的,也就是可以封装代码)

 

RESTframework简介的更多相关文章

  1. REST-framework快速构建API--分页

    分页简介 当数据量特别大的时候,我们通过API获取数据会非常慢,所以此时我们需要将数据"分批次"取出来,这里的"分批次"就是,分页! REST框架支持自定义分页 ...

  2. rest-framework之频率控制

    rest-framework之频率控制 本文目录 一 频率简介 二 自定义频率类,自定义频率规则 三 内置频率类及局部使用 四 内置频率类及全局使用 五 源码分析 回到目录 一 频率简介 为了控制用户 ...

  3. Restframework介绍

    1.REST介绍 REST与技术无关,它代表的是一种软件架构风格,全称Representational State Transfer,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它 ...

  4. REST-framework之频率组件

    REST-framework之频率控制 一 频率简介 为了控制用户对某个url请求的频率,比如,一分钟以内,只能访问三次 二 自定义频率类,自定义频率规则 自定义的逻辑 ""&qu ...

  5. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  6. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  7. Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...

  8. REST简介

    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...

  9. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

随机推荐

  1. Android面试题(3)

    1.  请描述下Activity的生命周期. activity的生命周期方法有: onCreate().onStart().onReStart().onResume().onPause().onSto ...

  2. 利用jquery操作隐藏table某一列

    本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. //隐藏表格第一列 $('tr').find('th:eq(0)').hide(); $('tr').f ...

  3. tls1.2 rfc5246

    注:本文省略了部分开发协议才涉及到的内容,如字段类型的定义以及字段长度的运算,主要聚焦理解tls协议的运作方式,用于问题定位 tls协议包含2层协议:TLS Record 协议和TLS Handsha ...

  4. jobss目录结构

    一. JBoss的目录结构       bin:包含各种脚本文件以及相关文件,比如run.bat和shutdown.bat批处理文件.        client:存储配置信息和可能被Java客户端应 ...

  5. Badge

    The following plugin provides functionality available through Pipeline-compatible steps. Read more a ...

  6. Mysql 存储过程实例详解

    存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,存储和和函数的区别在于函数必须有返回值,而存储过程没有,存储过程的参数可以使用IN.OUT.INOUT类型,而函数的参数只能是IN类 ...

  7. Tomcat报failed to parse the expression [${xxx}]异常(javax.el.ELException)的解决方法

    Tomcat 7 'javax.el.ELException' 的解决方式tomcat 7对EL表达式的语法要求比较严格,例如"${owner.new}"因包含关键字new就会导致 ...

  8. Java集合之LinkedList源码分析

    概述 LinkedLIst和ArrayLIst一样, 都实现了List接口, 但其内部的数据结构不同, LinkedList是基于链表实现的(从名字也能看出来), 随机访问效率要比ArrayList差 ...

  9. 一张图弄懂opengl的诸多库gl glu glut freeglut glew glfw之间关系

    开始学习opengl,但是看opengl编程指南不同版本之间使用了一堆不同的库,概念名称全都搅起的,越看越糊涂,遂整理的一下opengl相关的一些库的名词, 才发现是不同时期不同版本不断发展的结果. ...

  10. "美女相册"的 js 实现代码

    划重点拉!  先来解释一下子标题 这个所谓的美女相册呢  并不是和你们想的一样龌龊 当然了 好像看起来也很龌龊 但是很多的版面都能用到这个功能的 然后在此处  我要为我的my$函数来进行一个诠释 就是 ...