django-rest-framework(2) 請求與響應

請求對象

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 views

在編寫api view時,rest framework提供了兩個wrappersjson

  1. The @api_view decorator for working with function based views.
  2. 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)

相關文章
相關標籤/搜索