Escrevendo uma API em Python (com Flask e RapidAPI)
Se você está lendo este artigo, provavelmente já conhece as possibilidades que se abrem ao utilizar a API (Application Programming Interface).
Ao adicionar uma das muitas APIs públicas ao seu aplicativo, você pode estender a funcionalidade desse aplicativo ou complementá-lo com os dados necessários. Mas e se você desenvolveu um recurso exclusivo que deseja compartilhar com a comunidade?
A resposta é simples: você precisa crie sua própria API.
Embora isso possa parecer uma tarefa assustadora no começo, na verdade é bem simples. Mostraremos como fazer isso com Python.
O que você precisa para começar
O desenvolvimento de API requer:
Python3;
Frasco — um framework simples e fácil de usar para criar aplicações web;
Frasco-RESTful é uma extensão para Flask que permite desenvolver uma API REST rapidamente e com configuração mínima.
A instalação é realizada pelo comando:
pip install flask-restful
Recomendamos uma programação intensiva gratuita para iniciantes: Desenvolvimento de bot do Telegram em C# — 26 a 28 de agosto. Um intensivo gratuito que permite entender como funcionam os bots auxiliares, os recursos de trabalhar com a API do Telegram e outras nuances. Os três primeiros participantes receberão 30 rublos da Skillbox.
Para entender completamente a tarefa, vamos entender os dois termos mencionados acima.
O que é REST?
REST API (Representational State Transfer) é uma API que usa solicitações HTTP para trocar dados.
As APIs REST devem atender a certos critérios:
Arquitetura cliente-servidor: o cliente interage com a interface do usuário e o servidor interage com o back-end e o armazenamento de dados. O cliente e o servidor são independentes, qualquer um deles pode ser substituído separadamente do outro.
Stateless - Nenhum dado do cliente é armazenado no servidor. O estado da sessão é armazenado no lado do cliente.
Capacidade de cache - os clientes podem armazenar em cache as respostas do servidor para melhorar o desempenho geral.
O que é CRUD?
CRU é um conceito de programação que descreve quatro ações básicas (criar, ler, atualizar e excluir).
Na API REST, os tipos de solicitação e os métodos de solicitação são responsáveis por ações como postar, obter, colocar, excluir.
Agora que lidamos com os termos básicos, podemos começar a criar a API.
Desenvolvimento
Vamos criar um repositório de citações sobre inteligência artificial. A IA é uma das tecnologias que mais crescem atualmente, e o Python é uma ferramenta popular para trabalhar com IA.
Com essa API, um desenvolvedor Python pode aprender rapidamente sobre IA e se inspirar em novas conquistas. Se o desenvolvedor tiver pensamentos valiosos sobre esse tópico, ele poderá adicioná-los ao repositório.
Vamos começar importando os módulos necessários e configurando o Flask:
from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)
Neste snippet, Flask, Api e Resource são as classes de que precisamos.
Reqparse é uma interface de análise de solicitação Flask-RESTful... Você também precisará do módulo random para exibir uma citação aleatória.
Agora vamos criar um repositório de citações sobre IA.
Cada entrada de repositório conterá:
identificação digital;
o nome do autor da citação;
citar.
Como este é apenas um exemplo de aprendizado, armazenaremos todas as entradas em uma lista do Python. Em um aplicativo real, provavelmente usaríamos um banco de dados.
ai_quotes = [
{
"id": 0,
"author": "Kevin Kelly",
"quote": "The business plans of the next 10,000 startups are easy to forecast: " +
"Take X and add AI."
},
{
"id": 1,
"author": "Stephen Hawking",
"quote": "The development of full artificial intelligence could " +
"spell the end of the human race… " +
"It would take off on its own, and re-design " +
"itself at an ever increasing rate. " +
"Humans, who are limited by slow biological evolution, " +
"couldn't compete, and would be superseded."
},
{
"id": 2,
"author": "Claude Shannon",
"quote": "I visualize a time when we will be to robots what " +
"dogs are to humans, " +
"and I’m rooting for the machines."
},
{
"id": 3,
"author": "Elon Musk",
"quote": "The pace of progress in artificial intelligence " +
"(I’m not referring to narrow AI) " +
"is incredibly fast. Unless you have direct " +
"exposure to groups like Deepmind, " +
"you have no idea how fast — it is growing " +
"at a pace close to exponential. " +
"The risk of something seriously dangerous " +
"happening is in the five-year timeframe." +
"10 years at most."
},
{
"id": 4,
"author": "Geoffrey Hinton",
"quote": "I have always been convinced that the only way " +
"to get artificial intelligence to work " +
"is to do the computation in a way similar to the human brain. " +
"That is the goal I have been pursuing. We are making progress, " +
"though we still have lots to learn about " +
"how the brain actually works."
},
{
"id": 5,
"author": "Pedro Domingos",
"quote": "People worry that computers will " +
"get too smart and take over the world, " +
"but the real problem is that they're too stupid " +
"and they've already taken over the world."
},
{
"id": 6,
"author": "Alan Turing",
"quote": "It seems probable that once the machine thinking " +
"method had started, it would not take long " +
"to outstrip our feeble powers… " +
"They would be able to converse " +
"with each other to sharpen their wits. " +
"At some stage therefore, we should " +
"have to expect the machines to take control."
},
{
"id": 7,
"author": "Ray Kurzweil",
"quote": "Artificial intelligence will reach " +
"human levels by around 2029. " +
"Follow that out further to, say, 2045, " +
"we will have multiplied the intelligence, " +
"the human biological machine intelligence " +
"of our civilization a billion-fold."
},
{
"id": 8,
"author": "Sebastian Thrun",
"quote": "Nobody phrases it this way, but I think " +
"that artificial intelligence " +
"is almost a humanities discipline. It's really an attempt " +
"to understand human intelligence and human cognition."
},
{
"id": 9,
"author": "Andrew Ng",
"quote": "We're making this analogy that AI is the new electricity." +
"Electricity transformed industries: agriculture, " +
"transportation, communication, manufacturing."
}
]
Agora precisamos criar uma classe de recurso Quote que definirá as operações de nossos endpoints de API. Quatro métodos devem ser declarados dentro da classe: get, post, put, delete.
Vamos começar com o método GET
Ele permite que você obtenha uma cotação específica especificando seu ID ou uma cotação aleatória se nenhum ID for especificado.
class Quote(Resource):
def get(self, id=0):
if id == 0:
return random.choice(ai_quotes), 200
for quote in ai_quotes:
if(quote["id"] == id):
return quote, 200
return "Quote not found", 404
O método GET retorna uma citação aleatória se o ID contiver o valor padrão, ou seja, ao chamar o ID do método não foi definido.
Se estiver definido, o método pesquisa entre aspas e encontra aquela que contém o ID fornecido. Se nada for encontrado, a mensagem “Citação não encontrada, 404” é exibida.
Lembre-se, o método retorna um status HTTP de 200 se a solicitação for bem-sucedida e 404 se a entrada não for encontrada.
Agora vamos criar um método POST para adicionar uma nova citação ao repositório
Ele obterá o id de cada nova citação enquanto você digita. Além disso, o POST usará o reqparse para analisar os parâmetros que irão no corpo da solicitação (autor e texto da citação).
def post(self, id):
parser = reqparse.RequestParser()
parser.add_argument("author")
parser.add_argument("quote")
params = parser.parse_args()
for quote in ai_quotes:
if(id == quote["id"]):
return f"Quote with id {id} already exists", 400
quote = {
"id": int(id),
"author": params["author"],
"quote": params["quote"]
}
ai_quotes.append(quote)
return quote, 201
No código acima, o método POST aceitou um ID de cotação. Em seguida, usando reqparse, recuperou o autor e a citação da solicitação, armazenando-os no dicionário de parâmetros.
Se já existir uma cotação com o ID especificado, o método exibirá a mensagem apropriada e o código 400.
Se ainda não foi criada uma citação com o ID especificado, o método cria uma nova entrada com o ID e o autor especificados, além de outros parâmetros. Em seguida, adiciona uma entrada à lista ai_quotes e retorna uma entrada com uma nova cotação junto com um código 201.
Agora criamos um método PUT para alterar uma citação existente no repositório
O método PUT, semelhante ao exemplo anterior, usa um ID e uma entrada e analisa os parâmetros de cotação usando reqparse.
Se existir uma cotação com o ID especificado, o método irá atualizá-la com os novos parâmetros e então gerará a cotação atualizada com o código 200. Se ainda não houver cotação com o ID especificado, um novo registro com o código 201 será criado.
Por fim, vamos criar um método DELETE para remover uma citação que não é mais inspiradora.
def delete(self, id):
global ai_quotes
ai_quotes = [qoute for qoute in ai_quotes if qoute["id"] != id]
return f"Quote with id {id} is deleted.", 200
Este método usa o ID da cotação como entrada e atualiza a lista de ai_quotes usando a lista compartilhada.
Agora que criamos todos os métodos, tudo o que precisamos fazer é simplesmente adicionar o recurso à API, definir o caminho e executar o Flask.
api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
app.run(debug=True)
Nosso serviço REST API está pronto!
Em seguida, podemos salvar o código no arquivo app.py executando-o no console com o comando:
python3 app.py
Se tudo estiver bem, teremos algo assim:
* Modo de depuração: ativado
* Correndo em 127.0.0.1:5000/ (Pressione CTRL+C para sair)
* Reiniciando com stat
* O depurador está ativo!
* PIN do depurador: XXXXXXX
Testando a API
Depois que a API é criada, ela precisa ser testada.
Isso pode ser feito usando o utilitário de console curl ou o cliente Insomnia REST, ou publicando a API na API Rapid.
Publicando nossa API
RapidAPI é o maior mercado do mundo com mais de 10 APIs (e cerca de 000 milhão de desenvolvedores).
O RapidAPI não apenas fornece uma interface única para trabalhar com APIs de terceiros, mas também permite que você publique sua própria API de maneira rápida e fácil.
Para faça, primeiro você precisa publicá-lo em algum servidor da rede. No nosso caso, usaremos Heroku. Trabalhar com ele não deve causar nenhuma dificuldade, (Você pode descobrir mais sobre isso aqui).
Como publicar sua API no Heroku
1. Instale o Heroku.
A primeira etapa é registrar e instalar a interface de linha de comando (CLI) do Heroku. Isso funciona no Ubuntu 16+.
sudo snap install heroku --classic
Então nós logamos:
login do heroku
2. Adicione os arquivos necessários.
Agora precisamos adicionar os arquivos a serem publicados em uma pasta em nosso aplicativo:
requirements.txt com uma lista de módulos Python necessários;
Procfile, que especifica quais comandos devem ser executados para rodar a aplicação;
.gitignore - para excluir arquivos que não são necessários no servidor.
O arquivo requirements.txt conterá as seguintes linhas:
frasco
repousante
gunicórnio
Observe que adicionamos gunicorn (Python WSGI HTTP Server) à lista porque precisamos executar nosso aplicativo no servidor.
Procfile conterá:
web: gunicorn app: app
Conteúdo de .gitignore:
*.pyc
__pycache__/
Agora que os arquivos foram criados, vamos inicializar o repositório git e fazer o commit:
git init
git add
git commit -m "First API commit"
3. Crie um novo aplicativo Heroku.
heroku create
Enviando o branch master para o repositório Heroku remoto:
git push heroku master
Agora você pode começar abrindo o API Service com os comandos:
Depois que o serviço API for publicado no Heroku, você poderá adicioná-lo à API Rapid. Aqui documentação detalhada neste tópico.
1. Crie uma conta RapidAPI.
Registramos uma conta gratuita - isso pode ser feito usando Facebook, Google, GitHub.
2. Adicione API ao painel de controle.
3. Em seguida, insira informações gerais sobre sua API.
4. Depois de clicar em "Adicionar API", uma nova página aparece onde você pode inserir informações sobre nossa API.
5. Agora você pode inserir manualmente os endpoints da API ou baixar arquivo de arrogância usando OpenAPI.
Bem, agora você precisa definir os endpoints de nossa API na página Endpoints. No nosso caso, os endpoints correspondem ao conceito de CRUD (get, post, put, delete).
Em seguida, você precisa criar um endpoint GET AI Quote que exiba uma cotação aleatória (se o ID for padrão) ou uma cotação para o ID especificado.
Para criar um endpoint, você precisa clicar no botão “Create Endpoint”.
Repetimos esse processo para todos os outros endpoints da API. Isso é tudo! Parabéns, você publicou sua API!
Se tudo correr bem, a página da API ficará mais ou menos assim:
Conclusão
Neste artigo, percorremos o processo de criação de nosso próprio serviço de API RESTful em Python, juntamente com o processo de publicação da API na nuvem Heroku e adicioná-la ao diretório RapidAPI.
Mas na versão de teste, apenas os princípios básicos do desenvolvimento da API foram mostrados - nuances como segurança, tolerância a falhas e escalabilidade não foram consideradas.
Ao desenvolver uma API real, tudo isso deve ser levado em consideração.