node.js http 'get' Anfrage mit Abfragezeichenfolgenparametern

83

Ich habe eine Node.js-Anwendung, die (im Moment) ein http-Client ist. Also mache ich:

var query = require('querystring').stringify(propertiesObject);
http.get(url + query, function(res) {
   console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
    console.log("Got error: " + e.message);
});

Dies scheint ein guter Weg zu sein, um dies zu erreichen. Allerdings bin ich etwas verärgert, dass ich den url + querySchritt machen musste. Dies sollte von einer gemeinsamen Bibliothek gekapselt werden, aber ich sehe dies noch nicht in der httpBibliothek des Knotens und bin mir nicht sicher, welches Standard-npm-Paket dies erreichen könnte. Gibt es einen einigermaßen weit verbreiteten Weg, der besser ist?

Die Methode url.format erspart das Erstellen einer eigenen URL. Aber im Idealfall wird die Anfrage auch höher sein.

Djechlin
quelle

Antworten:

158

Überprüfen Sie das Anforderungsmodul .

Es bietet mehr Funktionen als der integrierte http-Client des Knotens.

var request = require('request');

var propertiesObject = { field1:'test1', field2:'test2' };

request({url:url, qs:propertiesObject}, function(err, response, body) {
  if(err) { console.log(err); return; }
  console.log("Get response: " + response.statusCode);
});
Daniel
quelle
Wie würde ein typisches propertiesObject aussehen? Ich kann das nicht zum
Laufen bringen
3
Das qs ist der Abfragezeichenfolgenschlüssel. Also, welche Felder Sie auch immer in der Abfragezeichenfolge haben möchten. {Feld1: 'Test1', Feld2: 'Test2'}
Daniel
Weiß jemand, wie man das nur mit dem Nodejs-Kern-http-Modul macht?
Alexander Mills
1
@ AlexanderMills sehen meine Antwort. Eine Drittanbieter-Bibliothek ist nicht erforderlich.
Justin Meiners
8
Das Anforderungsmodul ist jetzt veraltet und veraltet.
AmiNadimi
19

Keine Notwendigkeit für eine Bibliothek eines Drittanbieters. Verwenden Sie das URL-Modul von nodejs , um eine URL mit Abfrageparametern zu erstellen:

const requestUrl = url.parse(url.format({
    protocol: 'https',
    hostname: 'yoursite.com',
    pathname: '/the/path',
    query: {
        key: value
    }
}));

Stellen Sie dann die Anfrage mit der formatierten URL. requestUrl.pathenthält die Abfrageparameter.

const req = https.get({
    hostname: requestUrl.hostname,
    path: requestUrl.path,
}, (res) => {
   // ...
})
Justin Meiners
quelle
Ich werde versuchen, diese Lösung zu verwenden, da ich einen vorhandenen Code verwenden möchte, der den integrierten Code verwendet. Das httpsOP hat jedoch nach einer höheren Abstraktion und / oder Bibliotheken zum Erstellen von URL-Zeichenfolgen mit Abfragen gefragt, daher denke ich, dass dies akzeptiert wird Antwort ist mehr gültig persönlich
Scott Anderson
2
@ ScottAnderson Mir geht es gut, wenn ich nicht die akzeptierte Antwort bin. Ich möchte den Menschen nur helfen, das zu tun, was sie brauchen. Ich bin froh, dass es dir helfen konnte.
Justin Meiners
6

Wenn Sie kein externes Paket verwenden möchten, fügen Sie einfach die folgende Funktion in Ihre Dienstprogramme ein:

var params=function(req){
  let q=req.url.split('?'),result={};
  if(q.length>=2){
      q[1].split('&').forEach((item)=>{
           try {
             result[item.split('=')[0]]=item.split('=')[1];
           } catch (e) {
             result[item.split('=')[0]]='';
           }
      })
  }
  return result;
}

