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)

相关文章
相关标签/搜索