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

SuperAgent ist eine leichte progressive Ajax-API mit Flexibilität, Lesbarkeit und geringer Lernkurve. 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)); });

Testdokument

Englisch

die folgendeTestdokumentwird eingesetztMokkaDer „Dokumentations“-Reporter generiert die Testsuite und spiegelt sie direkt wider. Dies stellt eine zusätzliche Dokumentationsquelle dar.

Grundanforderung

kann per Anruf erreicht werdenAnfrageGeeignete Methode für das Objekt, um die Anforderung zu stellen, und dann aufrufen.Dann()( oder.Ende()odererwarten)Anfrage senden. Zum Beispiel ein einfachesERHALTENfragen:

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

HTTP-Methoden können auch als Strings übergeben werden:
Anmerkung des Übersetzers: Groß- und Kleinschreibung sind zulässig.

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

Rückrufe im alten Stil werden ebenfalls unterstützt, sind jedoch veraltet. Du kannst anrufen.Ende() ersetzen .Dann()::

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

Es können absolute URLs verwendet werden. In Webbrowsern werden absolute URLs nur auf dem Server implementiertCORSnur gültig.

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

KnotenKundenbetreuung zuUnix-Domänen-SocketsEine Anfrage stellen:

// Muster: https?+unix://SOCKET_PATH/REQUEST_PATH// „%2F“ im Socket-Pfad als „/“ 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}

DELETE__、__HEAD__、__PATCH__、__POSTUndSETZENAnfragen funktionieren auch, ändern Sie einfach den Methodennamen:

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

LÖSCHENkann auch benutzt werden.des()Aus Gründen der Kompatibilität mit älteren IE-Versionen aufgerufen, wolöschenist ein reserviertes Wort.

Die HTTP-Methode ist standardmäßig __GET__, daher ist der folgende Code gültig, wenn Sie dies bevorzugen:

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

Verwenden Sie HTTP/2

Um das HTTP/2-Protokoll (ohne HTTP/1.x-Fallback) zu verwenden, verwenden Sie.http2()Methode.

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

Legen Sie Anforderungsheaderfelder fest

Das Festlegen von Anforderungsheaderfeldern ist einfach: Rufen Sie an.Satz()Bei der Übergabe von Feldnamen und -werten:

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 Aufruf festzulegen:

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

ERHALTENfragen

.Anfrage()Methode akzeptiert ein Objekt und bei Verwendung mitERHALTENMethoden bilden zusammen eine Abfragezeichenfolge. Im Folgenden wird der Pfad generiert/search?query=Manny&range=1..5&order=desc. Anmerkung des Übersetzers:.Anfrage()Die Parameter der Methode müssen nicht vorab url-kodiert werden.

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

oder ein einzelnes Objekt übergeben:

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

.Anfrage()Methoden können auch Zeichenfolgen akzeptieren.

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

Oder schließen Sie sich ihnen einzeln an:

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

KOPFfragen

Sie können auch hinzufügenKOPFAnfragen verwenden die Methode .query(). Im Folgenden wird der Pfad generiert/users?email=joe@smith.com

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

POST/SETZENfragen

Ein typisches JSONPOSTEine Anfrage könnte so aussehen, wobei wir das entsprechend festlegenInhaltstypHeader-Felder und „schreiben“ einige Daten, in diesem Fall nur eine JSON-Zeichenfolge.

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 dies der FallStandardvon! Das folgende Beispiel entspricht dem vorherigen Beispiel.

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

oder mehrere anrufen.schicken()::

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

Standardmäßig wird eine Zeichenfolge gesendetInhaltstypFestlegen alsapplication/x-www-form-urlencoded, werden mehrere Anrufe mit getätigt&Verbindung, hier generiertname=tj&pet=tobi::

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

Das SuperAgent-Format ist erweiterbar, unterstützt jedoch standardmäßig „json“ und „form“. um die Daten zu übergeben alsapplication/x-www-form-urlencodedZum Versenden genügt ein Anruf.Typ()„form“ wird übergeben, der Standardwert ist „json“. DasPOSTDer Anfragetext lautet „name=tj&pet=tobi“.

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

Unterstützt auch das SendenFormulardatenObjekt. Das folgende Beispiel wirdPOSTFordern Sie den Inhalt des durch id="myForm" identifizierten HTML-Formulars an:

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

aufstellenInhaltstyp

Die offensichtliche Lösung ist die Verwendung.Satz()Methode:

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

.Typ()Die Methode ist auch als Kurzschrift verfügbar und akzeptiert die Kanonisierung mit Typ/SubtypMime TypName oder nur die Erweiterung, z. B. „xml“, „json“, „png“ usw.:

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

Serialisieren Sie den Anforderungstext

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';};// Als nächstes werden alle Anfragen mit dem Inhaltstyp „application/xml“ automatisch serialisiert

Wenn Sie den Datenkörper (Nutzlast) in einem benutzerdefinierten Format senden möchten, können Sie den integrierten Serialisierer auf Anfragebasis durch ersetzen.serialize()Methode:

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

Wiederholungsanforderung

Wenn die Anfrage vorübergehend fehlschlägt oder möglicherweise aufgrund einer instabilen Netzwerkverbindung und wenn gegeben.wiederholen()Methode wiederholt SuperAgent die Anfrage automatisch.

Diese Methode verfügt über zwei optionale Parameter: die Anzahl der Wiederholungsversuche (standardmäßig).1) und eine Callback-Funktion. Es ruft vor jedem Wiederholungsversuch callback(err, res) auf. Rückruf kann zurückkommenWAHR/FALSCHum zu steuern, ob die Anfrage wiederholt werden soll (es sollte jedoch immer die maximale Anzahl von Wiederholungen verwendet werden). request.get('https://example.com/search') .retry(2) // oder: .retry(2, callback) // entweder .then(finished); .catch(failed);

.wiederholen()nur verwenden füridempotentAnfragen (d. h. mehrere Anfragen, die den Server erreichen, ohne unerwünschte Nebenwirkungen wie Doppelkäufe).

Standardmäßig werden alle Anforderungsmethoden ausprobiert (das heißt, Sie müssen eine benutzerdefinierte Wiederholungsrückruffunktion übergeben, wenn Sie nicht möchten, dass POST-Anfragen erneut versucht werden).

Die folgenden Statuscodes werden standardmäßig wiederholt:

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

Die folgenden Fehlercodes werden standardmäßig wiederholt:

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

Legen Sie „Akzeptieren“ fest

Und.Typ()Die Methode ist ähnlich und Sie können auch die Kurzschriftmethode verwenden.akzeptieren()aufstellenAkzeptierenAnforderungsheader. Der Einfachheit halber wird auch zitiertrequest.types, sodass Sie das Ganze normalisieren könnenMime TypName angegeben alsTyp/Subtyp, oder geben Sie die erweiterte Suffixform als „xml“, „json“, „png“ usw. an:

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 dieAkzeptieren: application/jsonAnforderungsheader. Wenn Sie dies nicht tun, wird Facebook antwortenInhaltstyp: Text/Javascript; Zeichensatz=UTF-8, SuperAgent wird also nicht analysierenres.körperwird undefiniert sein. du kannst es benutzenreq.accept('json')oderreq.header('Accept', 'application/json')um dies zu tun. Weitere Informationen finden Sie unterHeft 1078

Abfragezeichenfolgen

req.query(obj)ist eine Methode, die zum Erstellen von Abfragezeichenfolgen verwendet werden kann. Zum Beispiel inPOSTZunahme?format=json&dest=/login::

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

Standardmäßig werden Abfragezeichenfolgen nicht in einer bestimmten Reihenfolge zusammengestellt. Kann benutzenreq.sortQuery()Abfragezeichenfolge zur Aktivierung der ASCII-basierten Sortierung. Sie können auch verwendenreq.sortQuery(myComparisonFn)Bietet benutzerdefinierte Sortiervergleichsfunktionen. Die Vergleichsfunktion sollte zwei Argumente akzeptieren und eine negative/null/positive Ganzzahl zurückgeben.

