Wie übersetze ich eine SQL-Abfrage in REST-API-Anforderungen?

8

Angenommen , ich habe eine maschinenlesbare Beschreibung (z. B. in WADL , Swagger oder RAML ) einer REST-API, die eine Schnittstelle zu einer Datenbank bereitstellt.

Meine Benutzer senden Anfragen zur zugrunde liegenden Datenbank in Form von SQL oder einer ähnlichen Abfragesprache. Ich kann jedoch nicht direkt auf die Datenbank zugreifen, sondern nur über die REST-API.

Welchen Ansatz würden Sie wählen, um ein System zu erstellen (vorzugsweise halbautomatisch aus der Beschreibung), das solche SQL-Abfragen in eine Folge von Anforderungen an eine bestimmte REST-API übersetzt?

Wie würden Sie ein solches Problem darstellen? Gibt es Algorithmen, theoretische Rahmenbedingungen oder Werkzeuge, die helfen können?

Die REST-API unterstützt:

  • schreibgeschützte Operationen, dh nur SELECTSQL-Abfragen
  • XPartial Projektionen (zB /persons?fields=firstname,lastname)
  • RSQL- Einschränkungen ( /persons?query=firstname==John;department.code==42siehe andere Beispiele ).

Einige Referenzen zwischen Tabellen (Fremdschlüssel) werden in der REST-API als Attribute dargestellt (wie Person.departmentim obigen Beispiel für Einschränkungen), einige Referenzen werden jedoch als Unterressourcen dargestellt (z /persons/{userName}/projects. B. ). Dies bedeutet, dass für einige Anfragen ein "Plan" erstellt werden muss, der im Hinblick auf REST-Anforderungen beantwortet werden soll.

Beispiel: Die Abfrage nach "Namen aktiver Projekte von Chuck Norris" würde bedeuten:

  1. /persons?query=firstname==Chuck;lastname==Norris
  2. Erhalten userNamevon Ergebnis
  3. /projects/{userName}?fields=name&query=state==ACTIVE
Jakub Stejskal
quelle
2
Ich bin nur neugierig, was entwickelst du? ;)
Jakub Jirutka
@JakubJirutka Ich versuche, eine Schnittstelle in natürlicher Sprache zur Datenbank (NLIDB) auf KOSapi aufzubauen. Eigentlich wollte ich Sie bezüglich Details zu RSQL kontaktieren, damit ich bei Interesse weitere Informationen zu meinem Projekt einbringen kann.
Jakub Stejskal
Zu Beginn der Frage sagen Sie, dass Benutzerabfragen in SQL oder einer ähnlichen Abfragesprache ausgeführt werden. Ihr Beispiel lautet jedoch "Namen aktiver Projekte von Chuck Norris". Ist dies ein echtes Beispiel dafür, was Sie analysieren müssten?
Mike Partridge
So etwas wie eine XML-Datei sollte verwendet werden, um REST-Aufrufe SQL zuzuordnen. Für zB gist.github.com/d3ep4k/7da96e35bf778e69c53d
Sorter

Antworten:

1

Technisch gesehen ist die Abfragesprache nur ein weiterer Standard, den der REST-Service verstehen sollte. Es ist keine Zuordnung erforderlich, um Parameter abzufragen. Zum Beispiel ist es von Hydra möglich, einen einzelnen Abfrageparameter zu definieren, der zum Beispiel eine SQL enthält. Alles, was Sie brauchen, ist ein Vokabular, in dem Sie SQLs beschreiben können, und ein Client, der SQL erstellen kann, und ein Server, der SQL verstehen kann. Das gemeinsame Vokabular ist in diesem Fall der Vertrag zwischen dem Client und dem Server. Einige reden darüber. Sie müssen also keine eigene Abfragesprache erstellen, sondern können jede vorhandene Abfragesprache wiederverwenden ...

WADL und andere REST-Beschreibungssprachen sind ein schlechter Start, da REST eine einheitliche Schnittstelle / HATEOAS-Einschränkung hat, die besagt, dass die Clients Hyperlinks verwenden müssen, um ihren Status zu ändern. Die Clients sollten entscheiden, welchen Hyperlink sie wählen möchten, indem sie ihre Semantik überprüfen. Die Link-Metadaten (z. B. Link-Beziehung) enthalten diese Semantik ... In Sprachen wie WADL gibt es keine Links, Link-Metadaten oder Semantik, sodass der REST-Client nicht wiederverwendet werden kann, da er nicht vom REST-Service entkoppelt ist. : S.

inf3rno
quelle