1.简介

什么是resful

resful是一个规范,说白了就是面向资源编程,把网络中所有的东西,想象成资源

2.规范

10条规范

1)API与用户的通信协议,总是用HTTPS协议:HTTPS比http安全

2)域名

https://api.example.com  尽量将API部署在专用域名(会存在跨域问题)https://example.org/api/  API很简单例如写一个查询所有图书的api接口:https://api.example.com/books                        https://127.0.0.1/api/books

3)版本

-版本:每个接口都应该有版本   URL,如:https://api.example.com/v1/    https://127.0.0.1/api/v2/books(推荐用这种)   请求头 跨域时,引发发送多次请求

4)路径

-路径,视网络上任何东西都是资源,均使用名词表示(可复数)   https://api.example.com/v1/books   https://api.example.com/v1/animals   https://api.example.com/v1/employees   不能这么写:      -获取所有图书:https://127.0.0.1/api/get_all_books      -新增一本书:https://127.0.0.1/api/add_book   同一都用这个:   https://api.example.com/v1/books

5)method

-method   GET      :从服务器取出资源(一项或多项)   POST    :在服务器新建一个资源   PUT      :在服务器更新资源(客户端提供改变后的完整资源)   PATCH  :在服务器更新资源(客户端提供改变的属性)   DELETE :从服务器删除资源谈到请求方法,这里需要提到一下幂等性幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品使用支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条。这里简单介绍一下__getattr__:如果属性查找在实例以及对应的勒种失败,那么会调用到类的__getattr__函数,如果没有定义这个函数,那么会抛出异常。可以把__getattr__的作用理解为属性查找的最后一步,兜底。与__getattr__相对应的,还有个__setattr__,对象在属性赋值时,会执行这个函数
class Student:
    name = 'lqz'

    def __init__(self, age):
        self.age = age

    def __getattr__(self, item):
        return '你煞笔啊,没有这个属性'

    def __setattr__(self, key, value):
        print('setattr方法')
        self.__dict__[key] = value

    def __getitem__(self, item):
        print('getitem方法')
        return self.__dict__[item]

    def __setitem__(self, key, value):
        print('setitem方法')
        self.__dict__[key] = value

#setattr,赋值时会进行调用
#getattr,取不到对象的attr时会调用
#__getitem__ 对象A,取值A['name’]会调用
#__setitem__ 对象A设定值A['male’]会调用

A = Student(18)
A.num = '#调用__setattr__方法
print(A.num)
print(A['num'])#调用__getitem__方法
A['sex']='MALE'#调用__setitem__方法
print(A['sex'])
print(A.haha)#调用__getattr__方法

6)过滤

-过滤,通过在url上传参的形式传递搜索条件   https://api.example.com/v1/zoos?limit=10:指定返回记录的数量

7)状态码

请求回去,需要有状态码自定义状态码status: 100表示成功      101表示用户名密码错误      102我也不知道什么错误

8)错误处理

-错误处理,应返回错误信息,error当做key。   -{status:100,error:'错误信息写上'}

9)返回结果

-返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。   GET /books:返回资源对象的列表(数组)   GET /books/1:返回单个资源对象   POST /books:返回新生成的资源对象    -新增,传数据,一旦新增完成,把新的资源对象返回   PUT /books/1:返回完整的资源对象   PATCH /books/1:返回完整的资源对象   DELETE /books/1:返回一个空文档

10)Hypermedia API,resful API最好做到Hypermedia,即返回结果中提供链接,连向其他API

-Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API             方法,使得用户不查文档,也知道下一步应该做什么。      {         status:100         msg:成功         url:127.0.0.1/books/1      }   核心:返回结果中提供链接3.drf(django rest framework)框架(django的app)安装:djangorestframework它是一个app,要在咱的项目中用只是快速的构建resful规范的接口drf下request把原来的request包装进去了request.query_params这个是原来GET中的数据request.data是发方法,包装成了属性,前台传过来的body体重的数据,放在里面
from django.shortcuts import render,HttpResponse,redirect,reverse
from rest_framework.views import APIView
from app01 import models
from django.views import View
from django.http import JsonResponse

# Create your views here.

#写resful规范的接口,用fbv和cbv都可以

#这里使用rest_framework,是为了快速构建restful规范,即使不使用rest_framework,也是可以写的,只是麻烦一些