// Standardreihenfolge request.get('/user') .query('name=Nick') .query('search=Manny') .sortQuery() .then(callback) // Benutzerdefinierte 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 CA-Zertifikat als vertrauenswürdig ein
  • .cert(): Client-Zertifikatkette festlegen
  • .Taste(): Privatschlüssel des Clients festlegen
  • .pfx(): Legen Sie den PFX- oder PKCS12-codierten privaten Schlüssel und die Zertifikatskette des Clients fest
  • .disableTLSCerts(): Abgelaufene oder ungültige TLS-Zertifikate nicht ablehnen. intern eingestelltRejectUnauthorized=trueBeachten Sie, dass diese Methode Man-in-the-Middle-Angriffe ermöglicht.

Weitere Informationen finden Sie unter Node.jshttps.Request-Dokumentation

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 => {});

Analysieren des Antworttextes

SuperAgent analysiert für Sie bekannte Antworttextdaten, was derzeit unterstützt wirdapplication/x-www-form-urlencodedapplication/json,ebenso gut wieMultipart-/Formulardaten. Sie können die automatische Analyse anderer Antworttextdaten einrichten:

//Browser request.parse['application/xml'] = function (str) { return {'object': 'parsed from str'};};//noderequest.parse['application/xml'] = function (res , cb) { // Antworttext analysieren und res.body hier festlegen cb(null, res); }; // Als nächstes werden Antworten vom Typ „application/xml“ automatisch analysiert

du kannst es benutzen.buffer(true).parse(fn)Methode zum Festlegen eines benutzerdefinierten Parsers (anstelle der integrierten Parser). Wenn die Antwortpufferung nicht aktiviert ist (.buffer(false)), wird es ausgelöstAntwortEreignis, ohne auf den Abschluss des Body-Parsers zu warten, alsoAntwortkörperwird nicht verfügbar sein.

JSON / Urlencodiert

Attributeres.körperist das analysierte Objekt, z. B. wenn die Anfrage mit der JSON-Zeichenfolge „{“user“:{“name“: „tobi“}}“ geantwortet hatres.body.user.namewird „tobi“ sein. Ebenso führt ein x-www-form-urlencoded-Wert von „user[name]=tobi“ zum gleichen Ergebnis. Es wird nur eine Verschachtelungsebene unterstützt. Wenn Sie komplexere Daten benötigen, senden Sie bitte stattdessen JSON.

Senden Sie ein Array mit wiederholten Schlüsseln..send({color: ['red','blue']})werde sendenFarbe=Rot&Farbe=Blau. Wenn Sie möchten, dass die Namen der Array-Schlüssel enthalten sind[], müssen Sie es selbst hinzufügen, da SuperAgent es nicht automatisch hinzufügt.

Mehrteilig

Knoten-Client überBeeindruckendDas Modul unterstützt _multipart/form-data_. Beim Parsen einer mehrteiligen Antwort das Objektres.filessteht Ihnen ebenfalls zur Verfügung. Angenommen, eine Anfrage antwortet mit dem folgenden mehrteiligen Anfragetext:

--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--

res.body.namewird den Wert „Tobi“ haben undres.files.imageWird als dienenDateiObjekt.

Binärdaten

In einem Browser 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 Parameterwerte für diese Methode sind

  • 'Klecks'Den XmlHTTPRequests zugewiesenAntworttypAttribute
  • 'Arraybuffer'Dem Attribut „responseType“ von XmlHTTPRequest zugewiesen
