Apidog

Plataforma Colaborativa All-in-one para Desenvolvimento de API

Design de API

Documentação de API

Depuração de API

Mock de API

Testes Automatizados de API

Como Construir e Documentar APIs RESTful com Flask-RESTX e Apidog

@apidog

@apidog

Updated on janeiro 15, 2025

Construir APIs RESTful é uma habilidade fundamental para o desenvolvimento moderno de aplicações web, permitindo uma comunicação perfeita entre clientes e servidores. Flask-RESTX, uma extensão do popular framework Flask, simplifica esse processo ao fornecer ferramentas para criar APIs robustas de maneira eficiente. Neste tutorial, exploraremos como construir uma API RESTful usando Flask-RESTX e demonstraremos como testá-la com o Apidog, uma plataforma integrada para design de API, depuração, documentação, mocking, e testes.

💡
Considere aprimorar o seu fluxo de trabalho no desenvolvimento de APIs com o Apidog. É uma ferramenta abrangente que simplifica o design, depuração, testes e documentação de APIs. Baixe o Apidog gratuitamente e acompanhe para ver como ele se integra perfeitamente ao processo.
button

1. Introdução às APIs RESTful

REST (Transferência de Estado Representacional) é um estilo arquitetônico que utiliza métodos HTTP padrão para interagir com recursos. As APIs que seguem os princípios REST são chamadas de APIs RESTful. Elas fornecem uma interface previsível e uniforme para interações cliente-servidor, tornando os serviços web mais acessíveis e manuteníveis.

2. Configurando seu Ambiente de Desenvolvimento

Antes de começarmos a construir nossa API, vamos configurar nosso ambiente de desenvolvimento.

Pré-requisitos

Python 3.7 ou superior: Certifique-se de que o Python está instalado em seu sistema. Verifique executando:

python --version

Ambiente Virtual: É uma boa prática criar um ambiente virtual para seu projeto para gerenciar dependências.

python -m venv venv
source venv/bin/activate  # No Windows: venv\Scripts\activate

Instalando Flask e Flask-RESTX

Com o ambiente virtual ativado, instale o Flask e o Flask-RESTX usando pip:

pip install flask flask-restx

Este comando instala tanto o Flask quanto o Flask-RESTX, permitindo-nos construir e gerenciar nossos endpoints de API de forma eficaz.

3. Instalando e Configurando o Flask-RESTX

Flask-RESTX é uma extensão que adiciona suporte para construir rapidamente APIs REST com Flask. Ela incentiva as melhores práticas com uma configuração mínima.

Instalação

Se você ainda não instalou o Flask-RESTX, pode fazê-lo usando pip:

pip install flask-restx

Configuração

Crie um novo arquivo Python, por exemplo, app.py, e configure a configuração básica:

from flask import Flask
from flask_restx import Api

app = Flask(__name__)
api = Api(app, version='1.0', title='API de Exemplo',
          description='Uma API de exemplo usando Flask-RESTX')

if __name__ == '__main__':
    app.run(debug=True)

Este script inicializa uma aplicação Flask e a encapsula com uma instância de API do Flask-RESTX, fornecendo uma base para construir endpoints.

4. Criando Seu Primeiro Endpoint de API

Vamos criar um endpoint simples para entender como o Flask-RESTX funciona.

Definindo um Namespace

Namespaces no Flask-RESTX ajudam a organizar sua API e prevenir colisões de nomes de endpoints.

from flask_restx import Namespace, Resource

ns = Namespace('hello', description='Operações Hello World')

Criando um Recurso

Recursos no Flask-RESTX correspondem a endpoints e definem como os métodos HTTP são tratados.

@ns.route('/')
class HelloWorld(Resource):
    def get(self):
        return {'message': 'Hello, World!'}

Registrando o Namespace

Por fim, registre o namespace com a API:

api.add_namespace(ns)

Agora, ao executar sua aplicação e navegar para http://localhost:5000/hello/, você deve ver:

{
  "message": "Hello, World!"
}

5. Estruturando Sua Aplicação Flask-RESTX

À medida que sua aplicação cresce, é essencial manter uma estrutura limpa e organizada.

Estrutura de Projeto Recomendada

projeto/
├── app/
│   ├── __init__.py
│   ├── controllers/
│   │   ├── __init__.py
│   │   └── hello_controller.py
│   ├── models/
│   │   ├── __init__.py
│   │   └── hello_model.py
│   └── services/
│       ├── __init__.py
│       └── hello_service.py
├── run.py
└── requirements.txt

Inicializando a Aplicação

Em app/__init__.py:

from flask import Flask
from flask_restx import Api

def create_app():
    app = Flask(__name__)
    api = Api(app, version='1.0', title='API de Exemplo',
              description='Uma API de exemplo usando Flask-RESTX')

    from .controllers.hello_controller import ns as hello_namespace
    api.add_namespace(hello_namespace)

    return app

Em run.py:

from app import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

Essa abordagem modular separa as preocupações, tornando a aplicação mais manutenível e escalável.

6. Implementando Operações CRUD

Operações CRUD—Criar, Ler, Atualizar, Deletar—são fundamentais para o desenvolvimento de APIs. Vamos implementar essas para um simples recurso Item.

Definindo o Modelo

Em app/models/item_model.py:

from flask_restx import fields

def get_item_model(api):
    return api.model('Item', {
        'id': fields.Integer(readOnly=True, description='O identificador único de um item'),
        'name': fields.String(required=True, description='Nome do item'),
        'price': fields.Float(required=True, description='Preço do item')
    })

Implementando o Recurso

Em app/controllers/item_controller.py:

from flask_restx import Namespace, Resource, reqparse
from app.models.item_model import get_item_model

ns = Namespace('items', description='Operações de Item')

item_model = get_item_model(ns)

items = []
item_id_counter = 1

parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True, help='Nome do item')
parser.add_argument('price', type=float, required=True, help='Preço do item')

@ns.route('/')
class ItemList(Resource):
    @ns.marshal_list_with(item_model)
    def get(self):
        return items

    @ns.expect(item_model)
    @ns.marshal_with(item_model, code=201)
    def post(self):
        global item_id_counter
        args = parser.parse_args()
        item = {
            'id': item_id_counter,
            'name': args['name'],
            'price': args['price']
        }
        items.append(item)
        item_id_counter += 1
        return item, 201

@ns.route('/<int:id>')
@ns.response(404, 'Item não encontrado')
@ns.param('id', 'O identificador do item')
class Item(Resource):
    @ns.marshal_with(item_model)
    def get(self, id):
        item = next((item for item in items if item['id'] == id), None)
        if item is not None:
            return item
        ns.abort(404, message="Item não encontrado")

    @ns.expect(item_model)
    @ns.marshal_with(item_model)
    def put(self, id):
        item = next((item for item in items if item['id'] == id), None)
        if item is not None:
            args = parser.parse_args()
            item.update({
                'name': args['name'],
                'price': args['price']
            })
            return item
        ns.abort(404, message="Item não encontrado")

    @ns.response(204, 'Item deletado')
    def delete(self, id):
        global items
        item = next((item for item in items if item['id'] == id), None)
        if item is not None:
            items = [item for item in items if item['id'] != id]
            return '', 204
        ns.abort(404, message="Item não encontrado")

Nesta implementação:

  • GET /items/: Recupera a lista de itens.
  • POST /items/: Adiciona um novo item.
  • GET /items/{id}: Recupera um item específico pelo ID.
  • PUT /items/{id}: Atualiza um item existente pelo ID.
  • DELETE /items/{id}: Deleta um item pelo ID.

Essa configuração fornece uma interface CRUD completa para gerenciar itens na sua API.

7. Validando e Serializando Dados com Flask-RESTX

A validação e serialização de dados são cruciais para garantir a integridade e consistência dos dados que sua API processa. O Flask-RESTX oferece decoradores e campos para facilitar isso.

Usando Modelos para Validação

Defina um modelo para especificar os formatos de entrada e saída esperados.

from flask_restx import fields

item_model = api.model('Item', {
    'id': fields.Integer(readOnly=True, description='O identificador único de um item'),
    'name': fields.String(required=True, description='Nome do item'),
    'price': fields.Float(required=True, description='Preço do item')
})

Ao decorar seus métodos de recurso com @ns.expect(item_model), o Flask-RESTX validará automaticamente os dados JSON recebidos em relação a este modelo.

Serializando Respostas

Use o decorador @ns.marshal_with para formatar a saída de acordo com o modelo.

@ns.marshal_with(item_model)
def get(self, id):
    # Recupera e retorna o item

Isso garante que os dados da resposta estejam em conformidade com a estrutura especificada, promovendo consistência em toda a sua API.

8. Testando APIs RESTful com Apidog

Testar é uma parte vital do desenvolvimento de APIs, garantindo que seus endpoints funcionem como esperado. Apidog é uma ferramenta abrangente que simplifica o teste, design e documentação de APIs.

Configurando o Apidog

Baixar e Instalar: Baixe o Apidog gratuitamente e siga as instruções de instalação para seu sistema operacional.

button

Criar um Novo Projeto: Inicie o Apidog e crie um novo projeto para sua API.

Importando Sua Especificação de API

Se você documentou sua API usando OpenAPI/Swagger, pode importar a especificação para o Apidog:

Importar Especificação: No seu projeto Apidog, selecione a opção de importar uma especificação de API e carregue seu arquivo OpenAPI.

Explore Endpoints: O Apidog irá analisar o arquivo e exibir seus endpoints de API, parâmetros e modelos.

Você também pode criar APIs do zero no Apidog.

Testando Endpoints

Selecionar um Endpoint: Escolha o endpoint que deseja testar na lista.

Configurar a Requisição:

  • Método: Certifique-se de que o método HTTP correto (GET, POST, PUT, DELETE) está selecionado.
  • Parâmetros: Insira quaisquer parâmetros de consulta ou variáveis de caminho necessárias.
  • Headers: Defina os headers necessários, como Content-Type: application/json.
  • Corpo: Para requisições POST e PUT, forneça o payload JSON.

Enviar a Requisição: Clique no botão Enviar para executar a requisição.

Revisar a Resposta:

(Dica: O Apidog valida automaticamente a resposta da API.)

  • Código de Status: Verifique se o código de status da resposta corresponde às expectativas (por exemplo, 200 para sucesso, 201 para criação).
  • Corpo da Resposta: Verifique se os dados retornados estão corretos e formatados corretamente.
  • Headers: Inspecione os headers da resposta para informações adicionais.

9. Gerando Documentação da API com Flask-RESTX

A documentação abrangente é essencial para qualquer API, facilitando a usabilidade e integração para desenvolvedores. O Flask-RESTX fornece suporte embutido para gerar documentação interativa da API.

Gerar documentação completa e amigável para a API é crucial para desenvolvedores e usuários que interagem com sua API. O Flask-RESTX simplifica esse processo gerando automaticamente a documentação do Swagger UI, fornecendo uma interface interativa para explorar e testar seus endpoints de API.

Documentação Automática do Swagger

Por padrão, o Flask-RESTX gera documentação do Swagger acessível na URL raíz da sua API. Este recurso oferece uma visão imediata da estrutura da sua API e dos endpoints disponíveis sem configuração adicional.

Personalizando Documentação com Decoradores

O Flask-RESTX fornece vários decoradores para melhorar e personalizar sua documentação de API:

@api.doc(): Adiciona informações adicionais aos seus recursos ou métodos. Por exemplo, para documentar parâmetros:

@api.route('/my-resource/<id>')
@api.doc(params={'id': 'Um ID'})
class MyResource(Resource):
    def get(self, id):
        return {}

@api.response(): Documenta as respostas esperadas, incluindo códigos de status e descrições:

@api.route('/my-resource/<id>')
class MyResource(Resource):
    @api.response(403, 'Não Autorizado')
    def post(self, id):
        api.abort(403)

@api.marshal_with(): Especifica o modelo de saída para uma resposta, garantindo formatação consistente dos dados:

@api.route('/item/<int:id>')
class ItemResource(Resource):
    @api.marshal_with(item_model)
    def get(self, id):
        # Recupera e retorna o item

@api.expect(): Define o modelo de entrada esperado para requisições, facilitando a validação e documentação:

@api.route('/item')
class ItemResource(Resource):
    @api.expect(item_model)
    def post(self):
        # Lida com a requisição post

Organizando com Namespaces

Namespaces no Flask-RESTX ajudam a agrupar recursos relacionados, melhorando a organização da sua API e de sua documentação.

from flask_restx import Namespace, Resource

ns = Namespace('items', description='Operações de Item')

@ns.route('/<int:id>')
class ItemResource(Resource):
    def get(self, id):
        # Recupera e retorna o item

Ao registrar o namespace com a API, todas as rotas e documentação associadas são agrupadas de maneira adequada:

api.add_namespace(ns)

Acessando o Swagger UI

Uma vez que sua aplicação Flask-RESTX esteja em execução, você pode acessar o Swagger UI gerado automaticamente navegando até a URL raiz da sua API (por exemplo, http://localhost:5000/). Esta interface fornece uma exploração interativa da sua API, exibindo endpoints disponíveis, entradas esperadas e respostas potenciais.

Aproveitando esses recursos, você garante que sua API esteja bem documentada, amigável ao usuário e facilmente compreensível para desenvolvedores e consumidores.

10. Aprimorando a Documentação da API com Apidog

Embora o Flask-RESTX forneça documentação básica, o Apidog oferece recursos avançados para documentação de API, incluindo personalização, geração de código automatizada e testes em tempo real.

Use o editor visual do Apidog para definir seus endpoints de API, parâmetros de requisição e esquemas de resposta. Com um único clique, gere documentação de API abrangente e interativa.

Compartilhe sua documentação com membros da equipe ou parceiros externos, permitindo que eles testem os endpoints da API diretamente dentro da documentação.

Ao integrar o Flask-RESTX com o Apidog, você pode criar APIs robustas com documentação de qualidade profissional, aprimorando tanto a eficiência de desenvolvimento quanto a experiência do usuário.

Conclusão

Neste guia abrangente, exploramos o processo de construção de APIs RESTful usando o Flask-RESTX, uma poderosa extensão para Flask que simplifica o desenvolvimento de APIs. Cobri as principais áreas, como configurar seu ambiente de desenvolvimento, criar e gerenciar endpoints de API, validar e serializar dados, e gerar documentação interativa de API.

Além disso, introduzimos o Apidog, uma ferramenta versátil que melhora seu fluxo de trabalho de desenvolvimento de API oferecendo recursos como testes automatizados, testes de desempenho e documentação colaborativa. Ao integrar o Apidog ao seu processo de desenvolvimento, você pode garantir que suas APIs sejam robustas, eficientes e bem documentadas.

button