#不使用rest_framework版本
# class Books(View):
#     #获取所有图书
#     def get(self,request):
#         response={'status':100,'data':None}
#         books=models.Book.objects.all()
#         ll=[{'name':book.name,'price':book.price} for book in books]
#         response['data']=ll
#         return JsonResponse(response,safe=False)
#     def put(self,request,pk):
#         response={'status':100,'msg':'修改成功'}
#         #注意,django只处理了get和put,也就是只有这两个方法request.POST,request.GET能get到值
#         # name=request.POST.get('name')
#         # price=request.POST.get('price')
#         #这里无法get,所以直接去body体里去取
#
#         import json
#         data=json.loads(request.body.decode('utf-8'))
#         name=data.get('name')#相当于name=data['name'],不这么写只是我自己个人理解,防止万一没有值,程序崩溃
#         price=data.get('price')
#         ret=models.Book.objects.filter(pk=pk).update(name=name,price=price)
#         #按照resful规范这里需要返回一个改变后的完整的资源,但是resful是一个规范,是建议
#         #可以不按它的建议来,自己定义返回的结果
#         return JsonResponse(response,safe=False)

#使用restful的APIView类
class Books(APIView):
    #request.data是个方法,包装成了属性,前台传过来body体中的数据,放在里面
    #request.query_params 这个是原来GET中的数据

    #现在的request对象,已经不是原来django中的request对象了,它是rest_framework.request下的Request
    def put(self,request,pk):
        response={'status':100,'msg':'修改成功'}
        #以后再取数据,直接从request.data中取
        #前端传来json格式:
        #前端传来格式x-www-form-urlencoded格式:传来结果是<QueryDict: {'name': ['金瓶'], 'price': ['250']}>,type是<class 'django.http.request.QueryDict'>
        #这里应该是rest_framework内部进行了一些处理,将其转化了格式
        #前端传来格式json格式,传来结果是{'name': 'alex', 'price': '250'},type是<class 'dict'>
        #request.data不同编码格式过来,它可能是不同类的对象,但是用法都是一样的,可以用get
        print(request.data)
        print(type(request.data))
        return JsonResponse(response)

4.序列化django提供的序列化组件(不可控)
from django.core import serializers
    def get(self,request):
        response={'status':100,'data':None}
        books=models.Book.objects.all()
        #
        ret=serializers.serialize('json',books)
        print(ret)
        response['data']=ret
        return JsonResponse(response,safe=False)

drf提供的序列化组件

#drf序列化组件的使用
#1.导入drf的序列化类
from rest_framework.serializers import Serializer
from rest_framework import serializers
#2.写一个类继承它
class BookSerializer(Serializer):
    name=serializers.CharField()
    price=serializers.CharField()
    def get(self,request):
        books=models.Book.objects.all()
        # 第三步,实例化产生对象
        #instance=books是要序列化的queryset对象,many=True表示序列化多条
        #instance可以不写,按位置传.many=True一定要传
        # ser=BookSerializer(instance=books,many=True)
        ser=BookSerializer(books,many=True)
        #只序列化一个book对象的话,book也可以是单个对象,不是queryset对象
        # book=models.Book.objects.all().first()
        # ser=BookSerializer(book,many=False)
        #注意加上safa=False,拿到的是序列化之后的字典,里面有可能套了列表
        return JsonResponse(ser.data,safe=False)

5.规范使用序列化

在app中创建一个py文件,例如mySer.py

from rest_framework import serializers
from rest_framework.serializers import Serializer
from app01 import models

class AuthorSerializer(Serializer):
    name=serializers.CharField()
    sex=serializers.CharField()

class BookSerializer(Serializer):#BookSerializer这里在定义阶段,就要想好关联哪个表序列化哪些对象。
    #进到这个表里,将当做自己已经拿到了book对象,想要取哪个字段,直接在source里取
    #将对象返回实例化时,如果要修改字段名,可以在前面修改,后面再写上source='name',表示关联的字段
    xxx=serializers.CharField(source='name')
    #不指定字段名的话,这里前面的名字必须和models表里的字段名一样
    price=serializers.CharField()

    #这里publish在models里面是做了外键关联的,在Book表里存的是对象。所以这里返回的是Publish object。
    #如果要它返回出版社名字,方式一:可以在models下Publish表里自己定义str方法
    # publish=serializers.CharField()
    #方式二:
    # publish=serializers.CharField(source='publish.name')
    #Publish下的test函数也能被查出来,显示的是函数的执行结果,没什么卵用.
    test=serializers.CharField(source='publish.test')
    #SerializerMethodField可以指定一个方法
    #方法名:叫get_字段名,要传参数,参数是:当前的book对象
    publish=serializers.SerializerMethodField()
    def get_publish(self,obj):
        #obj是当前的book对象
        dic={'name':obj.publish.name,'email':obj.publish.email,'addr':obj.publish.addr}
        return dic
    #取这本书的所有作者
    #这样显示的是queryset对象,不太好,弃用
    # author=serializers.CharField(source='authors.all')

    authors=serializers.SerializerMethodField()
    def get_authors(self,book):
        aus=book.authors.all()
        #可以继续用序列化类,来处理
        auth_ser=AuthorSerializer(aus,many=True)
        return auth_ser.data

其中有个ModelSerlializer

