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 ![屏幕快照 2016-04-12 下午10.38.31](http://7xrkms.com1.z0.glb.clouddn.com/2016-04-12-屏幕快照 2016-04-12 下午10.38.31.png)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的列表 ![屏幕快照 2016-04-12 下午10.47.58](http://7xrkms.com1.z0.glb.clouddn.com/2016-04-12-屏幕快照 2016-04-12 下午10.47.58.png)
咱們能夠經過包含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
![屏幕快照 2016-04-12 下午10.49.19](http://7xrkms.com1.z0.glb.clouddn.com/2016-04-12-屏幕快照 2016-04-12 下午10.49.19.png) 上面的是以json的方式來進行響應
一樣的咱們可使用content-Type控制發送的請求格式 ![屏幕快照 2016-04-12 下午10.52.59](http://7xrkms.com1.z0.glb.clouddn.com/2016-04-12-屏幕快照 2016-04-12 下午10.52.59.png)
一樣的咱們能夠經過瀏覽器訪問來http://127.0.0.1:8000/snippets/ 來進行訪問
![屏幕快照 2016-04-12 下午10.54.50](http://7xrkms.com1.z0.glb.clouddn.com/2016-04-12-屏幕快照 2016-04-12 下午10.54.50.png)