Rest API, python e Django Rest

Correções: originalmente o post dizia que outra opção de frameworks para Rest API em Python seria o Flask. Mas existe o Flask-RESTful.

Rest

REST = Representative State Transfer (Transferência de Estado Representacional)

O REST é um estilo arquitetural para aplicações Web, cunhado por Roy Fielding, em 2000, na sua tese Architectural Styles and the Design of Network-based Software Architectures [1].

Em termos gerais, uma aplicação que segue as especificações REST disponibiliza métodos (verbos), geralmente pelo protocolo HTTP, que agirão no servidor, modificando ou obtendo informação.

Com o uso dos verbos teremos acesso aos resources (recursos), que são qualquer mapeamento de um conjunto de dados para uma determinada entidade.

Exemplo de um resource de uma entidade Usuário:

{

  "nome": "Roselma Mendes",

  "idade": 27,

  "Ocupação": "desenvolvedora",

  "tipoDeAcesso": "Admin"

}

Em linhas gerais, se temos uma url http://servidor-qualquer.com/v1/posts que recebe um POST com um json definido com campos para um usuário. A url gerará uma ação do tipo "Crie um usuário" (um registro na tabela usuario será criado). Esta ação gera uma resposta com informações de status e a url única e exclusiva para acessar o registro, entre outras informações da requisição.

201 Created

{
    "usuario": {
        "id": 3,
        "nome": "Roselma Mendes",
        "idade": 27,
        "ocupacao": "desenvolvedora",
        "tipoDeAcesso": "Admin",
        "links": [
            {
                "href": "/usuario/3",
                "rel": "self",
                "method": "GET"
            },
            {
                "href": "/usuario/3",
                "rel": "edit",
                "method": "PUT"
            },
            {
                "href": "/usuario/3",
                "rel": "delete",
                "method": "DELETE"
            }
        ]
    },
    "links": {
       "href": "/usuario",
       "rel": "list",
       "method": "GET"
    }
}

Quando temos um serviço baseado em REST costumamos chamá-lo de um serviço Restful.

Verbos

Os verbos mais comumente usados são o GET (visualizar), POST (criar), PUT (atualizar/substituir), PATCH (atualizar/modificar) e DELETE (remover). Além desses verbos, existem outros, mas pouco usados.

No caso do GET, por exemplo, dado que uma aplicação que interage com sua API "chame" http://servidor-qualquer.com/v1/usuario/1, ela obterá as informações do registro 1 da tabela usuario. O método GET serve tanto para uma lista de usuários como para obter um único registro.

API

API = Application Programming Interface (Interface de Programação de Aplicação)

Uma API é um conjunto de rotinas usadas pelas aplicações com o intuito de usar um serviço sem conhecer sua implementação. No caso de Rest API's, estamos falando de um conjunto de operações disponibilizadas por um serviço Restful.

Django

django-unchained

Não o filme do Quentin Tarantino estrelado pelo Jamie Foxx.

Em se falando de Python, Django é um framework para construção de aplicações Web "que encoraja o desenvolvimento rápido e um design limpo e pragramático".

Imagine que temos uma pesquisa de satisfação que possui uma questão com algumas opções para as pessoas escolherem como resposta.

Aqui abaixo temos um HTML que exibe o enunciado da questão e quantos votos cada resposta recebeu.

Django permite acessarmos, dentro de um arquivo HTML, o objeto Pergunta e com um for percorrer suas respostas (linha 4).


E abaixo definimos uma classe View onde relacionamos a classe Pergunta com o resultados.html (linha 8).

Django Rest

Já o Django Rest é a implementação do Django para fazermos Rest API's.

Dado que tenho uma classe herdando de models.Model do Django, chamada Pergunta, e a classe Resposta. Ambas relacionadas visto que uma pergunta pode ter várias respostas.

Criarei uma view (PerguntaView) que terá definido um serializer chamado PerguntaSerializer.

O Django Rest possui uma quantidade de classes View que já abstraem os principais verbos que um serviço Restful precisa. No exemplo acima utilizamos o ListCreateAPIView que possui POST e GET já implementados.

Por sua vez, o serializer faz a "conversão" dos dados de um objeto (Model) para a representação em json (ou outro formato). E vice-versa.

Não necessariamente sou obrigada a retornar uma ou mais entidades da forma como elas estão representadas no banco.

Pelo serializer tenho liberdade de mexer em como desejo representar uma ou mais entidades. Adicionando, removendo campos de acordo com a necessidade do projeto.

Tirando alguns outros passos não mencionados, teremos a url http://localhost:8000/v1/perguntas recebendo um json (método POST) e recebendo um outro json em resposta.

resposta-exemplo

Para facilitar a vida de quem desenvolve, o Django Rest disponibiliza uma interface web que nos permite explorar os verbos implementados.

print-django-rest-interface

Por fim

Além do Django Rest, para a linguagem Python existem outros frameworks voltados para Rest API's como o FlaskFlask-RESTful.

Vale dar uma olhada em outras opções e escolher a que melhor atende as necessidades do seu projeto.

Esse post foi muito mais uma visão geral do que é o Django Rest, não entrei em detalhes de como colocar a aplicação para funcionar, então se você se interessou em saber mais sobre visite a página oficial do projeto. Lá tem alguns tutoriais para aprofundar melhor no framework.

No mais deixe suas perguntas nos comentários que ficarei feliz em responder :) (rosto sorrindo)

Claro que críticas, sugestões também são bem-vindas!

Referências

Architectural Styles and the Design of Network-based Software Architectures - Chapter 5

RESTful Web Services: A Tutorial

Using HTTP Methods for RESTful Services