Esse mini tutorial tem como objetivo mostrar os fundamentos da criação de uma aplicação
RESTful com
Qt, como cliente e como servidor com o auxilio do
Cutelyst.
Serviços com APIs REST se tornaram muito populares nos últimos anos, e interagir com eles pode ser necessário para integrar com serviços e manter sua aplicação relevante, assim como pode ser interessante substituir seu protocolo próprio com uma implementação REST.
REST é muito associado a JSON, porém, para um serviço se caracterizar REST não é necessário utilizar JSON. A forma como os dados são trocados é escolhida por quem define a API, ou seja é possível ter REST trocando mensagens em XML ou outro formato.
Iremos utilizar JSON por sua popularidade, simplicidade e devido a classe QJsonDocument ser presente no módulo Core do Qt.
Um serviço REST é caracterizado principalmente por fazer uso dos métodos e cabeçalhos (headers) pouco utilizados do HTTP, navegadores utilizam basicamente GET para obter dados e POST para enviar dados de formulários e arquivos, porém clientes REST farão uso de métodos como DELETE, PUT e HEAD, se tratando de cabeçalhos muitas APIs definem cabeçalhos para autenticação, por exemplo, X-Applicativo-Token pode conter uma chave gerada apenas para o aplicativo de um usuário X, de forma que se esse cabeçalho não contiver os dados corretos ele não terá acesso aos dados.
Vamos começar definindo a API do servidor:
- /api/v1/usuarios
GET - Obtém a lista de usuários
Resposta: [ "uuid1", "uuid2" ]
POST - Cadastra novo usuário
Envie: { "nome": "fulano", "idade": 32 }
Resposta: { "status": "ok/erro", "uuid": "uuid do novo usuário", "erro": "msg em caso de erro" }
- /api/v1/usuarios/<UUID> - onde UUID deve ser substituído pelo UUID do usuário
GET - Obtém informações do usuário
Resposta: { "nome": "fulano", "idade": 32 }
PUT - Atualiza informações do usuário
Envie: { "nome": "fulano de tal", "idade": 57 }
Resposta: { "status": "ok/erro", "erro": "msg em caso de erro" }
DELETE - Apaga o usuário
Resposta: { "status": "ok/erro", "erro": "msg em caso de erro" }
Por motivos de simplicidade, iremos armazenar os dados utilizando
QSettings. Não recomendo para aplicações reais, mas foge do escopo utilizar SQL ou algo do tipo.
Também assumimos que já tem o Qt e o Cutelyst instalados, o código estará disponível em:
https://github.com/ceciletti/example-qt-cutelyst-rest