Dynamische und zustandsbehaftete Mock-Server

APIGit

2022-10-15

APIGit unterstützt dynamische, zustandsbehaftete und programmierbare Mock-Server, um jede beliebige komplexe Geschäftslogik mit Leichtigkeit zu simulieren. HTTP-Anforderungsnachrichten werden verarbeitet, indem Routen mit mock.define() definiert und ein URL-Muster, ein HTTP-Verb und eine Rückruffunktion bereitgestellt werden. Zum Beispiel:

mock.define('/users', 'GET', function(req, res) {
    ...
  })

oder für eine POST-Methode:

mock.define('/users', 'POST', function(req, res) {
    ...
  })

Standard-HTTP-Methoden wie 'DELETE'-, 'PUT'- und 'OPTIONS'-Methoden werden unterstützt. Der von Ihnen bereitgestellten Callback-Funktion werden immer zwei Objekte als Parameter übergeben, das Request- und das Response-Objekt. Das Request-Objekt enthält alle Daten, die sich auf die eingehende Anfrage beziehen, wie Header, Body-Payload und Parameter. Wir verwenden das Response-Objekt, um Antworten auf die Anfrage zu erstellen.

Lassen Sie uns das obige Beispiel erweitern und mit dem Aufbau eines einfachen CRUD-Dienstes für Benutzer beginnen. Lassen Sie uns zunächst eine Route definieren, um eine Gruppe von Benutzern zurückzugeben:

mock.define('/users', 'GET', function(req, res) {
    var users = [ 
      { username: "dave", email: "dave@gmail.com" },
      { username: "john", email: "john@gmail.com" }
    ]
  
    return res.json(users)
  })

Der res.json-Aufruf sendet eine JSON-Antwort an die aufrufende Anwendung. Denken Sie daran, eine Antwortfunktion für das res-Objekt aufzurufen, da Ihr Dienst ohne sie eine Zeitüberschreitung hat und kein erfolgreiches Ergebnis zurückgibt. Auf die anderen verfügbaren Antwortfunktionen gehen wir später ein

Lassen Sie uns mithilfe von Abfrageparametern Unterstützung für das Filtern basierend auf dem Alter des Benutzers hinzufügen. req.query ist ein Objekt, das die geparste Abfragezeichenfolge enthält, standardmäßig {}. Wenn wir eine Anfrage für „GET /users?age=30“ senden, können wir mit req.query.age auf den Alterswert zugreifen:

mock.define('/users', 'GET', function(req, res) {
    var users = [
      { username: "dave", email: "dave@gmail.com", age: 32 },
      { username: "john", email: "john@gmail.com", age: 30 }
    ]
  
    if (req.query.age) {
      // convert req.query.age from String to a Number before filtering
      return res.json(_.filter(users, { 'age': Number(req.query.age) }))
    }
  
    return res.json(users)
  })

Wir verwenden die Funktion LoDash _.filter, um ein Array von Benutzern zu extrahieren, die dem angegebenen Alter entsprechen. Wenn kein Benutzer den Alterskriterien entspricht, wird ein leeres Array zurückgegeben. Die vollständige LoDash-Bibliothek steht zur Verfügung und bietet nützliche Funktionen zum Bearbeiten von Arrays und Objekten.

Um unsere Route zum Abrufen eines einzelnen Benutzers zu erstellen, verwenden wir Routenparameter als Teil des URL-Pfads des Dienstes. Routenparameter werden mithilfe der {route_param_name}-Syntax angegeben, sodass in unserem Beispiel der URL-Pfad zum Abrufen eines Benutzers anhand seines Benutzernamens /users/{username} lautet. req.params ist ein Objekt, das Eigenschaften enthält, die den benannten Routenparametern zugeordnet sind, und unser Benutzername ist als req.params.username verfügbar.

mock.define('/users/{username}', 'GET', function(req, res) {
    var users = [
      { username: "dave", email: "dave@gmail.com", age: 32 },
      { username: "john", email: "john@gmail.com", age: 30 }
    ]
  
    // respond with the user or an empty object if user doesnt exist
    return res.json(_.find(users, { 'username': req.params.username }) || {})
  })

Lassen Sie uns eine Route zum Erstellen von Benutzern hinzufügen. Wir überprüfen, ob ein Benutzername mit der Anfrage gesendet wurde, und antworten mit einem 400-Fehler, wenn er fehlt. Auf Daten, die in POST-Anforderungen als Body-Payload gesendet werden, kann über das req.body-Objekt zugegriffen werden.

mock.define('/users', 'POST', function(req, res) {
    // validate username is present
    if (req.body.username === undefined) {
      return res.json(400, { error: { message: "Missing username" } })
    }
  
    return res.json({ status: "ok" })
  })

Standardmäßig geben alle Antworten eine 200 zurück. Wenn eine Zahl als einziger Parameter für res.json angegeben wird, wird Ihnen eine Antworttextzeichenfolge zugewiesen. Beispielsweise antwortet 400 mit „Bad Request“. Wir haben im obigen Beispiel eine benutzerdefinierte Fehlermeldung angegeben.

Das ist ein solider Anfang, Sie können viel mit Diensten machen, die einfache vorgefertigte Antworten zurückgeben, aber sie bringen Sie nur so weit. Lassen Sie uns damit fortfahren, unseren Diensten realistisches Verhalten hinzuzufügen, indem Daten gespeichert und Antworten dynamisch generiert werden.