Digamos que eu tenha uma descrição legível por máquina (como WADL , Swagger ou RAML ) de uma API REST que fornece interface para um banco de dados.
Meus usuários enviam consultas sobre o banco de dados subjacente na forma de SQL ou linguagem de consulta semelhante. No entanto, não consigo acessar o banco de dados diretamente, apenas através da API REST.
Que abordagem você escolheria para criar (de preferência semi-automaticamente a partir da descrição) um sistema que traduz essas consultas SQL em uma sequência de solicitações para a API REST fornecida?
Como você representaria esse problema? Existem algoritmos, marcos teóricos ou ferramentas que podem ajudar?
A API REST suporta:
- operações somente leitura, ou seja, apenas
SELECT
consultas SQL - Projeções XPartial (por exemplo
/persons?fields=firstname,lastname
) - Restrições RSQL (
/persons?query=firstname==John;department.code==42
, veja outros exemplos ).
Algumas referências entre tabelas (chaves estrangeiras) são representadas como atributos na API REST (como Person.department
no exemplo de restrições acima), mas algumas referências são representadas como sub-fonte (por exemplo /persons/{userName}/projects
). Isso significa que algumas consultas requerem a criação de "um plano" para ser respondido em termos de solicitações REST.
Por exemplo: a consulta para "nomes de projetos ativos de Chuck Norris" seria traduzida para:
/persons?query=firstname==Chuck;lastname==Norris
- Obter
userName
do resultado /projects/{userName}?fields=name&query=state==ACTIVE
Respostas:
Tecnicamente, a linguagem de consulta é apenas outro padrão que o serviço REST deve entender. Não é necessário mapear para consultar parâmetros. Por exemplo, pelo Hydra, é possível definir um único parâmetro de consulta que contém, por exemplo, um SQL. Tudo o que você precisa é de um vocabulário no qual possa descrever SQLs e de um cliente que possa criar SQL e um servidor que possa entender SQL. O vocabulário comum é o contrato entre o cliente e o servidor neste caso. Alguns falam sobre isso. Para não precisar criar uma linguagem de consulta própria, você pode reutilizar qualquer linguagem de consulta existente ...
WADL e outras linguagens de descrição do REST são um péssimo começo, porque o REST tem uma restrição uniforme de interface / HATEOAS, que afirma que os clientes precisam usar hiperlinks para alterar seu estado. Os clientes devem decidir qual hiperlink escolher verificando sua semântica. Os metadados do link (por exemplo, relação de link) contêm essa semântica ... Por idiomas como WADL, não há links, metadados ou semântica de links e, portanto, o cliente REST não pode ser reutilizado, pois não é dissociado do serviço REST. : S
fonte