Dann in createServerRückruf, ein Attribut hinzufügen , paramsum requestObjekt:

 http.createServer(function(req,res){
     req.params=params(req); // call the function above ;
      /**
       * http://mysite/add?name=Ahmed
       */
     console.log(req.params.name) ; // display : "Ahmed"

})
Abdennour TOUMI
quelle
2
Die Frage des OP betrifft http-Clients, nicht http-Server. Diese Antwort ist relevant für das Parsen von Abfragezeichenfolgen auf einem http-Server und nicht für das Codieren von Abfragezeichenfolgen für eine http-Anforderung.
Stephen Schaub
Dies ist das Gegenteil von dem, worüber die Frage gestellt wurde, und es ist auch besser, das integrierte querystringModul von Node zu verwenden, als zu versuchen, dies selbst zu analysieren.
Peterflynn
6

Ich habe Probleme damit, meiner URL Parameter für Abfragezeichenfolgen hinzuzufügen. Ich konnte es nicht zum Laufen bringen, bis mir klar wurde, dass ich es ?am Ende meiner URL hinzufügen musste , sonst funktioniert es nicht. Dies ist sehr wichtig, da es Ihnen Stunden beim Debuggen erspart. Glauben Sie mir: Ich war dort ... habe das getan .

Unten ist eine einfache API Endpoint , dass die Anrufe Öffnen Weather API und übergibt APPID, latund lonals Abfrageparameter und Rückgabewetterdaten als JSONObjekt. Hoffe das hilft.

//Load the request module
var request = require('request');

//Load the query String module
var querystring = require('querystring');

// Load OpenWeather Credentials
var OpenWeatherAppId = require('../config/third-party').openWeather;

router.post('/getCurrentWeather', function (req, res) {
    var urlOpenWeatherCurrent = 'http://api.openweathermap.org/data/2.5/weather?'
    var queryObject = {
        APPID: OpenWeatherAppId.appId,
        lat: req.body.lat,
        lon: req.body.lon
    }
    console.log(queryObject)
    request({
        url:urlOpenWeatherCurrent,
        qs: queryObject
    }, function (error, response, body) {
        if (error) {
            console.log('error:', error); // Print the error if one occurred

        } else if(response && body) {
            console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
            res.json({'body': body}); // Print JSON response.
        }
    })
})  

Wenn Sie das querystringModul verwenden möchten, nehmen Sie die folgenden Änderungen vor

var queryObject = querystring.stringify({
    APPID: OpenWeatherAppId.appId,
    lat: req.body.lat,
    lon: req.body.lon
});

request({
   url:urlOpenWeatherCurrent + queryObject
}, function (error, response, body) {...})
AllJs
quelle
1

Wenn Sie jemals eine GETAnfrage an eine IPoder eine senden müssen Domain(andere Antworten haben nicht erwähnt, dass Sie eine portVariable angeben können), können Sie diese Funktion verwenden:

function getCode(host, port, path, queryString) {
    console.log("(" + host + ":" + port + path + ")" + "Running httpHelper.getCode()")

    // Construct url and query string
    const requestUrl = url.parse(url.format({
        protocol: 'http',
        hostname: host,
        pathname: path,
        port: port,
        query: queryString
    }));

    console.log("(" + host + path + ")" + "Sending GET request")
    // Send request
    console.log(url.format(requestUrl))
    http.get(url.format(requestUrl), (resp) => {
        let data = '';

        // A chunk of data has been received.
        resp.on('data', (chunk) => {
            console.log("GET chunk: " + chunk);
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', () => {
            console.log("GET end of response: " + data);
        });

    }).on("error", (err) => {
        console.log("GET Error: " + err);
    });
}

Verpassen Sie nicht, Module oben in Ihrer Datei zu benötigen:

http = require("http");
url = require('url')

Denken Sie auch daran, dass Sie das httpsModul für die Kommunikation über ein gesichertes Netzwerk verwenden können.

AmiNadimi
quelle