0 – Quickstart
1 – Serialization
2 – Requests & Responses
3 – Class based views
Este post é continuação do post Django Rest Framework Serialization.
O uso de requests e responses torna nossa api mais flexível. A funcionalidade principal do objeto Request é o atributo request.data, que é semelhante ao request.POST, mas é mais útil para trabalhar com APIs.
Objeto Response
Introduzimos aqui um objeto Response, que é um tipo de TemplateResponse que leva conteúdo não renderizado e usa a negociação de conteúdo para determinar o tipo de conteúdo correto para retornar ao cliente.
Repare também no uso de status code pré definidos, exemplo: status.HTTP_400_BAD_REQUEST.
E usamos o decorador @api_view para trabalhar com funções. Ou APIView para classes.
Nosso código ficou assim:
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from core.models import Person
from core.serializers import PersonSerializer@api_view([‘GET’, ‘POST’])
def person_list(request):
“””
List all persons, or create a new person.
“””
if request.method == ‘GET’:
persons = Person.objects.all()
serializer = PersonSerializer(persons, many=True)
return Response(serializer.data)
elif request.method == ‘POST’:
serializer = PersonSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view([‘GET’, ‘PUT’, ‘DELETE’])
def person_detail(request, pk):
“””
Retrieve, update or delete a person instance.
“””
try:
person = Person.objects.get(pk=pk)
except Person.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == ‘GET’:
serializer = PersonSerializer(person)
return Response(serializer.data)
elif request.method == ‘PUT’:
serializer = PersonSerializer(person, 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’:
person.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
Veja no GitHub.
Usando sufixo opcional
Em core/urls.py acrescente
from rest_framework.urlpatterns import format_suffix_patterns
…
urlpatterns = format_suffix_patterns(urlpatterns)
E em views.py acrescente format=None como parâmetro das funções a seguir:
def person_list(request, format=None):
def person_detail(request, pk, format=None):
Com isso você pode chamar a api da seguinte forma:
http http://127.0.0.1:8000/persons.api
Até a próxima.
LEIA TAMBÉM: