REST framework restful规范(9种)

636 阅读3分钟

restful规范(9种)

这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战

感激相遇 你好 我是y大壮

作者:y大壮
链接:juejin.cn/user/756923… 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

🌊🌈关于前言:

文章部分内容及图片出自网络,如有问题请与我本人联系

🌊🌈关于内容:

1、一般接口开发

urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^get_order/', views.get_order),
    url(r'^add_order/', views.add_order),
    url(r'^del_order/', views.del_order),
    url(r'^update_order/', views.update_order),
]

def get_order(request):
	return HttpResponse('')

def add_order(request):
	return HttpResponse('')

def del_order(request):
	return HttpResponse('')

def update_order(request):
	return HttpResponse('')

2、restful规范开发(9种)

根据method不同做不同的操作

FBV

urlpatterns = [
	url(r'^order/', views.order),
]

def order(request):
	if request.method == 'GET':
		return HttpResponse('获取订单')
    elif request.method == 'POST':
    	return HttpResponse('创建订单')
    elif request.method == 'PUT':
    	return HttpResponse('更新订单')
    elif request.method == 'DELETE':
    	return HttpResponse('删除订单')

CBV

urlpatterns = [
	url(r'^order/', views.OrderView.as_view()),
]

class OrderView(View):
    def get(self,request,*args,**kwargs):
    	return HttpResponse('获取订单')

    def post(self,request,*args,**kwargs):
    	return HttpResponse('创建订单')

    def put(self,request,*args,**kwargs):
   		return HttpResponse('更新订单')

    def delete(self,request,*args,**kwargs):
    	return HttpResponse('删除订单')

2.1 域名

应该尽量将API部署在专用域名之下。

https://api.example.com

如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。

https://example.org/api/

2.2 版本(Versioning)

应该将API的版本号放入URL。

http://www.example.com/app/1.0/foo

1) AcceptHeaderVersioning

请求头中传递的Accept携带version版本信息

GET /bookings/ HTTP/1.1
Host: example.com
Accept: application/json; version=1.0

2)URLPathVersioning(推荐使用)

URL路径中携带版本信息

urlpatterns = [
    url( r'^(?P<version>(v1|v2))/bookings/$', bookings_list,name='bookings-list' ),
    url( r'^(?P<version>(v1|v2))/bookings/(?P<pk>[0-9]+)/$',bookings_detail,name='bookings-detail')
]

2.3 路径

路径又称"终点"(endpoint),表示API的具体网址,每个网址代表一种资源(resource)

(1) 资源作为网址,只能有名词,不能有动词,而且所用的名词往往与数据库的表名对应。

(2) API中的名词应该使用复数。无论子资源或者所有资源。

举例来说,获取产品的API可以这样定义

2.4 HTTP

对于资源的具体操作类型

GET
POST 
GET 
PUT
PATCH 
DELETE
GET 
DELETE 

2.5 过滤信息

如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。

下面是一些常见的参数。

?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件

2.6 状态码

服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。

比如 200 300 400 500 等等这些

2.7 错误处理(Error handling)

如果状态码是4xx,服务器就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。

2.8 返回结果

比如resf的Response

2.9 其他

服务器返回的数据格式,应该尽量使用JSON,避免使用XML。

3、自己对restful api 规范的认识

就是一个规范,定义一些规范,让我们写api的时候更好做区分,更容易让我们的后台去处理,更容易让前端记录url,
说白了就是让url可以体现出对api的操作,让返回的信息可以体验出对接口的操作。

@property

class pop:
    def __init__(self):
        self.a = "abc"
    @property
    def user(self):
        return a
p = pop()
p.user    # 加了装饰器property不用加括号就可以调用,get