restful规范和原生django写接口
一、restful规范
1、restful规范是什么,如何来的?
一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中 的规范
Roy Fielding的博士论文提出的
RESTful API(Representational State Transfer Application Programming Interface)是一种基于网络的接口设计原则,广泛用于构建 Web 服务。
RESTful API 使用标准的 HTTP 协议,通过 URL(统一资源定位符)来标识资源,并使用 HTTP 方法(如 GET、POST、PUT、DELETE)来对资源进行操作。
2、以后写接口,大致都要遵循如下规范
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | - 1 数据的安全保障 - 》url链接一般都采用https协议进行传输 - - 》它比http安全 - 2 接口特征表现 - - 》url中带api标识 - https: / / api.baidu.com / books / - https: / / www.baidu.com / api / books / - 3 多数据版本共存 - - 》url中带版本信息 https: / / api.baidu.com / v1 / books https: / / www.baidu.com / api / v2 / books - 4 数据即是资源,均使用名词(可复数) - - >前后台交互,交互的数据称之为资源 - 数据即资源,前后端交互的数据称之为资源,url尽量使用名字 - https: / / 127.0 . 0.1 / api / v1 / books / - - >表示对图书操作:增加,删除,查询,修改,都用这一个地址 - https: / / 127.0 . 0.1 / api / v1 / get_all_books / # 不符合restful规范 - https: / / 127.0 . 0.1 / api / v1 / delete_books / # 不符合restful规范 - 5 资源操作由请求方式决定 - get 请求获取数据(获取所有,获取单条) - post 新增数据 - put 修改数据 - delete 删除数据 https: / / api.baidu.com / books - get请求:获取所有书 https: / / api.baidu.com / books / 1 - get请求:获取主键为 1 的书 https: / / api.baidu.com / books - post请求:新增一本书书 https: / / api.baidu.com / books / 1 - put请求:整体修改主键为 1 的书 https: / / api.baidu.com / books / 1 - delete请求:删除主键为 1 的书 - 6 请求地址中带过滤条件 - - - 》只针对于搜索所有接口 - 7 响应状态码(两层) - http响应状态码: 1xx , 2xx , 3xx , 4xx , 5xx :https: / / www.sohu.com / a / 278045231_120014184 - 成功都返回 200 ,而在响应体中带 状态码 - - - >code不同公司就不一样 { "code" : 101 , "msg" : "用户名或密码错误" } - 补充一:mysql 错误操作都会有个 数字( 10060 ) 文字解释 - 补充二: - https: / / open .weibo.com / wiki / Error_code - 8 响应中带错误信息 { "code" : 101 , "msg" : "用户名或密码错误" } - 9 不同操作,返回格式符合如下标准 GET / collection:返回资源对象的列表(数组) # [{name:西游记,price:19},{name:三国,price:19}] GET / collection / resource:返回单个资源对象 # {name:三国,price:19} POST / collection:返回新生成的资源对象 # {name:三国,price:19} PUT / collection / resource:返回完整的资源对象 # {name:三国演绎,price:19} DELETE / collection / resource:返回一个空文档 # - - - 》大家都这么做 { code: 100 msg:查询成功 restult:[{name:西游记,price: 19 },{name:三国,price: 19 }] } - 10 响应中带链接 |
3、核心概念
-
资源:
- 资源是系统中的基本数据单元,可以是用户、产品、订单等。每个资源通过 URL 唯一标识。
- 例如,
/users/123
可能表示 ID 为 123 的用户。
-
HTTP 方法:
- GET:用于获取资源。HTTP GET 请求应为安全和幂等的,即不会对资源进行修改。
- POST:用于创建资源。通常在服务器上创建新资源。
- PUT:用于全量更新资源。将目标资源的内容替换成请求提供的内容。
- PATCH:用于部分更新资源。仅更新资源的部分字段。
- DELETE:用于删除资源。
-
无状态性:
- 每个请求都是独立的,服务器不保存客户端的状态信息。所有必要的信息都应包含在请求中。
-
客户端-服务器架构:
- 在 REST 架构中,客户端和服务器是分开的。这种分离使得它们可以独立发展,客户端可以使用不同的技术栈,而不依赖于服务器的实现。
-
可缓存性:
- 响应的结果可以被缓存,以提高性能。HTTP 协议本身提供了缓存机制,应用程序可以根据需要利用这一特性。
-
统一接口:
- RESTful API 提供统一的接口,通过标准的 HTTP 方法和 URL 结构,提高了资源交互的一致性。
二、原生django写books五个接口
1、将5个接口进行分类:带id的和不带id的各写一个视图函数
1 2 3 4 5 6 | http: / / 127.0 . 0.1 / books / get查询所有 http: / / 127.0 . 0.1 / books / post新增一条 http: / / 127.0 . 0.1 / books / id put修改一条 http: / / 127.0 . 0.1 / books / id delete删除一条 http: / / 127.0 . 0.1 / books / id get查询一条 |
2、views
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | class BookView(View): def get( self , request, * args, * * kwargs): books = Book.objects. all () # qs对象,不是列表,不能 序列化 # 自己做---->序列化 l = [] for itme in books: l.append({ 'name' : itme.name, 'price' : itme.price}) res = { 'code' : 100 , 'msg' : '查询成功' , 'result' : l} return JsonResponse(res) def post( self , request): try : a = request.body # b'name=xiyouji&price=123' b = a.decode( 'utf8' ) res = {i.split( '=' )[ 0 ]: i.split( '=' )[ 1 ] for i in b.split( '&' )} # print(res) # {'name': 'xiyou', 'price': '123'} name = res.get( 'name' ) price = res.get( 'price' ) new_book = Book.objects.create(name = name, price = price) res = { 'code' : 100 , 'msg' : '添加成功' , 'result' : { 'name' : new_book.name, 'price' : new_book.price}} return JsonResponse(res) except : in_data_dic = json.loads(request.body) # 获取前端的post方法的json请求 name = in_data_dic.get( 'name' ) price = in_data_dic.get( 'price' ) new_book = Book.objects.create(name = name, price = price) res = { 'code' : 100 , 'msg' : '添加成功' , 'result' : { 'name' : new_book.name, 'price' : new_book.price}} return JsonResponse(res) class BookDetailView(View): def put( self , request, pk): # 修改数据 # 取出前端传入的json数据---》request.body in_data_dic = json.loads(request.body) name = in_data_dic.get( 'name' ) price = in_data_dic.get( 'price' ) book = Book.objects.get(pk = pk) book.name = name book.price = price book.save() return JsonResponse({ 'code' : 100 , 'msg' : '查询成功' , 'result' : { 'name' : book.name, 'price' : book.price}}) def delete( self , request, pk): book = Book.objects.get(pk = pk) Book.objects. filter (pk = pk).delete() return JsonResponse({ 'code' : 200 , 'msg' : '删除成功' , 'result' : { 'name' : book.name}}) def get( self , request, pk): try : book = Book.objects.get(pk = pk) except : return JsonResponse({ 'code' : 200 , 'msg' : '查询的书籍不存在' }) return JsonResponse({ 'code' : 200 , 'msg' : '查询成功' , 'result' : { 'name' : book.name}}) |