it-swarm-eu.dev

Ist es schlecht, API-Endpunkte intern aus der API-Instanz heraus aufzurufen?

Für den Kontext führe ich eine REST API aus, die mit Node.js erstellt wurde. Aufgrund von Rückrufen und einigen komplexen DB-Aufrufen habe ich eine Kette von Funktionen, die asynchron, aber auch einzigartig sind Redundanz reduzieren. Ich hatte die Idee, meine eigenen Endpunkte (verschiedene Endpunkte) aus dem Code heraus aufzurufen, damit ich die Redundanz reduzieren kann. Ist das eine schlechte Praxis?

Zum Beispiel hätte ich:

app.get("/puppies/:id"...)  // Simple get by ID endpoint

app.post("/puppies"...)  // Simple puppy update, but checks an attribute of puppy first by getting by ID

Im Post-Endpunkt wäre es schön, einfach den "get" -Endpunkt innerhalb der Postleitzahl aufzurufen, aber es fühlt sich schmutzig an. Gedanken?

7
DonutGaz
  1. Es nützt wenig, eine HTTP-Anfrage tatsächlich auszuführen.

    Wenn die zugrunde liegende Anwendung die GET-Anforderung aus Ihrem Beispiel verarbeitet, ruft sie wahrscheinlich die Geschäftsschicht auf, die einige Eingabeprüfungen durchführt, und ruft dann die Datenzugriffsschicht auf, die den Welpen abruft.

    In ähnlicher Weise könnte die Anforderung POST] anstelle eines zusätzlichen GET einfach die Geschäftsschicht auffordern, den Welpen zu aktualisieren. Die Geschäftsschicht beginnt wiederum mit dem Aufruf des Datenzugriffs Schichtmethode, die den entsprechenden Welpen abruft.

  2. Das Ausführen einer zusätzlichen HTTP-Anforderung hat jedoch mehrere Nachteile.

    • Es würde Leistungskosten geben. Zum Beispiel werden Sie Eingaben zweimal bereinigen, während es ausreicht, dies einmal zu tun. Das Erstellen und Verarbeiten eines HTTP-Kontexts ist ebenfalls mit Kosten verbunden. Es ist nicht riesig, aber warum sollte man es hinzufügen, wenn man es so einfach vermeiden kann?

    • Dies macht Ihre Anwendung komplizierter, als es sein sollte. Warum sollten Sie eine HTTP-Anfrage stellen, während sich die benötigten Daten direkt vor Ihnen befinden (d. H. In der Schnittstelle der Datenzugriffsschicht)?

      Und ich erwähne nicht einmal den zusätzlichen Code, den Sie benötigen. Wie konfigurieren Sie beispielsweise den URI des aufzurufenden Dienstes? Wird es in die Konfiguration versetzt (wenn ja, was würde passieren, wenn der Dienst verschoben wird) oder wird es im laufenden Betrieb generiert (in diesem Fall, wie lange Sie brauchen, um die richtige Lösung zu finden, die die Ports relativ behandelt) URIs, HTTP/HTTPS usw.?)

    • Es wird eine zusätzliche Zeile zu Ihren App Server-Protokollen hinzugefügt. Und die Protokolle der Reverse-Proxys.

    • Dadurch wird es schwieriger, den Code umzugestalten. Bei der Lösung, bei der die Geschäftsschicht beispielsweise die Methode der Datenzugriffsschicht aufruft, mit der ein Welpe abgerufen wird, ist es ganz natürlich, die Logik nach unten zu verschieben - in der Datenzugriffsschicht in Form einer Abfrage oder möglicherweise in der Datenbank selbst . Wenn Sie dagegen eine HTTP-Anforderung ausführen, wird die Logik hinter der GET-Anforderung vollständig abstrahiert, sodass eine spätere Optimierung nicht möglich ist.

14

Ja, es ist schlecht (tm).

Der zusätzliche Aufwand für das Tätigen des http-Anrufs wird wahrscheinlich kein großer Faktor sein, obwohl er unnötig ist.

Ich denke, die wirklichen Gefahren sind:

  • Die versehentliche Einführung von Endlosschleifen. dh Postanrufe erhalten und Anrufe abrufen Post oder ähnliche Szenarien.

  • Nicht eingerückte Caching-Effekte

  • http-Serverprobleme, maximale Anforderungen auf dem Server usw.

  • Threading-Probleme, wenn Sie den Anruf tätigen und darauf warten, dass er asynchron verarbeitet wird

Grundsätzlich viele Kleinigkeiten, die Ihren Code nicht beschädigen, aber definitiv Probleme verursachen, über die Sie sich lieber keine Sorgen machen müssen.

In jedem Fall sollte Ihr Code so strukturiert sein, dass es einfach ist, den get-Aufruf oder einen Teil davon direkt zu tätigen. ohne die http-Ebene zu treffen. Es hört sich so an, als hätten Sie Ihren Code nicht in eine Business-Schicht eingefügt

5
Ewan

Ich weiß nicht, ob es schlecht oder gut ist, aber Wordpress erlaubt es in seinem Rest-API-Framework. Es heißt " interne Anfrage " und hat den Zweck, es zu tun Erleichtern Sie das Erstellen von Stapelanforderungen (wie in Ihrem Beispiel). Die Methode zum Erstellen interner Anforderungen akzeptiert das Anforderungsobjekt und keine URL. Lesen Sie einfach den Artikel, um eine Vorstellung davon zu erhalten, wie Sie ihn in Ihrer Lösung codieren können.

0
Marecky