Criando aplicações RESTful com Qt e Cutelyst
Web, C++, Qt e REST uma combinação perfeita. Veja como desenvolver um servidor e cliente RESTful, campeões de desempenho.
Parte 2: Parte 1 - Servidor RESTful com C++, Cutelyst e Qt
Primeiramente, criamos a aplicação do servidor:
cutelyst --create-app ServidorREST
E então iremos criar o Controller que terá os métodos da API:
cutelyst --controller ApiV1
Feito isso, a nova classe deve ser instanciada em serverrest.cpp, no método init() com:
Adicione os seguintes métodos ao arquivo "apiv1.h"
A macro C_ATTR é usada para adicionar metadados sobre a classe que o MOC ira guardar, dessa forma o Cutelyst sabe como mapear as URLs a essas funções.
Pronto, isso já é suficiente para termos um mapeamento automático dependendo do método HTTP para cada função, é importante notar que a primeira função (sem _MÉTODO) é sempre executada, para mais informações, veja a API do ActionREST.
Por brevidade, vou mostrar apenas o código do GET de usuários, o restante pode ser visto no GitHub:
Após todos os métodos implementados inicie o servidor:
# cutelyst -r --server
Para testar a API pode testar um POST com o curl:
# curl -H "Content-Type: application/json" -X POST -d '{"nome":"fulano","idade":32}' http://localhost:3000/api/v1/usuarios
Pronto, você já tem uma aplicação servidor REST, feita em Qt, com uma das mais respostas mais rápidas do velho oeste! :)
Não, é sério, confira os benchmarks em: https://www.techempower.com/benchmarks/
Agora vamos para parte 2, que é criar a aplicação cliente que irá consumir essa API.
cutelyst --create-app ServidorREST
E então iremos criar o Controller que terá os métodos da API:
cutelyst --controller ApiV1
Feito isso, a nova classe deve ser instanciada em serverrest.cpp, no método init() com:
#include "apiv1.h"
bool ServerREST::init() {
new ApiV1(this);
...
Adicione os seguintes métodos ao arquivo "apiv1.h"
C_ATTR(usuarios, :Local :AutoArgs :ActionClass(REST))
void usuarios(Context *c);
C_ATTR(usuarios_GET, :Private)
void usuarios_GET(Context *c);
C_ATTR(usuarios_POST, :Private)
void usuarios_POST(Context *c);
C_ATTR(usuarios_uuid, :Path('usuarios') :AutoArgs :ActionClass(REST))
void usuarios_uuid(Context *c, const QString &uuid);
C_ATTR(usuarios_uuid_GET, :Private)
void usuarios_uuid_GET(Context *c, const QString &uuid);
C_ATTR(usuarios_uuid_PUT, :Private)
void usuarios_uuid_PUT(Context *c, const QString &uuid);
C_ATTR(usuarios_uuid_DELETE, :Private)
void usuarios_uuid_DELETE(Context *c, const QString &uuid);
A macro C_ATTR é usada para adicionar metadados sobre a classe que o MOC ira guardar, dessa forma o Cutelyst sabe como mapear as URLs a essas funções.
- :Local - mapeia o nome do método a URL gerando /api/v1/usuarios;
- :AutoArgs - verifica automaticamente o número de argumentos após o Context*, em usuários_uuid temos um logo o método será chamado caso a URL seja /api/v1/usuarios/qualquer-coisa;
- :ActionClass(REST) - irá carregar o plugin REST que criará uma classe Action para tomar conta desse método, ActionREST ira chamar os outros métodos dependendo do método chamado;
- :Private - registra a ação como privada no Cutelyst, de forma que ela não é diretamente acessível via URL.
Pronto, isso já é suficiente para termos um mapeamento automático dependendo do método HTTP para cada função, é importante notar que a primeira função (sem _MÉTODO) é sempre executada, para mais informações, veja a API do ActionREST.
Por brevidade, vou mostrar apenas o código do GET de usuários, o restante pode ser visto no GitHub:
void ApiV1::usuarios_GET(Context *c)
{
QSettings s;
const QStringList uuids = s.childGroups();
QJsonArray array;
for (const QString &uuid : uuids) {
array.append(uuid);
}
c->response()->setJsonBody(array);
}
Após todos os métodos implementados inicie o servidor:
# cutelyst -r --server
Para testar a API pode testar um POST com o curl:
# curl -H "Content-Type: application/json" -X POST -d '{"nome":"fulano","idade":32}' http://localhost:3000/api/v1/usuarios
Pronto, você já tem uma aplicação servidor REST, feita em Qt, com uma das mais respostas mais rápidas do velho oeste! :)
Não, é sério, confira os benchmarks em: https://www.techempower.com/benchmarks/
Agora vamos para parte 2, que é criar a aplicação cliente que irá consumir essa API.