restful api提供了下面了几个方法html
HTTP方法 | 行为 | 示例 |
---|---|---|
GET | 获取全部的资源的信息 | http://xx.com/api/orders |
GET | 获取某个特定的资源的信息 | http://xx.com/api/orders/2 |
POST | 建立新的资源 | http://xx.com/api/orders |
PUT | 更新资源 | http://xx.com/api/orders/1 |
DELETE | 删除资源 | http://xx.com/api/orders/1 |
REST framework扩展了常规的Request,提供了一个更加灵活的HttpRequest方法。其中Request的核心是request.data属性,这个属性相似于request.POST,可是在web apis当中显得更加的灵活python
request.POST #仅适用于表单的提交时的操做 request.data #能够适用于作任意的数据,比较'POST','PUT'和'PATCH'方法
###响应对象 rest framework引入了一个Response 对象,它继承自TemplateResponse对象。它得到未渲染的内容并经过内容协商content negotiation 来决定正确的content type返回给client。web
return Response(data) # Renders to content type as requested by the client.
rest framework为每一个状态码提供了更明确的标记。例如 HTTP_404_NOT_FOUND、HTTP_200_OK、HTTP_201_CREATED 更多.相对于单调的数据而言这类标识符显得更加的直观。django
在编写api view时,rest framework提供了两个wrappersjson
- The @api_view decorator for working with function based views.
- The APIView class for working with class based views.
这两种封装器提供了许多功能,例如,确保在view当中可以接收到Request实例;往Response中增长内容以便内容协商content negotiation 机制可以执行。api
如今咱们开始用新的组件编写views 咱们不须要再使用JSONResponse类,删除以前在views.py中那部分代码。t咱们从新开始重构新的代码.浏览器
@api_view(['GET','POST']) def snippet_list(request): ''' 显示全部的snippets列表,或者建立一个新的snippet ''' if request.method=='GET': snippets=Snippet.objects.all() serializer=SnippetSerializer(snippets,many=True) return Response(serializer.data) elif request.method=='POST': serializer=SnippetSerializer(data=request.data) if seralizer.is_valid(): serializer.save() return Response(seralizer.data,status=status.HTTP_201_CREATED) return Response(seralizer.errors,status=status.HTTP_400_BAD_REQUEST)
上面的代码是对咱们以前代码的改进。看上去更简洁,也更相似于django的forms api形式。咱们也采用了状态码,使返回值更加明确。 下面是对单个snippet操做的view更新:restful
@api_view(['GET', 'PUT', 'DELETE']) def snippet_detail(request, pk): """ Retrieve, update or delete a snippet instance. """ try: snippet = Snippet.objects.get(pk=pk) except Snippet.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) if request.method == 'GET': serializer = SnippetSerializer(snippet) return Response(serializer.data) elif request.method == 'PUT': serializer = SnippetSerializer(snippet, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) elif request.method == 'DELETE': snippet.delete() return Response(status=status.HTTP_204_NO_CONTENT)
上面的代码中能够发现,咱们并无明确的指定request和response的内容相似。request.DATA不只能够处理json的请求,也能够 输入其余的格式.REST Framework会自动响应正确的内容呈现给client app
###给URLs增长可选的格式后缀 咱们在api添加一个后缀 明确指定该url的格式,好比http://example.com/api/items/4.json.的URL. 表示是按json的方法进行处理。 如今咱们修改以前的urls.py,只要在后面添加一个format_suffix_patterns(urlpatterns)ide
from django.conf.urls import url from rest_framework.urlpatterns import format_suffix_patterns from snippets import views urlpatterns = [ url(r'^snippets/$', views.snippet_list), url(r'^snippets/(?P<pk>[0-9]+)$', views.snippet_detail), ] urlpatterns = format_suffix_patterns(urlpatterns)
咱们一样是采用的是以前的port1的方式进行api的测试。
下面的指令是获取snippets的列表 
咱们能够经过包含Accept的头来指定响应的格式
http http://127.0.0.1:8000/snippets/ Accept:application/json # Request JSON
http http://127.0.0.1:8000/snippets/ Accept:text/html # Request HTML
 上面的是以json的方式来进行响应
一样的咱们可使用content-Type控制发送的请求格式 
一样的咱们能够经过浏览器访问来http://127.0.0.1:8000/snippets/ 来进行访问
