<h1 id="lable1" class="title">一、 什么是RESTful
- REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”
- REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态
- 所有的数据,不管是通过网络获取的还是操作数据库获得(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性
- 对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)
- 对互联网上的任意东西都视为资源,他认为一个url就是一个资源 比如:http://www.xxx.com/get_user/
1、什么是API?
答:API就是接口,提供的url。接口有两个用途:
- - 为别人提供服务
- - 前后端分离,一个写vue,一个写后端,他们之间都是通过ajax请求
网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备......)。
因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信。这导致API构架的流行,甚至出现"API First"的设计思想。RESTful API是目前比较成熟的一套互联网应用程序的API设计理论。
那么先来简单了解一下
有两种方式
方式一:尽量将API部署在专用域名(会存在跨域问题)
方式二:如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。
应该将API的版本号放入URL。
另一种做法是,将版本号放在HTTP头信息中,但不如放入URL方便和直观。采用这种做法。
路径又称"终点"(endpoint),表示API的具体网址。
在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。
举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。
对于资源的具体操作类型,由HTTP动词表示。
常用的HTTP动词有下面五个(括号里是对应的sql命令)。
还有两个不常用的HTTP动词。
下面是一些例子:
如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。
下面是一些常见的参数。
参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复。比如,GET /zoo/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。
服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。
状态码的完全列表参见。
如果状态码是4xx,就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。
针对不同操作,服务器向用户返回的结果应该符合以下规范
RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
比如,当用户向api.example.com的根目录发出请求,会得到这样一个文档。
Hypermedia API的设计被称为。Github的API就是这种设计,访问会得到一个所有可用API的网址列表。
从上面可以看到,如果想获取当前用户的信息,应该去访问,然后就得到了下面结果。

django.contrib <span style="color: #0000ff;">from django.conf.urls <span style="color: #0000ff;">import<span style="color: #000000;"> url,include
<span style="color: #0000ff;">from app01 <span style="color: #0000ff;">import<span style="color: #000000;"> views
<span style="color: #0000ff;">from app02 <span style="color: #0000ff;">import<span style="color: #000000;"> views
urlpatterns =<span style="color: #000000;"> [
url(<span style="color: #800000;">'<span style="color: #800000;">admin/<span style="color: #800000;">'<span style="color: #000000;">,admin.site.urls),<span style="color: #008000;">#<span style="color: #008000;"> path('hosts/',views.HostView.as_view()),
url(<span style="color: #800000;">'<span style="color: #800000;">app02/<span style="color: #800000;">',include(<span style="color: #800000;">'<span style="color: #800000;">app02.urls<span style="color: #800000;">'<span style="color: #000000;">))
]

app02 django.conf.urls =

