Como converter a consulta SQL em solicitações da API REST?

8

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 SELECTconsultas 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.departmentno 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:

  1. /persons?query=firstname==Chuck;lastname==Norris
  2. Obter userNamedo resultado
  3. /projects/{userName}?fields=name&query=state==ACTIVE
Jakub Stejskal
fonte
2
Só estou curioso, o que você está desenvolvendo? ;)
Jakub Jirutka
@JakubJirutka Estou tentando criar uma interface de linguagem natural para o banco de dados (NLIDB) sobre o KOSapi. Na verdade, eu entraria em contato com você sobre detalhes sobre o RSQL, para que eu possa fornecer mais informações sobre o meu projeto, se você estiver interessado.
Jakub Stejskal
No início da pergunta, você diz que as consultas dos usuários estariam no SQL ou em uma linguagem de consulta semelhante, mas seu exemplo é "nomes de projetos ativos de Chuck Norris". Este é um exemplo real do que você precisaria analisar?
9118 Mike Partridge #
Algo como um arquivo XML deve ser usado para mapear chamadas REST para SQL. Por exemplo, gist.github.com/d3ep4k/7da96e35bf778e69c53d
Classificador

Respostas:

1

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

inf3rno
fonte