zoukankan      html  css  js  c++  java
  • 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)





  • 相关阅读:
    jquery的get方式发送AJAX请求
    原生JS发送AJAX请求
    正则表达式(二)
    正则表达式(一)
    旅游攻略-北京三日游攻略(已实践)
    边旅游边赚钱的噱头,这是一种传销!
    hdu 1106 排序(水题)
    hdu 1258 Sum It Up(dfs+去重)
    hdu 1455 Sticks(dfs+剪枝)
    解决“LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”问题
  • 原文地址:https://www.cnblogs.com/zhaoyunlong/p/9403423.html
Copyright © 2011-2022 走看看