req.get('/binary.data') .responseType('blob') .then(res => { // res.body wird der browsereigene Blob-Typ sein });

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

Antworteigenschaften

existierenAntwortFür das Objekt werden eine Reihe nützlicher Flags und Eigenschaften festgelegt, darunter Antworttext, analysierter Antworttext, Antwortheaderfelder, Statusflags und mehr.

Antworttext

res.textDie Eigenschaft enthält eine nicht analysierte Antworttextzeichenfolge. Diese Eigenschaft ist in der Client-API immer vorhanden und nur standardmäßig, wenn der Mime-Typ des Knotens mit „text/“ übereinstimmt.„、“/json“ oder „x-www-form-urlencoded“. Der Grund besteht darin, Speicher zu sparen, da das Puffern von Text für große Textkörper (z. B. mehrteilige Dateien oder Bilder) äußerst ineffizient ist. Informationen zum Erzwingen des Pufferns finden Sie unter „Pufferantwort"Teil.

Antwortkörper

So wie SuperAgent Anforderungsdaten automatisch serialisieren kann, kann er auch den Antworttext automatisch analysieren. Es wird analysiert, wenn ein Resolver für einen Inhaltstyp definiert wird, der standardmäßig „application/json“ und „application/x-www-form-urlencoded“ enthält. Dann kannst du bestehenres.körperAnalysiertes Objekt abrufen.

Antwort-Header-Feld

res.headerEin Objekt, das die geparsten Antwort-Header-Felder enthält, wobei die Feldnamen wie ein Knoten in Kleinbuchstaben geschrieben sind. Zum Beispielres.header['content-length']

Antwortinhaltstyp (Content-Type)

Der Content-Type-Antwortheader ist ein Sonderfallres.typ, das keinen Zeichensatz hat (und einen haben kann). Beispiel: „text/html; charset=utf8“Inhaltstypwird „text/html“ bereitstellen alsres.typ,Dannres.charsetDas Attribut enthält „utf8“.

Antwortstatus

Antwortstatus-Flags helfen zusammen mit anderen nützlichen Informationen festzustellen, ob die Anfrage erfolgreich war, wodurch SuperAgent ideal für die Interaktion mit RESTful-Webdiensten geeignet ist. 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; // 语法糖 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;

Abbruchanforderung

Um eine Anfrage abzubrechen, rufen Sie einfach anreq.abort()Methode.

Timeout-Einstellung

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

  • req.timeout({deadline:ms})oderreq.timeout(ms)(InMSist 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 Dauer des gesamten Downloads. Das Antwort-Timeout sollte mindestens ein paar Sekunden länger sein als die Zeit, die der Server benötigt, um zu antworten, da es auch Zeit für DNS-Suchen, TCP/IP- und TLS-Verbindungen und das Hochladen der angeforderten Daten umfasst.

Sie sollten beide verwendenTerminUndAntwortAuszeit. Auf diese Weise können Sie ein kurzes Antwort-Timeout nutzen, um nicht reagierende Netzwerke schnell zu erkennen, und eine lange Cutoff-Zeit, um Zeit für Downloads in langsamen, aber zuverlässigen Netzwerken zu schaffen. Beachten Sie, dass beide Timer die zulässige Zeit begrenzenhochladenBindungszeit. Wenn Sie eine Datei hochladen, verwenden Sie eine lange Zeitüberschreitung.

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 vollständig geladen ist . }) . then(res => { /* rechtzeitige Antwort */ }, err => { if (err.timeout) { /* timeout! */ } else { /* andere Fehler */ } });

Es liegt ein Timeout-Fehler vor.AuszeitAttribute.

verifizieren

Verfügbar sowohl im Node als auch im Browser über.auth()Methode zur Authentifizierung:

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

existierenKnotenIm Client kann die Basisauthentifizierung als „user:pass“ in die URL geschrieben werden:

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

Standardmäßig ist nur dieBasicAuthentifizierung. In einem 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'})

AutorMethode unterstützt auch aTrägertyp, um die tokenbasierte Authentifizierung anzugeben:

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

Folgen Sie der Weiterleitung

Standardmäßig werden bis zu 5 Weiterleitungen verfolgt, Sie können diese jedoch verwendenres.redirects(n)Methode, um es anzugeben:

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

Weiterleitungen, die das Limit überschreiten, gelten als Fehler. verwenden.ok(res => res.status < 400)Lesen Sie sie als Erfolgsantworten.

globaler Staatsagent

Cookies speichern

SuperAgent speichert standardmäßig keine Cookies in Node, Sie können sie jedoch verwenden.Agent()Die Methode erstellt eine Kopie des SuperAgents, der das Cookie enthält. Jede Kopie verfügt über einen separaten Cookie-Speicher.

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

In Browsern werden Cookies automatisch vom Browser verwaltet, also.Agent()Cookies werden nicht getrennt.

Standardoptionen für mehrere Anfragen

Die normale Anforderungsmethode, die auf einem Agenten aufgerufen wird, wird als Standard für alle von diesem Agenten gestellten Anforderungen verwendet.

const agent = request.agent() .use(plugin) .auth(shared); waiting agent.get('/with-plugin-and-auth'); // mit Plugin und Authentifizierung wait agent.get(' /also -with-plugin-and-auth'); // auch mit Plugin und Authentifizierung

Die vollständige Liste der Methoden, die der Proxy zum Festlegen von Standardwerten verwenden kann, ist:verwendenAneinmalSatzAnfrageTypakzeptierenAutorwithCredentialssortQuerywiederholenOKWeiterleitungenAuszeitPufferserialisierenanalysierencaTastepfxzert.

Pipeline-Daten

Mit dem Node-Client können Sie Daten in und aus Anfragen weiterleiten. Beachten Sie, dass mit.Rohr() ersetzen .end()/.then()Methode.

Der Inhalt der Pipeline-Datei als Beispielanfrage:

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 beim Senden von Anforderungen über die Pipeline der Superagent verwendet wirdChunked-Transfer-KodierungSenden Sie weitergeleitete Daten, die nicht von allen Servern unterstützt werden (z. B. Python-WSGI-Server).

oder leiten Sie die Antwort an eine Datei weiter:

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

Sie können Pipes und Callback-Funktionen oder Promises nicht mischen. Beachten Sie, dass Siesollte nichtVersuchen Sie es mit Rohrleitungen.Ende()oderAntwortObjektergebnis:

// Tun Sie dies nicht: const stream = getAWritableStream(); const req = request .get('/some.json') // SCHLECHT: Dies leitet nutzlose Informationen in 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() // BAD: Dies wird auch nicht unterstützt, Aufruf nach .end. Pipe. .pipe(nope_its_too_late);

im Superagentenzukünftige Versionrein, jaRohr()Unsachgemäße Aufrufe von schlagen fehl.

mehrteilige Anfrage

SuperAgent eignet sich auch hervorragend fürBauenes bietet Methode.anfügen()Und.Feld()mehrteilige Anfragen für .

wenn Sie es verwenden.Feld()oder.anfügen(), können Sie das nicht verwenden.schicken()Und dukann nichtaufstellenInhaltstyp(stellt den richtigen Typ für Sie ein).

Zusätzliche Dokumente

Um Dateien zu senden, verwenden Sie.attach(Name, [Datei], [Optionen]). Sie können dies tun, indem Sie mehrmals anrufen.anfügenum mehrere Dateien anzuhängen. Die Parameter sind:

  • Name— Formular Der Feldname im Formular.
  • Datei— eine Zeichenfolge mit einem Dateipfad oderBlob/PufferObjekt.
  • Optionen– (optional) eine Zeichenfolge für einen benutzerdefinierten Dateinamen oder{Dateiname: Zeichenfolge}Objekt. Wird auch in Node unterstützt{contentType: 'mime/type'}. Erstellen Sie einen Browser mit dem entsprechenden TypKlecks

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

Feldwert

Ähnlich wie Formularfelder in HTML können Sie diese verwenden.field(Name, Wert)Und.field({name: value})Legen Sie den Feldwert fest. Angenommen, Sie möchten einige Bilder mit Ihrem Namen und Ihrer E-Mail-Adresse hochladen. Ihre Anfrage könnte 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 und das Beste ist: Sie müssen nichts tun! Es funktioniert einfach.

Pufferantwort

Um zu erzwingen, dass der Antworttext als gepuffert wirdres.text, Du kannst anrufenreq.buffer(). Um die Standardpufferung von Textantworten (z. B. „text/plain“, „text/html“ usw.) aufzuheben, können Sie aufrufenreq.buffer(false)

wenn der Puffer zur Verfügung stehtres.gepuffertMit diesem Flag können Sie 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 entscheidet sich für die Verwendung von CORS-Headern. Der Browser gibt außerdem eine zusätzliche Meldung ausOPTIONENAnfrage, um zu prüfen, welche HTTP-Header und -Methoden vom Server zugelassen sind.Lesen Sie mehr über CORS

.withCredentials()Die Methode unterstützt das Senden von Cookies vom Ursprung, jedoch nur, wenn Access-Control-Allow-OriginNEINPlatzhalter ("*") undZugangskontrolle-Zulassen-Anmeldeinformationenwenn „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 Parameter übergeben: Fehler und Antwort. Wenn keine Fehler auftreten, wird das erste Argument verwendetNull::

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

Außerdem wird ein „Fehler“-Ereignis ausgelöst, auf das Sie warten können:

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

Bitte beachten Sie,Standardmäßig betrachtet Superagent 4xx- und 5xx-Antworten (und nicht behandelte 3xx-Antworten) als Fehler. Zum Beispiel, wenn Sie erhalten304 Nicht geändert403 Verbotenoder500 Interner ServerBei der Fehlerantwort werden diese Statusinformationen durch den weitergeleitetFehlerstatusliefern. Fehler aus solchen Antworten enthalten auch aFehlerantwortFeld, das enthält „AntworteigenschaftenAlle in „erwähnten Eigenschaften“. Die Bibliothek funktioniert auf diese Weise, um den häufigen Fall zu behandeln, dass eine erfolgreiche Antwort erforderlich ist und ein HTTP-Fehlerstatuscode als Fehler behandelt wird, während dennoch benutzerdefinierte Logik für bestimmte Fehlerbedingungen möglich ist.

Netzwerkausfälle, Zeitüberschreitungen und andere nicht reagierende Fehler werden nicht berücksichtigtFehlerstatusoderFehlerantwortFeld.

Wenn Sie 404- oder andere HTTP-Fehlerantworten verarbeiten möchten, können Sie eine Abfrage durchführenFehlerstatusAttribute. Wenn ein HTTP-Fehler (4xx- oder 5xx-Antwort) auftritt,Res.FehlerAttribut ist einFehlerObjekt, mit dem Sie die folgenden Prüfungen durchführen können:

if (err && err.status === 404) { Alert('oh no ' + res.body.message);}else if (err) { // alle anderen Fehlertypen, die behandelt werden müssen}

Alternativ können Sie verwenden.ok(Rückruf)Methode, um festzustellen, ob die Antwort ein Fehler ist.OKDie Callback-Funktion der Funktion ruft die Antwort ab und gibt true zurück, wenn die Antwort als Erfolg interpretiert werden soll.

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

Fortschrittsverfolgung

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

request.post(url) .attach('field_name', file) .on('progress', event => { /* Ereigniswert: { Richtung: "Upload" oder "Download" Prozent: 0 bis 100 // wenn unbekannt Dateigröße, möglicherweise nicht total: // Gesamtdateigröße, möglicherweise nicht geladen: // Anzahl der bisher heruntergeladenen oder hochgeladenen Bytes} */ }) .then()

Testen Sie auf localhost

Erzwingen Sie Verbindungen zu bestimmten IP-Adressen

In Node.js können Sie die DNS-Auflösung ignorieren und verwenden.verbinden()Die Methode leitet alle Anfragen an eine bestimmte IP-Adresse weiter. Diese Anfrage würde beispielsweise an „localhost“ gehenexample.com::

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

Da Anfragen möglicherweise umgeleitet werden, können mehrere Hostnamen und mehrere IPs sowie ein spezielles angegeben werden*Als Fallback (Hinweis: Es werden keine anderen Platzhalter unterstützt). Anfrage wird behaltenGastgeberDer ursprüngliche Wert des Anforderungsheaders.

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

Ignorieren Sie defektes/unsicheres HTTPS auf localhost

Wenn HTTPS in Node.js falsch konfiguriert und unsicher ist (z. B. die Verwendung eines selbstsignierten Zertifikats anstelle vonNicht angebenmein eigenes.ca()), ist ein Anruf weiterhin möglich.trustLocalhost()etwas erlaubenlocalhostAnfrage für:

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

Und.connect("127.0.0.1")Zusammen kann dies dazu verwendet werden, HTTPS-Anfragen an jede beliebige Domäne zu erzwingen, zu der sie umgeleitet werdenlocalhost

Es ist im Allgemeinen sicher, fehlerhaftes HTTPS auf localhost zu ignorieren, da die Loopback-Schnittstelle nicht für nicht vertrauenswürdige Netzwerke verfügbar ist. VertrauenlocalhostKönnte in Zukunft zur Standardeinstellung werden. verwenden.trustLocalhost(false)Obligatorische Inspektion127.0.0.1Zuverlässigkeit.

Wir unterstützen die Deaktivierung der HTTPS-Sicherheit bei Anfragen an andere IP-Adressen absichtlich nicht, da diese Optionen letztendlich als schnelle „Lösungen“ für HTTPS-Probleme missbraucht werden. Sie können von herunterladenLassen Sie uns verschlüsselnHolen Sie sich ein kostenloses HTTPS-Zertifikat oder richten Sie Ihre eigene CA ein (.as(as_public_pem)), um Ihr selbstsigniertes Zertifikat vertrauenswürdig zu machen.

Unterstützung von Promise- und Generatorfunktionen

Die Anfrage eines SuperAgents ist ein „thenable“-Objekt (ein Objekt mit einer then-Methode), das mit JavaScript Promise und kompatibel istasynchron/wartenGrammatisch kompatibel.

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

Wenn Sie Promise verwenden,will nichtüberweisen.Ende()oder.Rohr(). jede Verwendung.Dann()odererwartenAlle anderen Möglichkeiten zur Verwendung von Anfragen sind deaktiviert. Bildcoso eine Bibliothek oder ähnlicheszuEin solcher Webframe kann auf jeder SuperAgent-Methode vorhanden seinErtrag::

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

Beachten Sie, dass SuperAgent eine globale erwartetVersprechenObjekt existiert. Sie benötigen eine Polyfüllung, um Promises in Internet Explorer oder Node.js 0.10 verwenden zu können.

Browser- und Knotenversion

Es gibt zwei Implementierungen von SuperAgent: 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 Code für Node.JS mit WebPack kompilieren möchten, müssen Siemussin seiner Konfiguration angegebenKnotenziel

Verwenden Sie die Browserversion in Electron

ElektronDie Entwickler berichten, dass Sie die Browserversion von SuperAgent anstelle der Node-Version verwenden könnenrequire('superagent/superagent'). Dadurch wird Ihre Anfrage auf der Registerkarte „Netzwerk“ der Chrome Developer Tools angezeigt. Beachten Sie, dass diese Umgebung weder von der automatisierten Testsuite abgedeckt noch offiziell unterstützt wird.

Verwenden Sie einen Proxy, um Anfragen zu senden

Kann die eines anderen Autors verwendenSuperagent-ProxyModul

Übersetzungsanweisungen

Der gesamte Inhalt des Dokuments wurde entsprechend dem englischen Originaldokument übersetzt und der Übersetzer ist nicht gut genug. Bitte weisen Sie daher auf Fehler hin

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!

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.

Does SuperAgent return a promise? ›

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

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 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 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.

How to make an HTTP GET request in node js? ›

How to make HTTP GET Request in Node. js [Practical Examples]
  1. Introduction.
  2. Method-1: Using HTTPS Module.
  3. Method-2: Using Axios.
  4. Method-3: Using SuperAgent.
  5. Method-4: Using Unirest.
  6. Method-5: Using Fetch API.
  7. Recap.

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.

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.

Does promise use callback? ›

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

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 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 Supertest API? ›

What is Supertest? 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 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 a Web API from another Web API? ›

How To Call Web API In Another Project From C#
  1. public class StateController : ApiController.
  2. {
  3. [HttpGet]
  4. [Route("api/State/StateList")]
  5. public List<StateDto> StateList()
  6. {
  7. List<StateDto> StateList = new List<StateDto>();
  8. SqlConnection sqlConnection = new SqlConnection();
Aug 25, 2020

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 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 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

How do I GET HTTP request from browser? ›

You can easily extract this information from the HTTP Request headers. There is a request header called 'User-Agent'. Access this header from the request and you'll get a string with information like the Browser Model, Platform(OS), geckoversion etc.

How to GET data from HTTP request in JavaScript? ›

open() method, when you specify the request type (GET) and the endpoint/URL where you want to request data. Another method you will use is . send() , which sends the request to the server. You can also specify the format in which the data will be returned using the responseType method.

How to GET data from HTTP request? ›

GET is an HTTP method for requesting data from the server. Requests using the HTTP GET method should only fetch data, cannot enclose data in the body of a GET message, and should not have any other effect on data on the server.

What is the difference between HTTP request and HTTP GET in node? ›

Since most requests are GET requests without bodies, Node. js provides this convenience method. The only difference between this method and http. request() is that it sets the method to GET and calls req.

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 send HTTP request and get response in JavaScript? ›

How To Send a GET Request in JavaScript Using XMLHttpRequest
  1. Create a new XMLHttpRequest object.
  2. Open a connection by specifying the request type and endpoint (the URL of the server).
  3. Send the request.
  4. Listen for the server's response.
May 4, 2023

Which is faster callback or Promise? ›

Till now common perception was that for getting out of callback hell we should use promises or for clean code but what about efficiency. So from my findings i assure you ES6 promises are faster and recommended than old callbacks. I recommend to get a common understanding of JS event loop.

Why we use async instead of promises? ›

Async/Await is much cleaner and readable to write as compared to Promises. Async/Await looks like Synchronous. Promises has support for automatic error handling using .

Are promises asynchronous or synchronous? ›

A promise is an object returned by an asynchronous function, which represents the current state of the operation. At the time the promise is returned to the caller, the operation often isn't finished, but the promise object provides methods to handle the eventual success or failure of the operation.

What is the difference between async await and callback promise? ›

In summary, promises, callbacks, and async/await are all ways to handle asynchronous operations in JavaScript, with promises providing a more elegant way of handling async operations, callbacks being a more traditional way, and async/await providing a more convenient and readable way of handling async operations.

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 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.

What are the three arguments involved by callback? ›

Looking at the documentation on the every method, you can see that the callback is passed three arguments: an element of the array, the index of that element, and the whole array.

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 do you check if an API is working or not? ›

API testing flow is quite simple with three main steps:
  1. Send the request with necessary input data.
  2. Get the response having output data.
  3. Verify that the response returned as expected in the requirement.

What is the best way to test API? ›

API Testing Best Practices
  1. Test for the typical or expected results first.
  2. Add stress to the system through a series of API load tests.
  3. Test for failure. ...
  4. Group test cases by test category.
  5. Prioritize API function calls so that it will be easy for testers to test quickly and easily.

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.

How do I send form data to my web server? ›

To post HTML form data to the server in URL-encoded format, you need to make an HTTP POST request to the server and provide the HTML form data in the body of the POST message in key=value format. You must also specify the data type using the Content-Type: application/x-www-form-urlencoded request HTTP header.

Which tool is used for API testing? ›

The tool that is most commonly used for API testing is Testim. Testim is a powerful tool for API testing that makes it easy to create and execute automated tests for your API.

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 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.

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)

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 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.

What is McAfee agent handler? ›

Agent handlers transparently handle requests for software and cache the required files after downloading from the master repository. No configuration is necessary. Introducing Agent Handlers. Purpose of Agent Handler. McAfee Agent Handlers.

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

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.

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 is the best library for API calls? ›

You should be using Axios in place of the Node. js native HTTP or HTTPS standard libraries for API calls due to the following features: Axios is the best-suited library to stop request tasks.

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 does SSO work with API? ›

miniOrange allows you to authenticate your users via API authentication provider into multiple applications. This way, you can achieve Single Sign-On (SSO) into your applications where the users will need to authenticate themselves via your API Server only once and they can access all the configured applications.

References

Top Articles
Latest Posts
Article information

Author: Nathanael Baumbach

Last Updated: 10/24/2023

Views: 5975

Rating: 4.4 / 5 (55 voted)

Reviews: 86% of readers found this page helpful

Author information

Name: Nathanael Baumbach

Birthday: 1998-12-02

Address: Apt. 829 751 Glover View, West Orlando, IN 22436

Phone: +901025288581

Job: Internal IT Coordinator

Hobby: Gunsmithing, Motor sports, Flying, Skiing, Hooping, Lego building, Ice skating

Introduction: My name is Nathanael Baumbach, I am a fantastic, nice, victorious, brave, healthy, cute, glorious person who loves writing and wants to share my knowledge and understanding with you.