Dynamische Datenfilterung in REST HTTP Backends mit NestJS und JSON-Query

Liam Goodman

Entwicklungsstrategie

REST

Moderne Webanwendungen kommunizieren häufig über REST HTTP Backends, um Daten zwischen dem Frontend und der Datenbank auszutauschen. Diese Anfragen an ein REST HTTP Backend können oft große Mengen an Daten als Antwort zurückgeben, die nicht immer in ihrer Gesamtheit benötigt werden. In den meisten Fällen interessiert sich der Client nur für einen bestimmten Teil der Daten – sei es aus Effizienzgründen oder weil der spezifische Anwendungsfall nur eine Teilmenge der Informationen erfordert. Wie kann man also sicherstellen, dass der Client nur die Daten erhält, die er tatsächlich benötigt, ohne dabei unnötige Datenmengen zu übertragen?

In diesem Blogartikel werden wir uns mögliche Lösungen für dieses Problem ansehen und dann ein praktisches Beispiel mit NestJS und der Library JSON-Query durchgehen, das zeigt, wie eine dynamische Filterung der Daten direkt im Backend umgesetzt werden kann.

Mögliche Lösungsansätze für das Datenfilterungsproblem

Wenn eine API große Datenmengen als Antwort liefert, aber nur ein Bruchteil der Daten wirklich benötigt wird, gibt es im Wesentlichen zwei gängige Ansätze, um das Problem zu lösen:

  1. Separate Endpunkte für verschiedene Use Cases erstellen: Für jeden spezifischen Anwendungsfall könnte man einen separaten Endpunkt definieren, der genau die Daten zurückgibt, die in diesem speziellen Fall benötigt werden. Dieser Ansatz hat den Vorteil, dass die API gut strukturiert und einfach zu verstehen ist, da jeder Endpunkt klar definiert ist und eine bestimmte Datenmenge liefert. Allerdings hat diese Lösung einen großen Nachteil: Die Anzahl der Endpunkte kann schnell wachsen, was die API insgesamt komplexer macht. Es ist auch nicht besonders flexibel, wenn sich die Anforderungen ändern, da für neue Anwendungsfälle immer neue Endpunkte erstellt werden müssten.
  2. Einen allgemeinen Endpunkt mit dynamischen Filtern verwenden: Der zweite Ansatz besteht darin, einen allgemeinen Endpunkt zu erstellen, der Filterparameter entgegennimmt. Der Client kann bei jeder Anfrage dynamisch definieren, welche Daten benötigt werden, und das Backend passt die Antwort entsprechend an. Dies ist wesentlich flexibler und reduziert die Anzahl der Endpunkte erheblich. Der Nachteil besteht darin, dass die Implementierung komplexer ist, da das Backend in der Lage sein muss, die Filter dynamisch auszuwerten und die Daten entsprechend zu manipulieren.

In der Praxis erweist sich der zweite Ansatz als besonders mächtig, da er eine API flexibler und wartungsfreundlicher macht. Sehen wir uns nun ein Beispiel an, wie dies mit dem beliebten Framework NestJS und der Library JSON-Query umgesetzt werden kann.

Beispiel für die Datenfilterung mit NestJS und JSON-Query

Technologie-Stack: NestJS und JSON-Query

NestJS ist ein beliebtes Backend-Framework für Node.js, das auf TypeScript basiert und eine starke Modularität und Flexibilität bietet. In diesem Artikel haben wir bereits über Struktur von NestJS-Projekten gesprochen. Es wird häufig für die Erstellung von REST-APIs verwendet. In Kombination mit der Library JSON-Query, die es ermöglicht, Daten aus JSON-Objekten effizient zu filtern, lässt sich ein leistungsstarker Mechanismus zur dynamischen Filterung von API-Antworten aufbauen.

Funktionsweise des Filters

Die Idee hinter dieser Implementierung ist, dass jede Anfrage an den allgemeinen Endpunkt des Backends eine Reihe von Query-Strings enthält. Diese Query-Strings spezifizieren, welche Daten der Client benötigt. In der Middleware des Backends werden die Daten, die als Antwort zurückgegeben werden sollen, mithilfe von JSON-Query gefiltert und entsprechend modifiziert. Das Ergebnis ist eine maßgeschneiderte Antwort, die nur die angeforderten Daten enthält.

Schauen wir uns den Prozess genauer an:

  1. Anfrage erhalten: Die API erhält eine Anfrage, die Query-Strings enthält, welche bestimmen, welche Daten der Client benötigt.
  2. Middleware greift auf die Anfrage zu: Die Middleware des Backends liest die Query-Strings aus der Anfrage aus.
  3. Daten filtern: Mithilfe der JSON-Query-Library wird das Antwortobjekt gefiltert, um nur die vom Client angeforderten Daten zu extrahieren.
  4. Neuer Response-Body: Aus den gefilterten Daten wird ein neuer Response-Body erstellt und an den Client zurückgesendet.

Mit diesen vier Schritten kann jeder Datensatz gefiltert und auf die benötigten Daten reduziert werden.

Beispiel

user: {
        firstname: "John",
        lastname: "Doe",
        age: 25,
        email: "samples@example.com",
        address: {
          street: "123 Main St",
          city: "New York",
          state: "NY",
          zip: "10001"
        }
      },
      comments: {
        count: 120,
        data: [
          {
            id: 1,
            user: {
              id: 1,
              name: "John Doe"
            },
            message: "Hello World"
          },
          {
            id: 2,
            user: {
              id: 2,
              name: "Jane Doe"
            },
            message: "Hello World"
          }
        ]
      }
      }

Als anschauliches Beispiel dient dieser Datensatz. Er beinhaltet sowohl den User als auch dessen Kommentare. Gehen wir nun davon aus, dass das Frontend nur den firstname, lastname, street und den count haben möchte, kann mit diesen Filtern:

['user.firstname', 'user.lastname', 'user.address.street', 'comments.count']

folgender Datensatz erzeugt werden:

{
  "firstname": "John",
  "lastname": "Doe",
  "street": "123 Main St",
  "count": 120
}

Wie wir sehen, wurde die Antwort erheblich reduziert und enthält nur die Felder, die für den aktuellen Anwendungsfall relevant sind.

Wichtige Überlegungen

Bei der Implementierung dieser Lösung sollten einige Punkte beachtet werden:

  • Veränderte Datenstruktur: Die Struktur der Antwort kann sich durch die Filterung erheblich ändern.. Es ist wichtig, sicherzustellen, dass das Frontend auf die dynamisch gefilterten Antworten vorbereitet ist.
  • Doppelte Keys: Wenn in den Query-Strings doppelte Keys verwendet werden, kann es zu Problemen kommen. Hier muss die Implementierung sorgfältig gestaltet werden, um solche Kollisionen zu vermeiden.

Fazit

Der Einsatz eines allgemeinen Endpunkts, der dynamische Filter unterstützt, ist eine elegante und flexible Lösung für das Problem der Datenfilterung in REST HTTP Backends. Durch die Kombination von NestJS und JSON-Query können Entwickler eine maßgeschneiderte und effiziente API erstellen, die nur die relevanten Daten an den Client sendet und somit die Effizienz der Anwendung steigert.

Zurück

Kontaktieren Sie uns

Wir melden uns schnellstmöglich, um Sie bei Ihrem Anliegen zu unterstützen.
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.