from app01.models import Book
class BookSerializer(serializers.ModelSerializer):
    #必须写一个内部类,名字叫sMeta
    class Meta:
        model=Book#指定表
        fields='__all__'#指定字段
        #指定深度,可以理解为指定跨几张表。不推荐使用,特别影响效率,可控性查
        # depth=1
        #exclude=['publish']排除掉哪个字段
        #fields跟exclude不能连用
    #这时查到的一些关联外键的字段是数字,可以重写属性
    publish=serializers.CharField(source='publish.name')
    authors=serializers.SerializerMethodField()
    def get_authors(self,book):
        aus=book.authors.all()
        auth_ser=AuthorSerializer(aus,many=True)
        return auth_ser.data
												

resful规范的更多相关文章

  1. cvb源码分析,resful规范,drf,drf序列化组件,95

    1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ...

  2. Django drf:cbv源码、resful规范及接口、drf使用、response源码、序列化

    一.cbv源码分析 二.resful规范 三.django中写resful的借口 四.drf写resful的借口 五.APIVIew源码分析 六.drf之序列化 一.cbv源码分析 -CBV和FBV ...

  3. resful规范: 进行数据交换时的代码潜规则

    目前主流的三种web服务交互方案: REST (Representational State Transfer) 表征性状态转移 SOAP (Simple Object Access Protocol ...

  4. $Django RESTful规范

    一 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度 ...

  5. cbv+resful+APIView源码分析

    CBV源码分析 1概念:什么是cbv和fbv 已经什么是API class bass View ---基于类的视图 function bass View ---基于函数的视图 API(Applicat ...

  6. restful规范和drf模块

    restfu1规范 它是一个规范,面向资源架构 10条规范: 1.api与用户的通信协议,总是使用https协议 api网上提供的接口 2.域名: 尽量将api部署在专用域名(会存在跨域问题) API ...

  7. Django框架(十七)-- CBV源码分析、restful规范、restframework框架

    一.CBV源码分析 1.url层的使用CBV from app01 import views url(r'book/',views.Book.as_view) 2.as_view方法 as_view是 ...

  8. Django框架(十八)—— CBV源码分析、restful规范、restframework框架

    目录 CBV源码分析.restful规范.restframework框架 一.CBV源码分析 1.url层的使用CBV 2.as_view方法 3.view方法 4.dispatch方法(可以在视图层 ...

  9. Python-Django-Djangorestframwork

    1 CBV源码分析(cbv和fbv) 1 在views中写一个类,继承View,里面写get方法,post方法 2 在路由中配置: url(r'^test/', views.Test.as_view( ...

随机推荐

  1. Go语言学习笔记1

    1.Go语言环境搭建及基础知识 Go语言官方网站(http://golang.org) 代码包文档网站(http://godoc.org) Go语言中文网(http://studygolang.com ...

  2. 【CF717G】Underfail 费用流

    [CF717G]Underfail 题意:赌城拉斯维起司的赌场最近推出了一种新式赌法.它的玩法是由庄家(Joker)设局,赌徒只需要交付一定数额的赌资即可入局.具体地,Joker将给出一个长度为 $n ...

  3. springboot之thymeleaf学习

    这是springboot的view层不建议使用jsp,而是thymeleaf,虽然我也不知道为什么,但是后来可能会明白一些.学springBoot也遇到很多bug,导致脱累了进度.有点类似于jsp,但 ...

  4. day_5.04py

    Pycharm默认不依赖系统环境下安装的requests 打开 File->Settings->Project:你的Project名 点击“+”号 搜索requests并安装 长见识了 # ...

  5. D - Lake Counting

    Due to recent rains, water has pooled in various places in Farmer John's field, which is represented ...

  6. ngxs 状态管理器

    官网文档 ng6,rxjs6.0.0,ngxs3.0.1 λ ng new ngxs --style=styl --routing --skip-install λ cd ngxs λ yarn λ ...

  7. EF中的预先加载和延迟加载

    延迟加载(Lazy Loading):当实体第一次被读取时,相关数据不会被获取,只会读取本身.延迟加载的数据不会一次性查出来,而是一条一条的查询,这样就会多次请求数据库进行查询. 预先加载<Ea ...

  8. 关于SQL SERVER中的FLOAT转换为VARCHAR

    关于SQL SERVER中的FLOAT转换为VARCHAR 一个FLOAT型的字段,要转换为VARCHAR,可是小数点后面的都自动被删去了...后查得可以通过如下转换获得: SELECT CAST(C ...

  9. SpringMVC中@RestController的用法

    转自:https://blog.csdn.net/u010412719/article/details/69710480 Spring4之后新加入的注解,原来返回json需要@ResponseBody ...

  10. 网卡配置文件详解 用户管理与文件权限篇 文件与目录权限 软连接 tar解压命令 killall命令 linux防火墙 dns解析设置 计划任务crond服务 软件包安装 阿里云 yum源 安装

    Linux系统基础优化及常用命令 Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ...