AI-restful接口写法

restful接口规范

http协议请求方式:GET POST DELETE PUT PATCH OPTION HEAD
设计接口时必须使用这种格式的数据
GET 查看数据 book/1 ----->查看单条数据 {}
GET 查看数据 books-------->返回数据列表 [{},{},{}]
POST 提交数据添加到数据库 --------->返回添加数据 {}
PUT 更新 pk=1的数据 ------>返回更新后的数据 {}
PATCH 更新所有的数据
OPTION
HEAD 返回请求方式 比如 GET POST等

不使用DRF,来写接口

对于我们后台人员,写好接口把数据传给前端就okay了!

#url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^course/', views.Courseview.as_view()),
]
#views.py
from django.shortcuts import render,HttpResponse
from django.views import View
# Create your views here.
from app01.models import *
import json
class Courseview(View):
def get(self,request):
ret=[] #get的接收方式为[{},{},{}]
course_list = Course.objects.all()
for course in course_list:
ret.append([
{"course_name": course.title},
{"course_desc":course.desc},
])
return HttpResponse(json.dumps(ret,ensure_ascii=False))
     #也可以不使用json格式,效果一样,如下:
     #return HttpResponse(ret)
#mdoels.py
from django.db import models # Create your models here.
class Course(models.Model):
title=models.CharField(max_length=32)
desc=models.CharField(max_length=32)

前端接收:

[[{"course_name": "羊肚儿"}, {"course_desc": "煮10秒钟,贼香"}], [{"course_name": "宽粉"}, {"course_desc": "两盘儿,配上我妈给我调的料"}]]

DRF

  (1) APIView  (*****)
(2) 序列化组件(*****)
(3) 视图类(mixin)(*****)
(4) 认证组件
(5) 权限组件
(6) 频率组件
(7) 分页组件
(8) 解析器组件(*****)
(9) 响应器组件
(10) url控制器

使用DRF,做数据接口--APIView(*****)

#views.py
from django.shortcuts import render,HttpResponse
from django.views import View
from rest_framework.views import APIView
# Create your views here.
from app01.models import *
import json class Courseview(APIView):
def get(self,request):
ret=[]
course_list = Course.objects.all()
for course in course_list:
ret.append([
{"course_name": course.title},
{"course_desc":course.desc},
])
return HttpResponse(json.dumps(ret,ensure_ascii=False))

APIView源码解析

相比于View类,增加了“重装request方法”,“认证、权限、频率”等,本质功能还是做分发!!

下边代码可以不看,知道View源码即可,只是在View的dispatch方法里增加了认证、权限、频率等组件而已!

#1.开始

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^course/', views.Courseview.as_view()),
] #2.在Courseview的父类APIView中找as_view方法
class APIView(View):
schema = DefaultSchema() @classmethod
def as_view(cls, **initkwargs):     #在APIView父类中找as_view方法
view = super(APIView, cls).as_view(**initkwargs)
view.cls = cls
view.initkwargs = initkwargs #3.在APIView父类中找as_view方法
class View(object): http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] @classonlymethod
def as_view(cls, **initkwargs): def view(request, *args, **kwargs):
self = cls(**initkwargs) #self即Courseview实例化对象
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs) 在Courseview中找dispatch方法
view.view_class = cls return view 返回了view,当收到请求时,执行view()方法 #4.在Courseview中找dispatch方法,没有就在父类中找class Courseview(APIView):
def get(self,request):
ret=[]
course_list = Course.objects.all()
for course in course_list:
ret.append([
{"course_name": course.title},
{"course_desc":course.desc},
])
return HttpResponse(json.dumps(ret,ensure_ascii=False)) #5.APIView中的dispatch方法
def dispatch(self, request, *args, **kwargs):
self.args = args
self.kwargs = kwargs
    #重装一个新的request对象
request = self.initialize_request(request, *args, **kwargs)
self.request = request
self.headers = self.default_response_headers # deprecate? try:
       #认证
self.initial(request, *args, **kwargs) # Get the appropriate handler method
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed response = handler(request, *args, **kwargs) except Exception as exc:
response = self.handle_exception(exc) self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response

解析器组件(*****)

本质:基于http协议的数据编码格式

解析器中,两种数据编码格式:

  a,urlencoded

  b,json

  这两种数据编码格式的区别在于:  
    urlencoded格式的数据,django会默认解析成{xx:oo,xx:ooo}格式;而json格式,django不会解析成固定格式,得自己解析

a.urlencoding

#url.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.Loginview.as_view()),
]
#views.py
from django.shortcuts import render,HttpResponse
from django.views import View
# Create your views here.
class Loginview(View):
def get(self,request):
return render(request,"login.html") def post(self,request):
print(request.body) #请求体重的原生数据
     #b'csrfmiddlewaretoken=eZ95jvkSlvVeB9lTkK85EYvgID5iMu171WyV421cEXVGXsxmj6BlCRxzLfKQf6zJ&user=zhang&pwd=111'
print(request.post) #djanog会默认解析urlencoded格式的数据
     #<QueryDict: {'csrfmiddlewaretoken': ['eZ95jvkSlvVeB9lTkK85EYvgID5iMu171WyV421cEXVGXsxmj6BlCRxzLfKQf6zJ'], 'user': ['zhang'], 'pwd': ['111']}>
return HttpResponse("ddd")
{## login.html#}
<form action="" method="post" enctype="application/x-www-form-urlencoded"> #默认解析格式为application/urlencoded
{% csrf_token %}
用户名:<input type="text" name="user">
密码:<input type="password" name="pwd">
<button type="submit">提交</button>
</form>
提交用户信息后
页面-检查-内容

#Request.HEADER
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh,zh-CN;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 105
Content-Type: application/x-www-form-
urlencoded 数据编码格式
Cookie: csrftoken=WyCTGzykwCoTLvAm7XBwGbxPLIXPwOpS5WwxOUrXqAbfeWsSwmi8gTXOZ85ctcvm
Host: 127.0.0.1:8011
Origin: http://127.0.0.1:8011
Pragma: no-cache
Referer: http://127.0.0.1:8011/login/
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Mobile Safari/537.36 #Form Data 接收到的数据格式是“application/x-www-form-urlencoded” ,格式为:使用“&”符号,将信息连接起来
csrfmiddlewaretoken=nFrqVKA7F5p8iJCGkcfqI5wE0O9KipzZw3l435tKz3cuLaucJBW2iNWDeeh7fNFt&user=dudu&pwd=12332 #View Parsered django将接收到的格式转化为?????格式 格式为xxx:ooo
csrfmiddlewaretoken: nFrqVKA7F5p8iJCGkcfqI5wE0O9KipzZw3l435tKz3cuLaucJBW2iNWDeeh7fNFt
user: dudu
pwd: 123321

b.json

#login.html

<button class="btn">Ajax</button>
<script>
$(".btn").click(function () {
$.ajax({
url:"",
type:"post",
contentType:"json",
data:JSON.stringify({
user:"dudu",
pwd:""
}),
success:function (data) {
console.log(data)
}
})
})
</script>
#views.py

from django.shortcuts import render,HttpResponse
from django.views import View
# Create your views here.
class Loginview(View):
def get(self,request):
return render(request,"login.html") def post(self,request): import json
print(request.body) # 请求体中的原生数据
     #b'{"user":"dudu","pwd":"555"}'
print(request.POST) #django默认不会对你的数据进行解析
     #<QueryDict: {}>
    
# import json
print(json.loads(request.body.decode("utf8"))) #自己解析数据
     #{'user': 'dudu', 'pwd': '555'}
print(json.loads(request.body.decode("utf8"))["user"]) print(type(request))
from django.core.handlers.wsgi import WSGIRequest return HttpResponse("POST")

DRF编码格式

from django.shortcuts import render,HttpResponse
from django.views import View
from rest_framework.views import APIView
# Create your views here.
from app01.models import *
import json class Courseview(APIView): #从APIViewrest_framework.views中导入
def get(self,request):
ret=[]
course_list = Course.objects.all()
for course in course_list:
ret.append([
{"course_name": course.title},
{"course_desc":course.desc},
])
return HttpResponse(json.dumps(ret,ensure_ascii=False)) def post(self,request):
print(request.data) #这个request是APIView中重新建立的request,
                 #相比于View的request,多了一个request.data方法
                 #这个“新的”request.data方法,可以解码所有的数据格式,都是DRF的功劳!!
return HttpResponse("POST")

a.当使用postman发送POST请求,使用json发送数据,发送的数据格式必须是json格式

前端在post方法中,打印request.data,得到结果

{'name': 'alex', 'age': 45}

b.当使用postman发送POST请求,使用url-encoded发送数据

前端在post方法中,打印request.data,得到结果

<QueryDict: {'alex': [''], 'dudu': ['']}>

AI-restful接口写法的更多相关文章

  1. SpringBoot Restful 接口实现

    目录 SpringBoot 核心注解 SpringBoot Restful 接口实现 封装响应数据 SpringBoot 核心注解 SpringBoot 基础入门 注解 说明 Component 声明 ...

  2. RESTful 接口调试分享利器 restc

    这个工具来自于https://elemefe.github.io/restc/  这里对Abp进行了一次封装 1.在项目中添加nuget包 Abp.Web.Api.Restc 2.在项目Abp模块的D ...

  3. RESTful接口设计原则/最佳实践(学习笔记)

    RESTful接口设计原则/最佳实践(学习笔记) 原文地址:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api 1 ...

  4. Swagger+Spring mvc生成Restful接口文档

    简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集 ...

  5. [转]简单识别 RESTful 接口

         本文描述了识别一个接口是否真的是 RESTful 接口的基本方法.符合 REST 架构风格的接口,称为 RESTful 接口.本文不打算从架构风格的推导方面描述,而是从 HTTP 标准的方面 ...

  6. 底层restful接口修改分析

    记录接口调用次数,接口调用时间需求. 需要修改公共的类,就是restful接口,可以认为是底层的代码,具体的实现有哪些?插入数据库肯定不能影响性能.

  7. RESTful接口设计原则和优点

    RESTful架构优点: 前后端分离,减少流量 安全问题集中在接口上,由于接受json格式,防止了注入型等安全问题 前端无关化,后端只负责数据处理,前端表现方式可以是任何前端语言(android,io ...

  8. Swagger: 一个restful接口文档在线生成+功能测试软件

    一.什么是 Swagger? Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 ...

  9. 网络协议 21 - RPC 协议(中)- 基于 JSON 的 RESTful 接口协议

        上一节我们了解了基于 XML 的 SOAP 协议,SOAP 的 S 是啥意思来着?是 Simple,但是好像一点儿都不简单啊! 传输协议问题     对于 SOAP 来讲,比如我创建一个订单, ...

随机推荐

  1. Android逆向基础----Android Dalvik虚拟机

    Android Dalvik虚拟机的特点: l  体积小,占用内存空间小. l  专有DEX可执行文件. l  常量池采用32位索引值,寻址类方法名,字段名,常量更快. l  基于寄存器架构,并拥有一 ...

  2. Zookeeper客户端Curator基本API

    在使用zookeper的时候一般不使用原生的API,Curator,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连.反复注册Watcher和NodeExistsExceptio ...

  3. Android JS 交互出现 Uncaught Error: Error calling method on NPObject

    由于HTML5的功能越来越强大,native app的一些功能逐步被html页面代替,不可避免的JS交互也用到的也越来越多.在第一个版本向第二个版本迭代的过程中却发生了莫名其妙的问题,第一个版本JS调 ...

  4. bootstrap模态框显示时被遮罩层遮住了

    <style>.modal-backdrop{z-index:0;}</style>

  5. MySQL数据库之auto_increment【转】

    一.概述 在数据库应用中,我们经常需要用到自动递增的唯一编号来标识记录.在MySQL中,可通过数据列的auto_increment属性来自动生成.可在建表时可用“auto_increment=n”选项 ...

  6. requests库入门13-会话对象

    会话对象可以在跨请求保持某些参数,会话对象有requests api的大部分方法,我理解会话对象就是一个资源共享池 使用requests.Session()可以创建会话对象的实例 还是以之前GitHu ...

  7. 解决64bit不能连接access的问题

    原有的程序迁移至64位,结果调用数据库时出错,原因是jet驱动没有64位的,得换用64位的驱动程序:   1. 下载运行 AccessDatabaseEngine_x64.exe (http://ww ...

  8. mongodb 创建更新语法

    创建文档 向MongoDB插入数据,使用insert, 如:db.refactor.insert({"refactor's blog":"http://www.cnblo ...

  9. mongodb管理与安全认证

    mongodb数据管理 数据的导出.数据导入数据导出 mongoexport [使用mongoexport -h查看参数] 数据导入 mongoimport [使用mongoimport -h查看参数 ...

  10. $Django 模板层(变量、过滤器 、标签)、自定义(模板过滤器,标签)

    1 模版语法之变量:详见源码  -{{ 变量 }}:******重要******{#相当于print了该变量#} {#只写函数名 相当于()执行了#}<p>函数:{{ test }}< ...