博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RESTful API
阅读量:6871 次
发布时间:2019-06-26

本文共 5034 字,大约阅读时间需要 16 分钟。

什么是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)  # 
print(self.request) #
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,Addfrom rest_framework import serializersfrom  rest_framework.validators import ValidationErrorclass 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)

 

 

 

转载于:https://www.cnblogs.com/zhaoyunlong/p/9403423.html

你可能感兴趣的文章
HTML5之本地存储SessionStorage
查看>>
c语言学习之基础知识点介绍(三):scanf函数
查看>>
python lambda
查看>>
ubuntu配置caffe的python接口pycaffe
查看>>
C#--笔记
查看>>
[题集]一些有趣的问题
查看>>
[HNOI2010]城市建设
查看>>
系统设计 样题
查看>>
Paint House II
查看>>
[转]进程与线程的一个简单解释
查看>>
测试评审清单
查看>>
算法笔记--匈牙利算法
查看>>
字节流数据的写出(输出)和读取(输入)
查看>>
9月28日学习内容整理:多进程,并发,子进程的创建(multiprocessing模块)
查看>>
3月8日学习内容整理:restframework的视图组件
查看>>
《结对-贪吃蛇游戏-开发环境搭建过程》
查看>>
OO第四阶段总结
查看>>
c#装箱与拆箱
查看>>
列式数据库~clickhouse日常管理
查看>>
Android richtext
查看>>