django.shortcuts <span style="color: #008000;">#<span style="color: #008000;"> Create your views here.
<span style="color: #0000ff;">import<span style="color: #000000;"> json
<span style="color: #0000ff;">def<span style="color: #000000;"> users(request):
response = {<span style="color: #800000;">'<span style="color: #800000;">code<span style="color: #800000;">':1000,<span style="color: #800000;">'<span style="color: #800000;">data<span style="color: #800000;">':None} <span style="color: #008000;">#<span style="color: #008000;">code用来表示状态,比如1000代表成功,1001代表
response[<span style="color: #800000;">'<span style="color: #800000;">data<span style="color: #800000;">'] =<span style="color: #000000;"> [
{<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">haiyan<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">age<span style="color: #800000;">':22<span style="color: #000000;">},{<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">haidong<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">age<span style="color: #800000;">':10<span style="color: #000000;">},{<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">haixiyu<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">age<span style="color: #800000;">':11<span style="color: #000000;">},]
<span style="color: #0000ff;">return HttpResponse(json.dumps(response)) <span style="color: #008000;">#<span style="color: #008000;">返回多条数据
<span style="color: #0000ff;">def<span style="color: #000000;"> user(request,pk):
<span style="color: #0000ff;">if request.method ==<span style="color: #800000;">'<span style="color: #800000;">GET<span style="color: #800000;">'<span style="color: #000000;">:
<span style="color: #0000ff;">return HttpResponse(json.dumps({<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">haiyan<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">age<span style="color: #800000;">':11})) <span style="color: #008000;">#<span style="color: #008000;">返回一条数据
<span style="color: #0000ff;">elif request.method ==<span style="color: #800000;">'<span style="color: #800000;">POST<span style="color: #800000;">'<span style="color: #000000;">:
<span style="color: #0000ff;">return HttpResponse(json.dumps({<span style="color: #800000;">'<span style="color: #800000;">code<span style="color: #800000;">':1111})) <span style="color: #008000;">#<span style="color: #008000;">返回一条数据
<span style="color: #0000ff;">elif request.method ==<span style="color: #800000;">'<span style="color: #800000;">PUT<span style="color: #800000;">'<span style="color: #000000;">:
<span style="color: #0000ff;">pass
<span style="color: #0000ff;">elif request.method ==<span style="color: #800000;">'<span style="color: #800000;">DELETE<span style="color: #800000;">'<span style="color: #000000;">:
<span style="color: #0000ff;">pass

<span style="color: #0000ff;">from app01 <span style="color: #0000ff;">import<span style="color: #000000;"> views
<span style="color: #0000ff;">from app02 <span style="color: #0000ff;">import<span style="color: #000000;"> views
urlpatterns =<span style="color: #000000;"> [
url(<span style="color: #800000;">'<span style="color: #800000;">admin/<span style="color: #800000;">'<span style="color: #000000;">,admin.site.urls),<span style="color: #008000;">#<span style="color: #008000;"> path('hosts/',views.HostView.as_view()),
url(<span style="color: #800000;">'<span style="color: #800000;">app02/<span style="color: #800000;">',include(<span style="color: #800000;">'<span style="color: #800000;">app02.urls<span style="color: #800000;">'<span style="color: #000000;">))
]


<span style="color: #0000ff;">import<span style="color: #000000;"> json
<span style="color: #0000ff;">def<span style="color: #000000;"> users(request):
response = {<span style="color: #800000;">'<span style="color: #800000;">code<span style="color: #800000;">':1000,<span style="color: #800000;">'<span style="color: #800000;">data<span style="color: #800000;">':None} <span style="color: #008000;">#<span style="color: #008000;">code用来表示状态,比如1000代表成功,1001代表
response[<span style="color: #800000;">'<span style="color: #800000;">data<span style="color: #800000;">'] =<span style="color: #000000;"> [
{<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">haiyan<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">age<span style="color: #800000;">':22<span style="color: #000000;">},{<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">haidong<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">age<span style="color: #800000;">':10<span style="color: #000000;">},{<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">haixiyu<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">age<span style="color: #800000;">':11<span style="color: #000000;">},]
<span style="color: #0000ff;">return HttpResponse(json.dumps(response)) <span style="color: #008000;">#<span style="color: #008000;">返回多条数据
<span style="color: #0000ff;">def<span style="color: #000000;"> user(request,pk):
<span style="color: #0000ff;">if request.method ==<span style="color: #800000;">'<span style="color: #800000;">GET<span style="color: #800000;">'<span style="color: #000000;">:
<span style="color: #0000ff;">return HttpResponse(json.dumps({<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">haiyan<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">age<span style="color: #800000;">':11})) <span style="color: #008000;">#<span style="color: #008000;">返回一条数据
<span style="color: #0000ff;">elif request.method ==<span style="color: #800000;">'<span style="color: #800000;">POST<span style="color: #800000;">'<span style="color: #000000;">:
<span style="color: #0000ff;">return HttpResponse(json.dumps({<span style="color: #800000;">'<span style="color: #800000;">code<span style="color: #800000;">':1111})) <span style="color: #008000;">#<span style="color: #008000;">返回一条数据
<span style="color: #0000ff;">elif request.method ==<span style="color: #800000;">'<span style="color: #800000;">PUT<span style="color: #800000;">'<span style="color: #000000;">:
<span style="color: #0000ff;">pass
<span style="color: #0000ff;">elif request.method ==<span style="color: #800000;">'<span style="color: #800000;">DELETE<span style="color: #800000;">'<span style="color: #000000;">:
<span style="color: #0000ff;">pass
<h2 class="secondtitle">方式二:CBV模式
<div class="cnblogs_code" onclick="cnblogs_code_show('7e0f2e3c-87fe-4406-bf57-f44f1d805cf5')">
<div id="cnblogs_code_open_7e0f2e3c-87fe-4406-bf57-f44f1d805cf5" class="cnblogs_code_hide">
app02 django.conf.urls =