zoukankan      html  css  js  c++  java
  • RESTframework简介

     

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

     

     

     

  • 相关阅读:
    java内存回收机制
    scala学习
    [java实现]找一个数组的最大和的连续子数组(时间复杂度 O(n))
    linux 进程的创建
    linux中的进程和线程
    linux 文件系统
    gdb 调试程序
    makefile
    linux下的gcc编译器
    socket 网络编程
  • 原文地址:https://www.cnblogs.com/gaidy/p/9260605.html
Copyright © 2011-2022 走看看