RESTful API

什么是RESTful 

REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。

 

其实也就是一种协议  因为早期公司内部流动性比较大,有很多人员的流动  最开始没有规范 造成了它的代码 接手的人读起来 很费劲,所以 慢慢的有了这个规范来让大家的代码尽量同意起来 便于观看  有很大可观性

 

RESTful API设计

API与用户的通信协议

 

下面是很普遍的规范:

 

域名 

https://api.example.com                         尽量将API部署在专用域名

https://example.org/api/                        API很简单

版本

1.  将版本信息放在URL中,如:https://api.example.com/v1/

2. 将版本信息放在请求头中。

路径

视网络上任何东西都是资源,均使用名词表示(可复数)

https://api.example.com/v1/zoos

https://api.example.com/v1/animals

https://api.example.com/v1/employees

method

GET      :从服务器取出资源(一项或多项)

POST    :在服务器新建一个资源

PUT      :在服务器更新资源(客户端提供改变后的完整资源)

PATCH  :在服务器更新资源(客户端提供改变的属性)

DELETE :从服务器删除资源

 

 

RESTful风格API介绍  RESTful这个时候需要用APIvew来使用

APIvew:

 

APIView其实就是继承了view但是又给view封装了一些  内容

 

我们使用APIVew的时候需要先导入:

from rest_framework.views import APIView

 

 

 

在settings中国导入rest_fromework 然后你的界面在浏览器显示的会更加美观

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
    'rest_framework'
]

 

 

APIVew会把我们的request给封装成 self.request._request这样我们的取值的部位也就是改变了  

 

我们的request会变成rest framework封装好的request

 

  def post(self,request):

        print(request)  # <rest_framework.request.Request object at 0x00000247667607F0>
        print(self.request)    #<rest_framework.request.Request object at 0x00000247667607F0>
        print(self.request._request.POST.get('age'))  # 18   我们用postman发送的就是age 18所以获取到了   

 

 

 

当你用CBV的时候你继承了APIVew然后你的信息这个时候被reset framework给封装成从self.request.data中取值了

 

APIView把我们原本的request给封装成  self.request._request 了    而我们内容处理 的值 也是在内部被封装成data内部了

 

 校验字段:

我们可以再APIView中定义我们的序列化和字段进行对比的错误信息

其实就和我们的form组件一样的使用

做校验的时候你需要把你的值传递给data然后给校验类
rom first .models import Article,Tag,Comment,Add
from rest_framework import serializers

from  rest_framework.validators import ValidationError


class Commentserializer(serializers.ModelSerializer):

    # 用于做校验的钩子 类似与你的from的钩子

    def validate_content(self, value):   #其中的validata是必须写的  不变的
        if '' in value:
            # return '您输入的不是正常交际用语'  这个只是把这个函数结束
            
            raise ValidationError('您输入的不是正常交集用语')   # 把这个错误抛出去 并且把这个界面结束

        else:
            return value


    class Meta:
        model = Comment
        fields = "__all__"

        #depth = 1 # 这个如果使用的话你前端输入的必须要把关联的也要输入 不然 就会报错
        extra_kwargs = {  # extra_kwargs = {}  设置额外的错误信息
            "content":{
                "error_messages":{
                    "required":"内部不能为空"
                }
            },
            "article":{
                "error_messages":{
                    "required":"文章不能为空"
                }
            }

        }

 

validate_是你的钩子  后面加上你的字段 
如果只是用validate就是一个全局钩子


views:
class Comment(APIView):

    def post(self,request):
        ret = {'code':0}
        print(self.request.data)
        comment_data = self.request.data   # 取到你的数据
        ser_obj = first_serializer.Commentserializer(data = comment_data)
        if ser_obj.is_valid():
            # 这个就是正确表示  没有问题

            ser_obj.save()
        else:
            # 数据有问题
            ret['code'] = 1
            ret['error'] = ser_obj.errors

        return JsonResponse(ret)
Views

 

钩子的定义:

class Commentserializer(serializers.ModelSerializer):
    def validate_content(self,value):   # 对你的Comment这个表中的contne进行错误信息设置
        print(1111111111111)
        print(value)
        if '' in value:
            # return ValidationError('您输入的不是正常交际用语')
            # return '您输入的不合法'
            raise   ValidationError('您输入的不合法')
        else:
            return value

    class Meta:
        model = Comment
        fields = "__all__"

        extra_kwargs = {
            # 额外的错误信息
            "content":{   # content是你的 Comment表中的字段
                "error_messages":{    # error_messages 是你的 错误的信息的提示
                    "required":"内容不能为空"    # required是固定格式
                }
            },
            "article":{
                "error_messages":{
                    "required":"文章不能为空"

                }
            }
        }
钩子

 

 

 

 

生成一个软连接

文章超链接序列化

 

class ArticleHyperLinkedSerializer(serializers.HyperlinkedModelSerializer):
    add = serializers.HyperlinkedIdentityField(view_name = 'add_detail', lookup_url_kwarg = 'id')   #这个是view_name是指向你要跳转的别名 lookup_url_kwarg  是接收你的要跳转的那个连接之后的参数
    class Meta:
        model = Article
        fields = ['id','title','type','add']
# 对地址序列化

class Addserializer(serializers.ModelSerializer):
    class Meta:
        model = Add
        fields = "__all__"

 

 

views:

class ArticlecleDetail(APIView):
    def get(self,request,pk):
        ret = {'code':0}
        article_obj = Article.objects.filter(pk = pk).first()
        ser_obj = first_serializer.ArticleHyperLinkedSerializer(article_obj,context={'request':request})
        ret['data'] = ser_obj.data

        return JsonResponse(ret)

class AddDetail(APIView):
    def get(self,request,id):
        ret = {'code':0}

        add_obj = Add.objects.filter(pk = id).first()
        ser_obj = first_serializer.Addserializer(add_obj,context = {'request':request})  # contentext = {} 是把你的 content给补全

        ret ['data'] = ser_obj.data  # 把所有的信息给返回出去
        return JsonResponse(ret)

 






 

posted @ 2018-08-01 19:13  可爱的红领巾  阅读(146)  评论(0编辑  收藏  举报