什么是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. ubuntu 增加一个用户 并赋予权限

    一.添加一个用户 sudo adduser tommy  //添加一个tommyd的用户 sudo passwd tommy // 修改密码 回车后出现一下提示 输入密码即可Changing pass ...

  2. maven多环境参数配置

    maven中properties加载顺序 <build><filters></filters></build>中的配置 pom.xml中的<pro ...

  3. TCP/IP 笔记 - 防火墙和网络地址转换

    防火墙是位于内部网和外部网之间的屏障,是系统的第一套防线,作用是防止非法用户的进入. 网络地址转换是一种IP数据包通过路由器或防火墙时通过重写来源IP地址或目的地址的技术,可以用来隐藏或保护内部网络, ...

  4. ETCD&Flannel安装

    .ETCD 安装: nohup etcd --name etcd0 \ --advertise-client-urls http://172.31.24.246:2379,http://127.0.0 ...

  5. linux搭建sftp服务器

    转自:http://blog.csdn.net/superswordsman/article/details/49331539 最近工作需要用到sftp服务器,被网上各种方法尤其是权限设置问题搞得晕头 ...

  6. vue里碰到 $refs 的问题

    记录困惑自己一个简单的问题...(瞬间感觉官方文档的强大) 在自己做的一个项目中,遇到一个列表页,根据id能进入详情页(动态匹配路由),详情页是单独的一个组件,在这个详情的组件里,我想获取内容给你区域 ...

  7. Redis缓存使用技巧

    缓存能够有效加速应用的访问速度,同时可以降低后端负载,在应用架构中起着至关重要的作用,本文主要介绍缓存使用的一些技巧. 缓存更新策略 LRU/LFU/FIFO算法剔除 场景:数据一致性要求较低 原理: ...

  8. xshell与xftp使用注意

    1.xshell报ssh服务器拒绝了密码,请再试一次 xshell登录使用的用户名不能是root,要是服务器的用户名,否则连接时会报 ssh服务器拒绝了密码,请再试一次.将root改成服务器用户名即可 ...

  9. MySQL常用的备份方式与备份工具简介

    一.MySQL备份方式与备份类型 1.备份的必要性 再生产环境中,为了防止硬件故障.软件故障.自然灾害.误操作等各种原因导致的数据库数据丢失后能恢复到事故之前的状态,我们需要对数据库进行备份和恢复操作 ...

  10. 如何在framegroup各个frame和window之间共享数据

    可以尝试使用execScript,在指定window或者frame中执行脚本,对于frameGroup里面的frame也有效,若name和frameName都未指定,则在当前window中执行脚本,具 ...