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 + query
Schritt machen musste. Dies sollte von einer gemeinsamen Bibliothek gekapselt werden, aber ich sehe dies noch nicht in der http
Bibliothek 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.
node.js
http
query-string
Djechlin
quelle
quelle
Antworten:
Ü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); });
quelle
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.path
enthält die Abfrageparameter.const req = https.get({ hostname: requestUrl.hostname, path: requestUrl.path, }, (res) => { // ... })
quelle
https
OP 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önlichWenn 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
createServer
Rückruf, ein Attribut hinzufügen ,params
umrequest
Objekt: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" })
quelle
querystring
Modul von Node zu verwenden, als zu versuchen, dies selbst zu analysieren.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
,lat
undlon
als Abfrageparameter und Rückgabewetterdaten alsJSON
Objekt. 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
querystring
Modul verwenden möchten, nehmen Sie die folgenden Änderungen vorvar queryObject = querystring.stringify({ APPID: OpenWeatherAppId.appId, lat: req.body.lat, lon: req.body.lon }); request({ url:urlOpenWeatherCurrent + queryObject }, function (error, response, body) {...})
quelle
Wenn Sie jemals eine
GET
Anfrage an eineIP
oder eine senden müssenDomain
(andere Antworten haben nicht erwähnt, dass Sie eineport
Variable 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
https
Modul für die Kommunikation über ein gesichertes Netzwerk verwenden können.quelle