Skip to content

O que é REST

Responsável: Andre Oliveira

Referências:

  • https://developer.mozilla.org/pt-BR/docs/Glossary/REST

  • “REST (Representational State Transfer) refere-se a um grupo de restrições de design dentro da arquitetura de software que geram sistemas distribuídos eficientes, confiáveis e escaláveis. Um sistema é denominado RESTful quando adere a todas essas restrições.”

  • “A ideia básica do REST é que um recurso, por exemplo um documento, seja transferido com seu estado bem definido, padronização de operações e formatos.”

  • Recurso ⇒ “Um recurso é um elemento abstrato e que nos permite mapear qualquer coisa do mundo real como um elemento para acesso via Web.”

  • Uso explicito dos verbos HTTP

    • GET ⇒ Buscar/Pegar informações de um recurso especificado na url da requisição (ex: /itens)
    • POST ⇒ Criar um recurso especificado na url da requisição (ex: /itens)
    • DELETE ⇒ Deleta um recurso especificado na url da requisição (ex: /itens/)
    • PUT ⇒ Atualiza um recurso especificado na url da requisição (ex: /itens/)
    # Código gerado com o ChatGPT
    from flask import Flask, jsonify, request
    
    app = Flask(__name__)
    
    # Representação do banco de dados 
    tasks = [
        {"id": 1, "title": "Estudar Python", "done": False},
        {"id": 2, "title": "Fazer compras", "done": True}
    ]
    current_id = 3
    
    # Observe como que os recursos são representados dentro da URL de requisição, ou seja, apenas lendo o caminho do recurso + seu verbo HTTP é possível ter uma ideia do que essa rota deve retornar e fazer
    @app.route('/tasks', methods=['GET'])
    def get_tasks():
        return jsonify({"tasks": tasks})
    
    @app.route('/tasks/<int:task_id>', methods=['GET'])
    def get_task(task_id):
        task = next((task for task in tasks if task['id'] == task_id), None)
        if task:
            return jsonify({"task": task})
        else:
            return jsonify({"message": "Tarefa não encontrada"}), 404
    
    @app.route('/tasks', methods=['POST'])
    def create_task():
        received_json = request.json
        if not received_json or not "title" in received_json:
            return jsonify({"message": "Formato de tarefa inválido"}), 400
        global current_id
        new_task = {
            'id': current_id,
            'done': False,
            'title': received_json["title"]
        }
        current_id += 1
        tasks.append(new_task)
        return jsonify({"message": "Tarefa criada com sucesso"}), 201
    
    @app.route('/tasks/<int:task_id>', methods=['PUT'])
    def update_task(task_id):
        task = next((task for task in tasks if task['id'] == task_id), None)
        if task:
            received_json = request.json
            if received_json and "id" in received_json and received_json["id"] != task_id:
                return jsonify({"message": "ID não pode ser alterado"}), 400
            return jsonify({"message": "Tarefa atualizada com sucesso"})
        else:
            return jsonify({"message": "Tarefa não encontrada"}), 404
    
    @app.route('/tasks/<int:task_id>', methods=['DELETE'])
    def delete_task(task_id):
        global tasks
        tasks = [task for task in tasks if task['id'] != task_id]
        return jsonify({"message": "Tarefa excluída com sucesso"})
    
    if __name__ == '__main__':
        app.run(debug=True)
    
  • Stateless ⇒ “Não é armazenado nenhum estado no servidor.” Não dependem de dados armazenados de outra requisição para poder executar a requisição atual. Todos os dados necessários para requisição se completar devem ser enviados e armazenados pelo cliente

  • Representação ⇒ JSON - Os dados normalmente chegam e retornam em JSON

  • Respostas HTTP coerentes com o estado da requisição: