HTTP-GET-Anfrage in Node.js Express

Lesezeit: 8 Minuten

HTTP GET Anfrage in Nodejs
Travis Parks

Wie kann ich innerhalb von Node.js oder Express.js eine HTTP-Anfrage stellen? Ich muss mich mit einem anderen Dienst verbinden. Ich hoffe, dass der Aufruf asynchron ist und dass der Rückruf die Antwort des Remote-Servers enthält.

HTTP GET Anfrage in Nodejs
Bryanmac

Hier ist ein Codeausschnitt aus einem Beispiel von mir. Es ist asynchron und gibt ein JSON-Objekt zurück. Es kann jede Form von GET-Anfrage ausführen.

Beachten Sie, dass es optimalere Möglichkeiten gibt (nur ein Beispiel) – zum Beispiel, anstatt die Chunks, die Sie in ein Array einfügen, zu verketten und zu verbinden usw. … Hoffentlich bringt es Sie in die richtige Richtung:

const http = require('http');
const https = require('https');

/**
 * getJSON:  RESTful GET request returning JSON object(s)
 * @param options: http options object
 * @param callback: callback to pass the results JSON object(s) back
 */

module.exports.getJSON = (options, onResult) => {
  console.log('rest::getJSON');
  const port = options.port == 443 ? https : http;

  let output="";

  const req = port.request(options, (res) => {
    console.log(`${options.host} : ${res.statusCode}`);
    res.setEncoding('utf8');

    res.on('data', (chunk) => {
      output += chunk;
    });

    res.on('end', () => {
      let obj = JSON.parse(output);

      onResult(res.statusCode, obj);
    });
  });

  req.on('error', (err) => {
    // res.send('error: ' + err.message);
  });

  req.end();
};

Es wird aufgerufen, indem ein Optionsobjekt wie folgt erstellt wird:

const options = {
  host: 'somesite.com',
  port: 443,
  path: '/some/path',
  method: 'GET',
  headers: {
    'Content-Type': 'application/json'
  }
};

Und Bereitstellung einer Rückruffunktion.

In einem Dienst benötige ich beispielsweise das obige REST-Modul und mache dann Folgendes:

rest.getJSON(options, (statusCode, result) => {
  // I could work with the resulting HTML/JSON here. I could also just return it
  console.log(`onResult: (${statusCode})nn${JSON.stringify(result)}`);

  res.statusCode = statusCode;

  res.send(result);
});

AKTUALISIEREN

Wenn Sie suchen async/await (linear, kein Rückruf), Versprechungen, Kompilierzeitunterstützung und Intellisense haben wir einen leichtgewichtigen HTTP- und REST-Client entwickelt, der dieser Rechnung entspricht:

Microsoft hat „rest-client“ eingegeben

  • @bryanmac kannst du bitte das vollständige Beispiel senden/hinzufügen?

    – StErMi

    17. Januar 13 um 9:55 Uhr

  • @bryanmac mit Ihrer Erlaubnis möchte ich dieses Code-Grunz-Plugin verwenden, das ich gerade baue. Ich bin mir nicht sicher, wann, aber es würde nach Fertigstellung Open Source sein.

    – JeffH

    25. April 13 um 15:52 Uhr

  • versuchen Sie das Anforderungsmodul. Es ist viel einfacher sitepoint.com/making-http-requests-in-node-js

    – saurshaz

    24. August 13 um 5:33 Uhr


  • ja – das Anforderungsmodul ist einfach, aber dies ist eine niedrigere Ebene, die zeigt, was Bibliotheken wie das Anforderungsmodul tun. Wenn Sie eine Steuerung auf niedrigerer Ebene oder HTTP-Anfragen benötigen (Fortschritt bei großen Downloads usw. anzeigen), zeigt dies, wie es gemacht wird.

    – Bryanmac

    24. August 13 um 16:50 Uhr

  • @KrIsHnA – Knoten hat ein Querystring-Objekt: nodejs.org/api/querystring.html und URL-Objekt nodejs.org/docs/latest/api/url.html

    – Bryanmac

    4. August 16 um 21:01 Uhr

HTTP GET Anfrage in Nodejs
Maerik

Versuchen Sie es mit dem Einfachen http.get(options, callback) Funktion in node.js:

var http = require('http');
var options = {
  host: 'www.google.com',
  path: '/index.html'
};

var req = http.get(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  // Buffer the body entirely for processing as a whole.
  var bodyChunks = [];
  res.on('data', function(chunk) {
    // You can process streamed parts here...
    bodyChunks.push(chunk);
  }).on('end', function() {
    var body = Buffer.concat(bodyChunks);
    console.log('BODY: ' + body);
    // ...and/or process the entire body here.
  })
});

req.on('error', function(e) {
  console.log('ERROR: ' + e.message);
});

Es gibt auch einen General http.request(options, callback) Funktion Damit können Sie die Anforderungsmethode und andere Anforderungsdetails angeben.

  • Wo ist der Inhalt der Antwort des Servers, nach der das OP gefragt hat?

    – Dan Dascalescu

    20. Dezember 13 um 13:55 Uhr


  • Danke für das Update. Sieht so aus, als ob ein ‘End’-Handler benötigt wird, um die Chunks dann zu verketten. Was im Grunde auf die Antwort von @bryanmac hinausläuft?

    – Dan Dascalescu

    20. Dezember 13 um 15:04 Uhr

  • @DanDascalescu: Ja, wenn Sie den Körper als Ganzes verarbeiten möchten (was wahrscheinlich ist), möchten Sie ihn wahrscheinlich puffern und am Ende verarbeiten. Ich werde meine Antwort auch der Vollständigkeit halber aktualisieren.

    – Maerik

    20. Dezember ’13 um 15:30 Uhr

  • Entschuldigung, ich kann nicht herausfinden, mit welchen Parametern der Rückruf aufgerufen wird … wie kann ich den Körper erhalten und wo ist die Referenz für Parameter und Eigenschaften dieser Parameter.

    – Muhammad Umer

    23. Februar 15 um 0:27 Uhr

  • @maerics Wie kann ich das verwenden GET Anfrage, ob ich diese URL habe? graph.facebook.com/debug_token? input_token={token-to-inspect} &access_token={app-token-or-admin-token} ?

    – frank17

    24. März 19 um 0:15 Uhr


1643909708 727 HTTP GET Anfrage in Nodejs
Stapelbenutzer2

Anfrage und Superagent sind ziemlich gute Bibliotheken zu verwenden.

Hinweis: Anfrage ist veraltetBenutzung auf eigene Gefahr!

Verwenden request:

var request=require('request');

request.get('https://someplace',options,function(err,res,body){
  if(err) //TODO: handle err
  if(res.statusCode === 200 ) //etc
  //TODO Do something with response
});

  • Sollte es in Sekunde res.statusCode === 200 sein, wenn ? )

    – Gleb Dolzikov

    27. Juni 17 um 6:44 Uhr


  • Was ist die Optionsvariable? einfach undefined übergeben? das bezweifle ich

    – lxknvlk

    13. Juni 19 um 9:18 Uhr

Sie können auch verwenden Anfordernein wirklich cooler und sehr einfacher HTTP-Client, den ich für nodeJS geschrieben habe + er unterstützt Caching.

Führen Sie einfach Folgendes für die GET-Methodenanforderung aus:

var requestify = require('requestify');

requestify.get('http://example.com/api/resource')
  .then(function(response) {
      // Get the response body (JSON parsed or jQuery object for XMLs)
      response.getBody();
  }
);

1643909709 619 HTTP GET Anfrage in Nodejs
maqduni

Diese Version basiert auf der ursprünglich von Bryanmac vorgeschlagenen Funktion, die Versprechungen verwendet, eine bessere Fehlerbehandlung bietet und in ES6 neu geschrieben wurde.

let http = require("http"),
    https = require("https");

/**
* getJSON:  REST get request returning JSON object(s)
* @param options: http options object
*/
exports.getJSON = function (options) {
    console.log('rest::getJSON');
    let reqHandler = +options.port === 443 ? https : http;

    return new Promise((resolve, reject) => {
        let req = reqHandler.request(options, (res) => {
            let output="";
            console.log('rest::', options.host + ':' + res.statusCode);
            res.setEncoding('utf8');

            res.on('data', function (chunk) {
                output += chunk;
            });

            res.on('end', () => {
                try {
                    let obj = JSON.parse(output);
                    // console.log('rest::', obj);
                    resolve({
                        statusCode: res.statusCode,
                        data: obj
                    });
                }
                catch (err) {
                    console.error('rest::end', err);
                    reject(err);
                }
            });
        });

        req.on('error', (err) => {
            console.error('rest::request', err);
            reject(err);
        });

        req.end();
    });
};

Als Ergebnis müssen Sie keine Callback-Funktion übergeben, stattdessen gibt getJSON() ein Promise zurück. Im folgenden Beispiel wird die Funktion innerhalb eines ExpressJS-Routenhandlers verwendet

router.get('/:id', (req, res, next) => {
    rest.getJSON({
        host: host,
        path: `/posts/${req.params.id}`,
        method: 'GET'
    }).then(({ statusCode, data }) => {
        res.json(data);
    }, (error) => {
        next(error);
    });
});

Im Fehlerfall delegiert es den Fehler an die Fehlerbehandlungs-Middleware des Servers.

  • Ja, dieses Beispiel zeigt, wie es in einem Express gemacht wird get Routendefinition, die vielen Beiträgen hier fehlt.

    – Mikros

    21. Dezember 18 um 10:08 Uhr

  • In Ihrem 2. Code diesbezüglich express example, es scheint, als wäre es der Servercode, während der erste Code der Clientcode ist. Was ist rest.getJSON im 2. Code? Ist es ein Tippfehler und sollte es sein res.getJSON?

    –Timo

    28. Dezember 21 um 14:31 Uhr


  • rest ist das Objekt, das im ersten Codeblock exportiert wird. Daher um zugreifen zu können getJSON() Sie können entweder die gesamte importieren rest Objekt oder einfach importieren getJSON aus der ersten Datei. Beides sind serverseitige Auszüge.

    – maqduni

    28. Dezember 21 um 19:31 Uhr

1643909709 115 HTTP GET Anfrage in Nodejs
Brian Beckett

Unirest ist die beste Bibliothek, auf die ich gestoßen bin, um HTTP-Anforderungen von Node. Es zielt darauf ab, ein Multiplattform-Framework zu sein, also wird es Ihnen gut tun, zu lernen, wie es auf Node funktioniert, wenn Sie einen HTTP-Client auch auf Ruby, PHP, Java, Python, Objective C, .Net oder Windows 8 verwenden müssen. Soweit ich das beurteilen kann, werden die unirest-Bibliotheken hauptsächlich von vorhandenen HTTP-Clients unterstützt (z. B. auf Java, dem Apache HTTP-Client, auf Node, Mikeals Request-Bibliothek) – Unirest legt einfach eine schönere API oben drauf.

Hier sind ein paar Codebeispiele für Node.js:

var unirest = require('unirest')

// GET a resource
unirest.get('http://httpbin.org/get')
  .query({'foo': 'bar'})
  .query({'stack': 'overflow'})
  .end(function(res) {
    if (res.error) {
      console.log('GET error', res.error)
    } else {
      console.log('GET response', res.body)
    }
  })

// POST a form with an attached file
unirest.post('http://httpbin.org/post')
  .field('foo', 'bar')
  .field('stack', 'overflow')
  .attach('myfile', 'examples.js')
  .end(function(res) {
    if (res.error) {
      console.log('POST error', res.error)
    } else {
      console.log('POST response', res.body)
    }
  })

Sie können direkt zu den Node-Dokumenten springen Hier

  • Ja, dieses Beispiel zeigt, wie es in einem Express gemacht wird get Routendefinition, die vielen Beiträgen hier fehlt.

    – Mikros

    21. Dezember 18 um 10:08 Uhr

  • In Ihrem 2. Code diesbezüglich express example, es scheint, als wäre es der Servercode, während der erste Code der Clientcode ist. Was ist rest.getJSON im 2. Code? Ist es ein Tippfehler und sollte es sein res.getJSON?

    –Timo

    28. Dezember 21 um 14:31 Uhr


  • rest ist das Objekt, das im ersten Codeblock exportiert wird. Daher um zugreifen zu können getJSON() Sie können entweder die gesamte importieren rest Objekt oder einfach importieren getJSON aus der ersten Datei. Beides sind serverseitige Auszüge.

    – maqduni

    28. Dezember 21 um 19:31 Uhr

1643909709 163 HTTP GET Anfrage in Nodejs
Jonathan McIntire

Kasse Fetzen. Es ist ein Knoten-HTTP-Client, der von erstellt und verwaltet wird spire.io das Umleitungen, Sitzungen und JSON-Antworten verarbeitet. Es eignet sich hervorragend für die Interaktion mit Rest-APIs. Sehen diesen Blogbeitrag für mehr Details.

.

758140cookie-checkHTTP-GET-Anfrage in Node.js Express

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy