SuperAgent – ​​elegante API für AJAX in Node und Browsern (2023)

SuperAgent ist eine schlanke progressive Ajax-API, die auf Flexibilität, Lesbarkeit und eine geringe Lernkurve ausgelegt ist, nachdem sie mit vielen der vorhandenen Anforderungs-APIs frustriert war. Es funktioniert auch mit Node.js!

request .post('/api/pet') .send({ Name: 'Manny', Species: 'cat' }) .set('X-API-Key', 'foobar') .set('Accept', 'application/json') .then(res => { Alert('yay got ' + JSON.stringify(res.body)); });

Testdokumentation

Chinesisches Dokument

Die folgendeTestdokumentationwurde mit generiertMokkas„doc“-Reporter und spiegelt direkt die Testsuite wider. Dies stellt eine zusätzliche Dokumentationsquelle dar.

Grundlagen anfordern

Eine Anfrage kann durch Aufrufen der entsprechenden Methode initiiert werdenAnfrageObjekt, dann Aufruf.Dann()(oder.Ende() oder warten), um die Anfrage zu senden. Zum Beispiel ein einfachesERHALTENAnfrage:

request .get('/search') .then(res => { // res.body, res.headers, res.status }) .catch(err => { // err.message, err.response });

Die HTTP-Methode kann auch als String übergeben werden:

request('GET', '/search').then(success, failed);

Rückrufe im alten Stil werden ebenfalls unterstützt, aber nicht empfohlen.Anstatt .Dann()Du kannst anrufen.Ende():

request('GET', '/search').end(function(err, res){ if (res.ok) {} });

Es können absolute URLs verwendet werden. In Webbrowsern funktionieren absolute URLs nur, wenn der Server sie implementiertCORS.

request .get('https://example.com/search') .then(res => { });

DerKnotenDer Kunde unterstützt das Stellen von Anfragen anUnix-Domänen-Sockets:

// Muster: https?+unix://SOCKET_PATH/REQUEST_PATH // „%2F“ als „/“ in SOCKET_PATH verwenden try { const res = waiting request .get('http+unix://%2Fabsolute%2Fpath%2Fto %2Funix.sock/search'); // res.body, res.headers, res.status } Catch(err) { // err.message, err.response }

LÖSCHEN,KOPF,PATCH,POST, UndSETZENAnfragen können ebenfalls verwendet werden, ändern Sie einfach den Methodennamen:

request .head('/favicon.ico') .then(res => { });

LÖSCHENkann auch als bezeichnet werden.des()für Kompatibilität mit altem IE wolöschenist ein reserviertes Wort.

Die HTTP-Methode ist standardmäßig aufERHALTEN, wenn Sie es also wünschen, gilt Folgendes:

request('/search', (err, res) => { });

Verwendung von HTTP/2

Um eine Anfrage nur über das HTTP/2-Protokoll (ohne HTTP/1.x-Fallback) zu stellen, verwenden Sie die.http2()Methode.

const request = require('superagent'); const res = auf Anfrage warten .get('https://example.com/h2') .http2();

Header-Felder festlegen

Das Festlegen von Header-Feldern ist einfach: Aufrufen.Satz()mit einem Feldnamen und einem Wert:

request .get('/search') .set('API-Key', 'foobar') .set('Accept', 'application/json') .then(callback);

Sie können auch ein Objekt übergeben, um mehrere Felder in einem einzigen Aufruf festzulegen:

request .get('/search') .set({ 'API-Key': 'foobar', Accept: 'application/json' }) .then(callback);

ERHALTENAnfragen

Der.Anfrage()Die Methode akzeptiert Objekte, die bei Verwendung mit derERHALTENDie Methode bildet eine Abfragezeichenfolge. Im Folgenden wird der Pfad erstellt/search?query=Manny&range=1..5&order=desc.

request .get('/search') .query({ query: 'Manny' }) .query({ range: '1..5' }) .query({ order: 'desc' }) .then(res = > { });

Oder als einzelnes Objekt:

request .get('/search') .query({ query: 'Manny', range: '1..5', order: 'desc' }) .then(res => { });

Der.Anfrage()Die Methode akzeptiert auch Zeichenfolgen:

request .get('/querystring') .query('search=Manny&range=1..5') .then(res => { });

Oder beigetreten:

request .get('/querystring') .query('search=Manny') .query('range=1..5') .then(res => { });

KOPFAnfragen

Sie können auch die verwenden.Anfrage()Methode für HEAD-Anfragen. Im Folgenden wird der Pfad erstellt/users?email=joe@smith.com.

request .head('/users') .query({ email: 'joe@smith.com' }) .then(res => { });

POST/SETZENAnfragen

Ein typisches JSONPOSTDie Anfrage könnte etwa wie folgt aussehen, wobei wir das Content-Type-Headerfeld entsprechend festlegen und einige Daten „schreiben“, in diesem Fall nur einen JSON-String.

request.post('/user') .set('Content-Type', 'application/json') .send('{"name": "tj", "pet": "tobi"}') .then( Rückruf) .catch(errorCallback)

Da JSON zweifellos am häufigsten vorkommt, ist es dasStandard! Das folgende Beispiel entspricht dem vorherigen.

request.post('/user') .send({ name: 'tj', pet: 'tobi' }) .then(callback, errorCallback)

Oder mehrere verwenden.schicken()Anrufe:

request.post('/user') .send({ name: 'tj' }) .send({ pet: 'tobi' }) .then(callback, errorCallback)

Standardmäßig wird das Senden von Zeichenfolgen festgelegtInhaltstypZuapplication/x-www-form-urlencoded, mehrere Anrufe werden mit verkettet&, hier resultierend inname=tj&pet=tobi:

request.post('/user') .send('name=tj') .send('pet=tobi') .then(callback, errorCallback);

SuperAgent-Formate sind erweiterbar, standardmäßig werden jedoch „json“ und „form“ unterstützt. Um die Daten zu senden alsapplication/x-www-form-urlencodedeinfach aufrufen.Typ()mit „form“, wobei der Standardwert „json“ ist. Diese Anfrage wirdPOSTder Körper „name=tj&pet=tobi“.

request.post('/user') .type('form') .send({ name: 'tj' }) .send({ pet: 'tobi' }) .then(callback, errorCallback)

Senden einerFormulardatenObjekt wird ebenfalls unterstützt. Das folgende Beispiel wirdPOSTder Inhalt des durch id="myForm" identifizierten HTML-Formulars:

request.post('/user') .send(new FormData(document.getElementById('myForm'))) .then(callback, errorCallback)

Einstellen derInhaltstyp

Die offensichtliche Lösung besteht darin, das zu verwenden.Satz()Methode:

request.post('/user') .set('Content-Type', 'application/json')

Als Kurzschrift die.Typ()Die Methode ist ebenfalls verfügbar und akzeptiert den kanonisierten MIME-Typnamen komplett mit Typ/Subtyp oder einfach den Erweiterungsnamen wie „xml“, „json“, „png“ usw.:

request.post('/user') .type('application/json') request.post('/user') .type('json') request.post('/user') .type('png')

Serialisieren des Anforderungstexts

SuperAgent serialisiert JSON und Formulare automatisch. Sie können die automatische Serialisierung auch für andere Typen einrichten:

request.serialize['application/xml'] = function (obj) { return 'string generic from obj';};// Von nun an werden alle Anfragen mit einem Inhaltstyp von// 'application/xml' automatisch serialisiert

Wenn Sie die Nutzlast in einem benutzerdefinierten Format senden möchten, können Sie die integrierte Serialisierung durch ersetzen.serialize()Methode auf Anfragebasis:

request .post('/user') .send({foo: 'bar'}) .serialize(obj => { return 'string generic from obj'; });

Anfragen werden wiederholt

Wenn gegeben.wiederholen()Bei dieser Methode wiederholt SuperAgent automatisch Anfragen, wenn sie vorübergehend fehlschlagen oder auf eine fehlerhafte Internetverbindung zurückzuführen sein könnten.

Diese Methode verfügt über zwei optionale Argumente: Anzahl der Wiederholungsversuche (Standard 1) und einen Rückruf. Es ruftRückruf(err, res)vor jedem erneuten Versuch. Der Rückruf kann zurückkommenWAHR/FALSCHum zu steuern, ob die Anfrage wiederholt werden soll (es wird jedoch immer die maximale Anzahl von Wiederholungen angewendet).

request .get('https://example.com/search') .retry(2) // oder: .retry(2, callback) .then(finished); .catch(fehlgeschlagen);

Verwenden.wiederholen()nur mit Anfragen, die es sindidempotent(d. h. mehrere Anfragen, die den Server erreichen, verursachen keine unerwünschten Nebenwirkungen wie Doppelkäufe).

Alle Anforderungsmethoden werden standardmäßig ausprobiert (das heißt, wenn Sie nicht möchten, dass POST-Anfragen erneut versucht werden, müssen Sie einen benutzerdefinierten Wiederholungsrückruf übergeben).

Standardmäßig werden die folgenden Statuscodes wiederholt:

  • 408
  • 413
  • 429
  • 500
  • 502
  • 503
  • 504
  • 521
  • 522
  • 524

Standardmäßig werden die folgenden Fehlercodes wiederholt:

  • 'ETIMEDOUT'
  • 'ECONNRESET'
  • 'EADDRINUS'
  • 'ECONNREFUSED'
  • 'EPIPE'
  • 'ENOTFOUND'
  • 'ENETUNREACH'
  • 'EAI_AGAIN'

Akzeptieren einstellen

In ähnlicher Weise wie die.Typ()Methode ist es auch möglich, die festzulegenAkzeptierenHeader über die Kurzschriftmethode.akzeptieren(). Welche Referenzenrequest.typesAußerdem können Sie entweder den vollständigen kanonisierten MIME-Typnamen angeben alsTyp/Subtypoder der Einfachheit halber die Erweiterungssuffixform „xml“, „json“, „png“ usw.:

request.get('/user') .accept('application/json') request.get('/user') .accept('json') request.post('/user') .accept('png')

Facebook und JSON akzeptieren

Wenn Sie die API von Facebook aufrufen, senden Sie unbedingt eineAkzeptieren: application/jsonHeader in Ihrer Anfrage. Wenn Sie dies nicht tun, antwortet Facebook mitInhaltstyp: Text/Javascript; Zeichensatz=UTF-8, die SuperAgent nicht analysiert und daherres.körperwird undefiniert sein. Sie können dies mit beiden tunreq.accept('json')oderreq.set('Accept', 'application/json'). SehenHeft 1078für Details.

Abfragezeichenfolgen

req.query(obj)ist eine Methode, die zum Aufbau einer Abfragezeichenfolge verwendet werden kann. Zum Beispiel bevölkern?format=json&dest=/loginauf einenPOST:

request .post('/') .query({ format: 'json' }) .query({ dest: '/login' }) .send({ post: 'data', hier: 'wahoo' }) .then (Ruf zurück);

Standardmäßig wird die Abfragezeichenfolge nicht in einer bestimmten Reihenfolge zusammengestellt. Eine asziibisch sortierte Abfragezeichenfolge kann mit aktiviert werdenreq.sortQuery(). Sie können auch eine benutzerdefinierte Sortiervergleichsfunktion bereitstellenreq.sortQuery(myComparisonFn). Die Vergleichsfunktion sollte zwei Argumente annehmen und eine negative/null/positive Ganzzahl zurückgeben.

// Standardreihenfolge request.get('/user') .query('name=Nick') .query('search=Manny') .sortQuery() .then(callback) // angepasste Sortierfunktion request.get(' /user') .query('name=Nick') .query('search=Manny') .sortQuery((a, b) => a.length - b.length) .then(callback)

TLS-Optionen

In Node.js unterstützt SuperAgent Methoden zum Konfigurieren von HTTPS-Anfragen:

  • .ca(): Stellen Sie das/die CA-Zertifikat(e) auf vertrauenswürdig ein
  • .cert(): Legen Sie die Client-Zertifikatskette(n) fest.
  • .Taste(): Legen Sie die privaten Schlüssel des Clients fest.
  • .pfx(): Legen Sie den PFX- oder PKCS12-codierten privaten Schlüssel und die Zertifikatskette des Clients fest
  • .disableTLSCerts(): Abgelaufene oder ungültige TLS-Zertifikate werden nicht abgelehnt. Wird intern festgelegtRejectUnauthorized=true.Seien Sie gewarnt, diese Methode ermöglicht MITM-Angriffe.

Weitere Informationen finden Sie unter Node.jshttps.Dokumente anfordern.

var key = fs.readFileSync('key.pem'), cert = fs.readFileSync('cert.pem');request .post('/client-auth') .key(key) .cert(cert) .then (Ruf zurück);
var ca = fs.readFileSync('ca.cert.pem');request .post('https://localhost/private-ca-server') .ca(ca) .then(res => {});

Antworttexte analysieren

SuperAgent analysiert für Sie bekannte Antworttextdaten und unterstützt derzeitapplication/x-www-form-urlencoded,application/json, UndMultipart-/Formulardaten. Sie können die automatische Analyse auch für andere Antworttextdaten einrichten:

//browserrequest.parse['application/xml'] = function (str) { return {'object': 'parsed from str'};};//noderequest.parse['application/xml'] = function (res, cb) { //Antworttext analysieren und res.body hier setzen cb(null, res);};//In Zukunft werden Antworten vom Typ „application/xml“//automatisch analysiert

Sie können einen benutzerdefinierten Parser festlegen (der Vorrang vor integrierten Parsern hat)..buffer(true).parse(fn)Methode. Wenn die Antwortpufferung nicht aktiviert ist (.buffer(false)) dann ist dieAntwortDas Ereignis wird ausgegeben, ohne auf den Abschluss des Body-Parsers zu wartenAntwortkörperwird nicht verfügbar sein.

JSON / Urlencodiert

Die Eigenschaftres.körperist das analysierte Objekt, beispielsweise wenn eine Anfrage mit der JSON-Zeichenfolge „{“user“:{“name“: „tobi“}}“ geantwortet hat,res.body.user.namewäre „tobi“. Ebenso würde der x-www-form-urlencoded-Wert von „user[name]=tobi“ das gleiche Ergebnis liefern. Es wird nur eine Verschachtelungsebene unterstützt. Wenn Sie komplexere Daten benötigen, senden Sie stattdessen JSON.

Arrays werden durch Wiederholen des Schlüssels gesendet..send({color: ['red','blue']})sendetFarbe=Rot&Farbe=Blau. Wenn Sie möchten, dass die Array-Schlüssel Folgendes enthalten:[]in ihrem Namen müssen Sie es selbst hinzufügen, da SuperAgent es nicht automatisch hinzufügt.

Mehrteilig

Der Node-Client unterstütztMultipart-/Formulardatenüber dieBeeindruckendModul. Beim Parsen mehrteiliger Antworten das Objektres.filessteht Ihnen ebenfalls zur Verfügung. Angenommen, eine Anfrage antwortet beispielsweise mit dem folgenden mehrteiligen Text:

--whoopContent-Disposition: Anhang; name="Bild"; filename="tobi.png"Content-Type: image/png... Daten hier ...--whoopContent-Disposition: form-data; name="name"Content-Type: text/plainTobi--whoop--

Du hättest die Werteres.body.namebereitgestellt als „Tobi“, undres.files.imageAls einDateiObjekt, das den Pfad auf der Festplatte, den Dateinamen und andere Eigenschaften enthält.

Binär

In Browsern können Sie verwenden.responseType('blob')um die Verarbeitung binärer Antworttexte anzufordern. Diese API ist bei der Ausführung in node.js nicht erforderlich. Die unterstützten Argumentwerte für diese Methode sind:

  • 'Klecks'wird an die XmlHTTPRequest weitergeleitetAntworttypEigentum
  • 'Arraybuffer'wird an die XmlHTTPRequest weitergeleitetAntworttypEigentum
req.get('/binary.data') .responseType('blob') .then(res => { // res.body wird hier ein browsernativer Blob-Typ sein });

Weitere Informationen finden Sie im Mozilla Developer Networkxhr.responseType-Dokumente.

Antworteigenschaften

Auf der Seite sind viele hilfreiche Flags und Eigenschaften festgelegtAntwortObjekt, das vom Antworttext, dem analysierten Antworttext, Headerfeldern, Statusflags und mehr reicht.

Antworttext

Derres.textDie Eigenschaft enthält die ungeparste Antworttextzeichenfolge. Diese Eigenschaft ist für die Client-API immer vorhanden und nur, wenn der MIME-Typ mit „text/“ übereinstimmt.","/json“ oder standardmäßig „x-www-form-urlencoded“ für den Knoten. Der Grund dafür ist, Speicher zu sparen, da das Puffern von Text aus großen Textkörpern wie mehrteiligen Dateien oder Bildern äußerst ineffizient ist. Informationen zum Erzwingen der Pufferung finden Sie unter „Antworten puffern“. " Abschnitt.

Antwortkörper

So wie SuperAgent Anforderungsdaten automatisch serialisieren kann, kann er diese auch automatisch analysieren. Wenn ein Parser für den Content-Type definiert wird, wird dieser analysiert, was standardmäßig „application/json“ und „application/x-www-form-urlencoded“ umfasst. Das geparste Objekt ist dann über verfügbarres.körper.

Antwort-Header-Felder

Derres.headerenthält ein Objekt aus geparsten Header-Feldern, Feldnamen in Kleinbuchstaben, ähnlich wie bei Node. Zum Beispielres.header['content-length'].

Inhaltstyp der Antwort

Der Content-Type-Antwortheader ist in Sonderfällen angegebenres.typ, in dem der Zeichensatz (falls vorhanden) fehlt. Beispielsweise liefert der Inhaltstyp „text/html; charset=utf8“ „text/html“ alsres.typ, und dasres.charsetDie Eigenschaft würde dann „utf8“ enthalten.

Antwortstatus

Die Antwortstatus-Flags helfen neben anderen nützlichen Informationen dabei, festzustellen, ob die Anfrage erfolgreich war, wodurch sich SuperAgent ideal für die Interaktion mit RESTful-Webdiensten eignet. Diese Flags sind derzeit definiert als:

Var-Typ = Status / 100 | 0; // Status / Klasse res.status = Status; res.statusType = Typ; // Grundlagen res.info = 1 == type; res.ok = 2 == Typ; res.clientError = 4 == type; res.serverError = 5 == type; res.error = 4 == Typ || 5 == Typ; // Zucker res.accepted = 202 == Status; res.noContent = 204 == Status || 1223 == Status; res.badRequest = 400 == Status; res.unauthorized = 401 == Status; res.notAcceptable = 406 == Status; res.notFound = 404 == Status; res.forbidden = 403 == Status;

Anfragen werden abgebrochen

Um Anfragen abzubrechen, rufen Sie einfach die aufreq.abort()Methode.

Auszeiten

Manchmal bleiben Netzwerke und Server „stecken“ und antworten nicht, nachdem sie eine Anfrage angenommen haben. Legen Sie Zeitüberschreitungen fest, um zu vermeiden, dass Anfragen ewig warten.

  • req.timeout({deadline:ms})oderreq.timeout(ms)(WoMSist eine Anzahl von Millisekunden > 0) legt eine Frist für den Abschluss der gesamten Anfrage (einschließlich aller Uploads, Weiterleitungen, Serververarbeitungszeit) fest. Wenn die Antwort innerhalb dieser Zeit nicht vollständig heruntergeladen wird, wird die Anfrage abgebrochen.

  • req.timeout({response:ms})Legt die maximale Zeit fest, die auf das Eintreffen des ersten Bytes vom Server gewartet werden soll, begrenzt jedoch nicht die Zeit, die der gesamte Download dauern kann. Das Antwort-Timeout sollte mindestens einige Sekunden länger sein als nur die Zeit, die der Server zum Antworten benötigt, da es auch die Zeit für die DNS-Suche, TCP/IP- und TLS-Verbindungen sowie die Zeit für das Hochladen von Anforderungsdaten umfasst.

Sie sollten beide verwendenTerminUndAntwortAuszeiten. Auf diese Weise können Sie eine kurze Reaktionszeit nutzen, um nicht reagierende Netzwerke schnell zu erkennen, und eine lange Frist nutzen, um Zeit für Downloads in langsamen, aber zuverlässigen Netzwerken zu geben. Beachten Sie, dass beide Timer die Dauer begrenzenUploadsder angehängten Dateien dürfen übernommen werden. Verwenden Sie lange Zeitüberschreitungen, wenn Sie Dateien hochladen.

request .get('/big-file?network=slow') .timeout({ Antwort: 5000, // 5 Sekunden warten, bis der Server mit dem Senden beginnt, Frist: 60000, // aber 1 Minute warten, bis die Datei fertig ist wird geladen. }) .then(res => { /* rechtzeitig geantwortet */ }, err => { if (err.timeout) { /* Zeitüberschreitung! */ } else { /* anderer Fehler */ } }) ;

Timeout-Fehler haben eine.AuszeitEigentum.

Authentifizierung

Sowohl im Knoten als auch im Browser ist die Authentifizierung über verfügbar.auth()Methode:

request .get('http://local') .auth('tobi', 'learnboost') .then(callback);

ImKnotenDie Client-Basisauthentifizierung kann in der URL als „user:pass“ enthalten sein:

request.get('http://tobi:learnboost@local').then(callback);

Nur standardmäßigBasicAuthentifizierung wird verwendet. Im Browser können Sie hinzufügen{type:'auto'}So aktivieren Sie alle im Browser integrierten Methoden (Digest, NTLM usw.):

request.auth('digest', 'secret', {type:'auto'})

DerAutorMethode unterstützt auch aTypvonTräger, um die tokenbasierte Authentifizierung anzugeben:

request.auth('my_token', { type: 'bearer' })

Weiterleitungen folgen

Standardmäßig werden bis zu 5 Weiterleitungen verfolgt, Sie können dies jedoch mit festlegenres.redirects(n)Methode:

const Antwort = Warten auf request.get('/some.png').redirects(2);

Weiterleitungen, die das Limit überschreiten, werden als Fehler behandelt. Verwenden.ok(res => res.status < 400)um sie als erfolgreiche Antworten zu lesen.

Agenten für den globalen Staat

Cookies speichern

In Node speichert SuperAgent standardmäßig keine Cookies, Sie können jedoch die verwenden.Agent()Methode zum Erstellen einer Kopie von SuperAgent, die Cookies speichert. Jede Kopie hat eine separate Keksdose.

const agent = request.agent(); agent .post('/login') .then(() => { return agent.get('/cookied-page'); });

In Browsern werden Cookies automatisch vom Browser verwaltet, sodass die.Agent()isoliert keine Cookies.

Standardoptionen für mehrere Anfragen

Auf dem Agent aufgerufene reguläre Anforderungsmethoden werden als Standard für alle von diesem Agent gestellten Anforderungen verwendet.

const agent = request.agent() .use(plugin) .auth(shared); Warten Sie auf agent.get('/with-plugin-and-auth'); wait agent.get('/also-with-plugin-and-auth');

Die vollständige Liste der Methoden, die der Agent zum Festlegen von Standardwerten verwenden kann, ist:verwenden,An,einmal,Satz,Anfrage,Typ,akzeptieren,Autor,withCredentials,sortQuery,wiederholen,OK,Weiterleitungen,Auszeit,Puffer,serialisieren,analysieren,ca,Taste,pfx,zert.

Rohrleitungsdaten

Mit dem Node-Client können Sie Daten an und von der Anfrage weiterleiten. Bitte beachte, dass.Rohr()wird eingesetztanstatt .Ende()/.Dann()Methoden.

Beispiel: Den Inhalt einer Datei als Anfrage weiterleiten:

const request = require('superagent'); const fs = require('fs'); const stream = fs.createReadStream('path/to/my.json'); const req = request.post('/somewhere'); req.type('json'); stream.pipe(req);

Beachten Sie, dass Superagent die weitergeleiteten Daten mit sendet, wenn Sie eine Anfrage weiterleitenChunked-Transfer-Kodierung, was nicht von allen Servern unterstützt wird (z. B. Python-WSGI-Server).

Oder die Antwort an eine Datei weiterleiten:

const stream = fs.createWriteStream('path/to/my.json'); const req = request.get('/some.json'); req.pipe(stream);

Es ist nicht möglich, Anspielungen und Rückrufe oder Versprechen zu vermischen. Beachten Sie, dass Sie dies tun solltenNICHTVersuchen Sie, das Ergebnis von weiterzuleiten.Ende()oder derAntwortObjekt:

// Tun Sie nichts davon: const stream = getAWritableStream(); const req = request .get('/some.json') // SCHLECHT: Dies leitet Müll an den Stream weiter und schlägt auf unerwartete Weise fehl. .end((err, this_does_not_work) => this_does_not_work.pipe(stream)) const req = request .get('/some.json') .end() // SCHLECHT: Dies wird auch nicht unterstützt, .pipe ruft .end für Sie auf. .pipe(nope_its_too_late);

In einemzukünftige Versionvon Superagent, unzulässige Anrufe anRohr()wird versagen.

Mehrteilige Anfragen

SuperAgent eignet sich auch hervorragend fürGebäudemehrteilige Anfragen, für die es Methoden bereitstellt.anfügen()Und.Feld().

Wenn Sie verwenden.Feld()oder.anfügen()Du kannst es nicht verwenden.schicken()Und dudarf nichtSatzInhaltstyp(Der richtige Typ wird für Sie eingestellt).

Anhängen von Dateien

Um eine Datei zu senden, verwenden Sie.attach(Name, [Datei], [Optionen]). Sie können durch einen Anruf mehrere Dateien anhängen.anfügenmehrmals. Die Argumente sind:

  • Name— Feldname im Formular.
  • Datei— entweder String mit Dateipfad oderKlecks/PufferObjekt.
  • Optionen– (optional) entweder Zeichenfolge mit benutzerdefiniertem Dateinamen oder{Dateiname: Zeichenfolge}Objekt. Auch im Node{contentType: 'mime/type'}wird unterstützt. Erstellen Sie im Browser eineKlecksstattdessen mit einem entsprechenden Typ.

request .post('/upload') .attach('image1', 'path/to/felix.jpeg') .attach('image2', imageBuffer, 'luna.jpeg') .field('caption', 'My.jpeg') cats') .then(callback);

Feldwerte

Ähnlich wie bei Formularfeldern in HTML können Sie mit Feldwerte festlegen.field(Name, Wert)Und.field({name: value}). Angenommen, Sie möchten ein paar Bilder mit Ihrem Namen und Ihrer E-Mail-Adresse hochladen. Ihre Anfrage könnte etwa so aussehen:

request .post('/upload') .field('user[name]', 'Tobi') .field('user[email]', 'tobi@learnboost.com') .field('friends[]', ['loki', 'jane']) .attach('image', 'path/to/tobi.png') .then(callback);

Kompression

Der Node-Client unterstützt komprimierte Antworten, das Beste ist: Sie müssen nichts tun! Es funktioniert einfach.

Antworten puffern

Um die Pufferung von Antwortkörpern zu erzwingenres.textSie können sich berufenreq.buffer(). Um die Standardpufferung für Textantworten wie „text/plain“, „text/html“ usw. rückgängig zu machen, können Sie Folgendes aufrufen:req.buffer(false).

Bei der Pufferung derres.gepuffertWenn das Flag bereitgestellt wird, können Sie damit sowohl gepufferte als auch ungepufferte Antworten im selben Rückruf verarbeiten.

CORS

Aus Sicherheitsgründen blockieren Browser Cross-Origin-Anfragen, es sei denn, der Server stimmt der Verwendung von CORS-Headern zu. Browser machen auch extraOPTIONENAnfragen, um zu überprüfen, welche HTTP-Header und -Methoden vom Server zugelassen werden.Lesen Sie mehr über CORS.

Der.withCredentials()Die Methode ermöglicht das Senden von Cookies vom Ursprungsort, jedoch nur dann, wennZugriffskontrolle-Zulassen-UrsprungIstnichtein Platzhalter („*“) undZugangskontrolle-Zulassen-Anmeldeinformationenist wahr".

request .get('https://api.example.com:4001/') .withCredentials() .then(res => { Assert.equal(200, Res.Status); Assert.Equal('tobi', Res .text); })

Fehlerbehandlung

Ihrer Rückruffunktion werden immer zwei Argumente übergeben: Fehler und Antwort. Wenn kein Fehler aufgetreten ist, ist das erste Argument null:

request .post('/upload') .attach('image', 'path/to/tobi.png') .then(res => { });

Außerdem wird ein „Fehler“-Ereignis ausgegeben, mit dem Sie Folgendes abwarten können:

request .post('/upload') .attach('image', 'path/to/tobi.png') .on('error', handle) .then(res => { });

Beachten Sie, dassSuperagent berücksichtigt standardmäßig 4xx- und 5xx-Antworten (sowie nicht behandelte 3xx-Antworten).. Wenn Sie beispielsweise eine erhalten304 Nicht geändert,403 Verbotenoder500 Interner ServerfehlerAntwort, diese Statusinformationen werden über verfügbar seinFehlerstatus. Fehler aus solchen Antworten enthalten auch eineFehlerantwortFeld mit allen in „Antworteigenschaften". Die Bibliothek verhält sich auf diese Weise, um den häufigen Fall zu bewältigen, dass Erfolgsantworten gewünscht werden und HTTP-Fehlerstatuscodes als Fehler behandelt werden, während gleichzeitig eine benutzerdefinierte Logik für bestimmte Fehlerbedingungen möglich ist.

Netzwerkausfälle, Zeitüberschreitungen und andere Fehler, die keine Antwort hervorrufen, enthalten „Nein“.FehlerstatusoderFehlerantwortFelder.

Wenn Sie 404- oder andere HTTP-Fehlerantworten verarbeiten möchten, können Sie dies abfragenFehlerstatusEigentum. Wenn ein HTTP-Fehler auftritt (4xx- oder 5xx-Antwort), wird derRes.FehlerEigentum ist einFehlerObjekt können Sie auf diese Weise Prüfungen durchführen wie:

if (err && err.status === 404) { Alert('oh no ' + res.body.message); } else if (err) { // alle anderen Fehlertypen, die wir generisch behandeln }

Alternativ können Sie die verwenden.ok(Rückruf)Methode, um zu entscheiden, ob eine Antwort ein Fehler ist oder nicht. Der Rückruf zumOKDie Funktion erhält eine Antwort und kehrt zurückWAHRob die Antwort als Erfolg gewertet werden soll.

request.get('/404') .ok(res => res.status < 500) .then(response => { // liest 404-Seite als erfolgreiche Antwort })

Fortschrittsverfolgung

SuperAgent wird ausgelöstFortschrittEreignisse beim Hoch- und Herunterladen großer Dateien.

request.post(url) .attach('field_name', file) .on('progress', event => { /* das Ereignis ist: { Richtung: "upload" oder "download" Prozent: 0 bis 100 // kann fehlen, wenn die Dateigröße unbekannt ist total: // Gesamtdateigröße, kann fehlen geladen: // Bisher heruntergeladene oder hochgeladene Bytes } */ }) .then()

Testen auf localhost

Erzwingen einer bestimmten Verbindungs-IP-Adresse

In Node.js ist es möglich, die DNS-Auflösung zu ignorieren und alle Anfragen an eine bestimmte IP-Adresse weiterzuleiten.verbinden()Methode. Diese Anfrage geht beispielsweise an localhost stattexample.com:

const res = waiting request.get("http://example.com").connect("127.0.0.1");

Da die Anfrage möglicherweise umgeleitet wird, ist es möglich, mehrere Hostnamen und mehrere IPs sowie eine spezielle Angabe anzugeben*als Fallback (Hinweis: Andere Platzhalter werden nicht unterstützt). Die Anfragen bleiben erhaltenGastgeberHeader mit dem ursprünglichen Wert..connect(undefiniert)schaltet die Funktion aus.

const res = waiting request.get("http://redir.example.com:555") .connect({ "redir.example.com": "127.0.0.1", // redir.example.com:555 wird use 127.0.0.1:555 „www.example.com“: false, // dieses nicht überschreiben; DNS wie gewohnt verwenden „mapped.example.com“: { host: „127.0.0.1“, port: 8080} , // mapped.example.com:* wird 127.0.0.1:8080 verwenden „*“: „proxy.example.com“, // alle anderen Anfragen gehen an diesen Host });

Defektes/unsicheres HTTPS auf localhost wird ignoriert

In Node.js, wenn HTTPS falsch konfiguriert und unsicher ist (z. B. Verwendung eines selbstsignierten Zertifikats).ohneEigene angeben.ca()), ist es weiterhin möglich, Anfragen zuzulassenlocalhostper Anruf.trustLocalhost():

const res = waiting request.get("https://localhost").trustLocalhost()

Zusammen mit.connect("127.0.0.1")Dies kann verwendet werden, um HTTPS-Anfragen an eine beliebige Domäne zu erzwingen, zu der sie umgeleitet werdenlocalhoststattdessen.

Im Allgemeinen ist es sicher, defektes HTTPS zu ignorierenlocalhost, da die Loopback-Schnittstelle nicht für nicht vertrauenswürdige Netzwerke verfügbar ist. Vertrauensvolllocalhostkönnte in Zukunft zum Standard werden. Verwenden.trustLocalhost(false)Überprüfung erzwingen127.0.0.1Authentizität.

Wir unterstützen die Deaktivierung der HTTPS-Sicherheit bei Anfragen an andere IP-Adressen absichtlich nicht, da solche Optionen letztendlich als schnelle „Lösung“ für HTTPS-Probleme missbraucht werden. Sie können kostenlose HTTPS-Zertifikate von erhaltenLassen Sie uns verschlüsselnoder legen Sie Ihre eigene CA fest (.as(as_public_pem)), um Ihre selbstsignierten Zertifikate vertrauenswürdig zu machen.

Promise- und Generator-Unterstützung

Die Anfrage von SuperAgent ist ein „thenable“-Objekt, das mit JavaScript-Versprechungen und dem kompatibel istasynchron/erwartenSyntax.

const res = Warten auf request.get(url);

Wenn Sie Versprechen verwenden,unterlassen SieForderung.Ende()oder.Rohr(). Jede Verwendung von.Dann()odererwartendeaktiviert alle anderen Möglichkeiten zur Verwendung der Anfrage.

Bibliotheken mögencooder ein Webframework wiezudürfenErtragauf jeder SuperAgent-Methode:

const req = request .get('http://local') .auth('tobi', 'learnboost'); const res = Ertragsanforderung;

Beachten Sie, dass SuperAgent das globale erwartetVersprechenObjekt vorhanden sein. Sie müssen Version 7 und eine Polyfüllung verwenden, um Versprechen in Internet Explorer oder Node.js 0.10 verwenden zu können.

Wir haben die Unterstützung für IE in Version 8 eingestellt. Sie müssen ein Polyfill für WeakRef und BigInt hinzufügen, wenn Sie beispielsweise Opera 85, iOS Safari 12.2-12.5 unterstützen möchtenhttps://polyfill.io:

Browser- und Knotenversionen

SuperAgent verfügt über zwei Implementierungen: eine für Webbrowser (mit XHR) und eine für Node.JS (mit dem Kern-HTTP-Modul). Standardmäßig wählen Browserify und WebPack die Browserversion aus.

Wenn Sie WebPack zum Kompilieren von Code für Node.JS verwenden möchten, müssen Sie Folgendes tunmussangebenKnotenzielin seiner Konfiguration.

FAQs

What is SuperAgent in node JS? ›

SuperAgent is light-weight progressive ajax API crafted for flexibility, readability, and a low learning curve after being frustrated with many of the existing request APIs. It also works with Node. js!

Does SuperAgent return a promise? ›

Superagent doesn't directly return promises, but its request object does expose a then method which returns a Promise.

How does SuperAgent work? ›

The SuperAgent receives a wake-up call from McAfee ePO, then wakes up the agents in its subnet. Note: This broadcast is an alternative to sending ordinary wake-up calls to each agent in the network or sending agent wake-up task to each computer.

What is SuperAgent in testing? ›

Supertest is a Node. js library that you can use to test your API. It extends another library called Superagent, which is a JavaScript HTTP client for Node. js and browsers.

How to get data from API in node JS? ›

There are several different ways you can fetch data from an API in Node. js. Some of the most common methods include using the built-in http module, using a third-party library like Axios or the request-promise library, and using the fetch() function or the fetch API.

How to fetch data from API in Express js? ›

To use the NodeJS Fetch API, we need to call the fetch() method as we do on the client side. fetch(url[, options]); The url parameter is the URL of the host from which we want to fetch the resource.

Does promise use callback? ›

Essentially, a promise is a returned object to which you attach callbacks, instead of passing callbacks into a function.

Why callback is replaced with promise? ›

A promise represents the future result of an asynchronous operation. Of course, writing them the way you do, you get little benefit. However, Promises are more than just callbacks. They are a very mighty abstraction, allow cleaner and better, functional code with less error-prone boilerplate.

Why use promise over callback? ›

The superiority of promises over callbacks is all about trust and control. Let me explain. We generally need to use callbacks (or promises) when there is a slow process (that's usually IO-related) that we need to perform without blocking the main program process.

How do I call another API in node JS? ›

js installed, you should be able to run the script using the following command: node api-call . That will execute the JavaScript file using the Node. js runtime. The script will make an API call to JSONPlaceholder and return an array of objects.

How to call API using Node js? ›

Create a project folder.
  1. mkdir node-api-fetch. Initialize project with npm init -y to be able to install node packages.
  2. cd node-api-fetch npm init -y. Install node-fetch to make fetch requests.
  3. npm install node-fetch. Create an index. js file.
  4. touch index.js. Add code.
Mar 29, 2021

What is super agent tools? ›

Super Agent Tools is an award-winning platform for insurance agents that provide an abundance of resources that are available on-demand, whenever and wherever they need them.

How to test an API in node JS? ›

Coding example
  1. const request = require('supertest');
  2. const {expect} = require('expect');
  3. const app = require('../app');
  4. describe('Testing POSTS/answers endpoint', () => {
  5. it('respond with valid HTTP status code and description and message', async () => { // add `async` keyword here.

How do I send form data in supertest? ›

By default, supertest will send your form data with Content-Type of application/x-www-form-urlencoded . If the client wants to send a more complex data types, you way want to use JSON format, which is application/json . To do that we can use another method from supertest called send .

What is SuperAgent in ePO? ›

A SuperAgent is a distributed repository which is designed to reduce the load on McAfee ePO. McAfee ePO manages how the SuperAgent is replicated. The SuperAgent caches information received from McAfee ePO, the Master Repository, an HTTP, or an FTP repository, and distributes it to the agents in its broadcast domain.

How to get JSON data from API in nodejs? ›

To get JSON from a REST API endpoint using Node. js, you must send an HTTP GET request to the REST API server and provide an Accept: application/json request header. The Accept: application/json header tells the REST API server that the API client expects to receive data in JSON format.

How do I pull all data from an API? ›

How to extract the API data
  1. Step 1: retrieve the API data URL.
  2. Step 2: create a new, blank Excel document.
  3. Step 3: paste the API data URL in the Excel document.
  4. Step 4: Enter the credentials.
  5. Step 5: load the API data in the Excel.
Oct 28, 2021

How do I get all data from an API? ›

The most straightforward way of accessing data from an API endpoint is simply viewing it in the browser. As long as you're connected to the internet, you should be able to preview most API's data regardless of its format.

How do I fetch API responses? ›

Summary
  1. The Fetch API allows you to asynchronously request for a resource.
  2. Use the fetch() method to return a promise that resolves into a Response object. ...
  3. Use the status and statusText properties of the Response object to get the status and status text of the response.

How to get data from JSON fetch API? ›

To fetch JSON from the server using the Fetch API, you need to use the JavaScript fetch() method and then call the response. json() method to get the JSON data as a JavaScript object. The response. json() method reads the data returned by the server and returns a Promise that resolves with a JSON object.

How to get data from API in JavaScript without fetch? ›

XHR Object Properties
  1. onreadystatechange — Defines a function to be called when the readyState property changes.
  2. readyState — Holds the status of the XMLHttpRequest (0… ...
  3. responseText — Returns the response data as a string.
  4. responseXML — Returns the response data as XML data.
  5. status — Returns the status-number of a request.
Aug 28, 2020

What is the difference between callback and promise in node? ›

With callback we pass a callback into a function that would then get called upon completion. With promises, you attach callbacks on the returned promise object. A callback is a function that is to be executed after another function has finished executing. Async callbacks are functions that are passed as arguments.

What is the difference between callback and promise node? ›

The TL:DR - version: Callbacks are functions passed as arguments into other functions to make sure mandatory variables are available within the callback-function's scope. Promises are placeholder objects for data that's available in the future.

What is the difference between callback and promise performance? ›

A key difference between the two is when using the callback approach, we'd normally just pass a callback into a function that would then get called upon completion in order to get the result of something. In promises, however, you attach callbacks on the returned promise object.

What is the difference between observable and promise? ›

Both observables and promises help us work with asynchronous functionality in JavaScript. Promises deal with one asynchronous event at a time, while observables handle a sequence of asynchronous events over a period of time. Emit multiple values over a period of time. Emit a single value at a time.

What are the disadvantages of callbacks? ›

The biggest problem with callbacks is that they do not scale well for even moderately complex asynchronous code. The resulting code often becomes hard to read, easy to break, and hard to debug.

How do you call an API inside an API? ›

How to Make API calls
  1. Find the URI of the external server or program.
  2. Add an HTTP verb.
  3. Include a header.
  4. Include an API key or access token.
  5. Wait for the response.
Sep 20, 2021

How do I call API every second? ›

We can pass an API call inside the setInterval() to make it run repeatedly. const res = await fetch(`https://jsonplaceholder.typicode.com/posts`); }, 2000); Once this interval is created, it will send the API request after every two seconds.

How do I call REST API from another API? ›

Calling REST APIs
  1. Add a Datasource with OpenAPI specification. Datasource for REST service without OpenAPI specification.
  2. Add a service. Define the methods that map to the operations.
  3. Add a Controller. Inject the Service in the constructor. Add the REST endpoints.
  4. More examples.
  5. Further reading.

How do I make API calls faster in node JS? ›

How to Optimize Node. js APIs
  1. Always Use Asynchronous Functions. ...
  2. Avoid Sessions and Cookies in APIs, and Send Only Data in the API Response. ...
  3. Optimize Database Queries. ...
  4. Optimize APIs with PM2 Clustering. ...
  5. Reduce TTFB (Time to First Byte) ...
  6. Use Error Scripts with Logging. ...
  7. Use HTTP/2 Instead of HTTP. ...
  8. Run Tasks in Parallel.
Aug 22, 2022

How to cache API calls in node js? ›

The steps are highlighted below:
  1. Spin up a simple Node. js application.
  2. Write a reusable custom Redis implementation/cache service.
  3. Show how using Redis to cache data from an external API call can help improve the performance of our app.
Sep 30, 2022

How to make HTTP requests in node js? ›

Make HTTP Requests with Node. js
  1. Basic axios usage notes.
  2. Send a GET request to fetch data.
  3. Send a POST request to submit data.
  4. Pass query string parameters to a GET request.
  5. Send a request with HTTP headers.
  6. Send a request with a secret or API key.
  7. Send multiple HTTP requests in sequence.

What is the difference between agent and super agent? ›

Building your Agent Network

If potential clients contact your agency but you do not have the services they are looking for, you can refer them to another agency you trust in your network. In this scenario, you would be the sub-agent and the agency you refer to would be the super-agent.

What is the difference between tool and agent? ›

So, what's the difference? Well, a tool help you do a task, while an agent does a task for you.

What is agent app used for? ›

Use the ServiceNow Mobile Agent app to update records, coordinate with coworkers, track your location, and work without an internet connection — all from your mobile device. Download Mobile Agent app for Apple iOS or Google Android from the Apple App Store or the Google Play store.

Can you test API manually? ›

API testing can be either manual or automated. Manual API testing involves manually sending requests to an application's interface and verifying the responses, while automated API testing utilizes specialized software tools to send requests and validate responses.

How to test an API using JSON? ›

Test JSON API endpoints by sending JSON API requests directly from your browser. Validate returned JSON strings with JSON syntax highlighting and code validators. Use the ReqBin JSON API Testing tool to validate your JSON response for API endpoints using auto syntax highlighting and a JSON validator.

How to check performance of API nodejs? ›

js application step by step.
  1. Step 1: Node. js Performance Testing Tools. ...
  2. Step 2: Node. js Performance Test Profile. ...
  3. Step 3: Build Your Observability/Monitoring. We don't want to just hope and pray that our performance test would pass against our application. ...
  4. Step 4: Node. ...
  5. Step 5: Run Your Tests.
Jun 9, 2022

What is SuperTest in nodejs? ›

Supertest is a Node. js library that allows developers and testers to test the APIs. It enables developers and testers to write automated tests for routes and endpoints. Supertest can be used as a standalone library or with testing frameworks like Mocha and Jest.

How do you pass a request body in SuperTest? ›

const request = require('supertest'); const bodyParser = require('body-parser'); let AValidator = require('../src/AValidator'); let BValidator = require('../src/BValidator'); BValidator = jest. fn(); AValidator = jest. fn(); app = require('../src/app'); app.

What is the difference between mocha and SuperTest? ›

Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases. On the other hand, SuperTest is detailed as "*A library for testing node. js HTTP servers *". It is a super-agent driven library for testing node.

What is a super agent wake up call? ›

SuperAgent wake-up calls

SuperAgent distributes the bandwidth load of concurrent wake-up calls. Instead of sending wake-up calls from the server to every McAfee Agent, the server sends the SuperAgent wake-up call to SuperAgents in the selected System Tree segment.

What is automatic response in ePO? ›

McAfee ePO Cloud responds when the conditions of an automatic response rule are met. You specify the actions that make up the response, and the type and number of events that must meet the condition to trigger the response. By default, an automatic response rule can include these actions: Run system commands.

How do I assign a policy to a group in ePO? ›

Assign a policy to a System Tree group
  1. Select Menu → Systems → System Tree, click Assigned Policies tab, then select a product. ...
  2. Locate the policy category you want, then click Edit Assignment.
  3. If the policy is inherited, next to Inherited from, select Break inheritance and assign the policy and settings below.

What is super agent distributed repository? ›

A SuperAgent is a distributed repository which is designed to reduce the load on McAfee ePO. McAfee ePO manages how the SuperAgent is replicated. The SuperAgent caches information received from McAfee ePO, the Master Repository, an HTTP, or an FTP repository, and distributes it to the agents in its broadcast domain.

How do you get a super agent on property finder? ›

You require a minimum of 10 to keep your SuperAgent status. Live Listings: Offers an overview of your properties that are currently live on Property Finder. Between 5 to 80 live properties are required to gain and maintain your SuperAgent status.

What is the best HTTP client for node? ›

Currently, Got is the most popular HTTP client library for Node. js, with over 19 million downloads per week. Below is a quick example of using Got to fetch the users from our mock API: const got = require('got'); got.

How to use SSO in node JS? ›

Follow the Step-by-Step Guide given below for Node JS Single Sign-On (SSO)
  1. Set up your Identity Provider in miniOrange. We are using ADFS to show the setup. ...
  2. Configure miniOrange settings in your Identity Provider. ...
  3. Configure Node JS in miniOrange. ...
  4. Single Logout (SLO)

How to update an epolicy Orchestrator Master repository from another epolicy Orchestrator server? ›

Summary
  1. Log on to the ePO-A console.
  2. Click Menu, Configuration, Server Settings.
  3. Select Security Keys in the Setting Categories list, and then click Edit.
  4. Next to Local Master Repository key pair, make a note of the number of key pairs. ...
  5. Click Export Public Key for the first key.
  6. Click OK.
  7. Click Save.
Mar 18, 2022

How do I set up a Zillow profile as an agent? ›

Create a Free Agent Profile in 7 Easy Steps
  1. Register on Zillow. ...
  2. Add a profile photo. ...
  3. Add your professional information. ...
  4. Promote your brand in the about me section. ...
  5. Add your past sales. ...
  6. Request reviews. ...
  7. Connect your listings.
Mar 12, 2017

How many requests can one Node server handle? ›

In this way, Node can handle 1000s of concurrent connections without any of the traditional detriments associated with threads. A benchmark made by Fastify, shows that Express. js can handle approx 15,000 requests per second and the basic HTTP module, 70K requests per second.

Which API creates a client in Nodejs? ›

The Node. js Client uses the MarkLogic REST Client API to communicate with MarkLogic Server, so it uses the same security model.

What API should you use to get Node information? ›

The cluster nodes info API allows to retrieve one or more (or all) of the cluster nodes information. All the nodes selective options are explained here. By default, it returns all attributes and core settings for a node.

How do I enable SSO on my browser? ›

Configure Windows browsers for SSO
  1. On your Windows Control Panel, select Network and Internet > Internet Options > Security > Local intranet > Sites > Advanced.
  2. Click Add.
  3. Click OK twice to close Internet Options.

How to configure SSO for web application? ›

Configure Single Sign-On for Web Applications Last Updated May 23, 2023
  1. In the SAC Admin Portal, create or edit a web application for which to configure SSO. ...
  2. Under Single Sign-On, select an authentication type: ...
  3. Save. ...
  4. (If using JWT Token) Enable user groups in JWT authentication:

How to implement SSO with JWT? ›

Enabling JWT SSO
  1. In Admin Center, click Account in the sidebar, then select Security > Single sign-on.
  2. Click Create SSO configuration then select JSON Web Token.
  3. Enter a unique Configuration name.
  4. For Remote Login URL, enter the URL where your users should be redirected when they attempt to access your Zendesk URL.

References

Top Articles
Latest Posts
Article information

Author: Francesca Jacobs Ret

Last Updated: 21/11/2023

Views: 5961

Rating: 4.8 / 5 (48 voted)

Reviews: 95% of readers found this page helpful

Author information

Name: Francesca Jacobs Ret

Birthday: 1996-12-09

Address: Apt. 141 1406 Mitch Summit, New Teganshire, UT 82655-0699

Phone: +2296092334654

Job: Technology Architect

Hobby: Snowboarding, Scouting, Foreign language learning, Dowsing, Baton twirling, Sculpting, Cabaret

Introduction: My name is Francesca Jacobs Ret, I am a innocent, super, beautiful, charming, lucky, gentle, clever person who loves writing and wants to share my knowledge and understanding with you.