Mam aplikację Node.js, która jest klientem http (w tej chwili). Więc robię:
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);
});
Wydaje się, że jest to wystarczająco dobry sposób, aby to osiągnąć. Jednak jestem nieco urażony, że musiałem zrobić ten url + query
krok. Powinno to być hermetyzowane przez wspólną bibliotekę, ale nie widzę tego http
jeszcze w bibliotece węzła i nie jestem pewien, jaki standardowy pakiet npm mógłby to zrobić. Czy istnieje rozsądnie szeroko stosowany sposób, który jest lepszy?
url.format zapisuje prace związane z budowaniem własnego adresu URL. Ale najlepiej byłoby, gdyby wniosek był również na wyższym poziomie niż ten.
node.js
http
query-string
djechlin
źródło
źródło
Odpowiedzi:
Sprawdź moduł zapytań .
Jest bardziej funkcjonalny niż wbudowany klient HTTP węzła.
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); });
źródło
Nie ma potrzeby posiadania biblioteki innej firmy. Użyj modułu nodejs url, aby zbudować adres URL z parametrami zapytania:
const requestUrl = url.parse(url.format({ protocol: 'https', hostname: 'yoursite.com', pathname: '/the/path', query: { key: value } }));
Następnie wyślij żądanie ze sformatowanym adresem URL.
requestUrl.path
będzie zawierać parametry zapytania.const req = https.get({ hostname: requestUrl.hostname, path: requestUrl.path, }, (res) => { // ... })
źródło
https
, jednak OP poprosił o abstrakcje wyższego poziomu i / lub biblioteki do tworzenia ciągów adresów URL z zapytaniami, więc myślę, że zaakceptowano odpowiedź jest bardziej trafna osobiścieJeśli nie chcesz używać zewnętrznego pakietu, po prostu dodaj następującą funkcję do swoich narzędzi:
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; }
Następnie w
createServer
wywołaniu zwrotnym dodaj atrybutparams
dorequest
obiektu: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" })
źródło
querystring
modułu Node, niż próbować analizować to samodzielnie.Zmagałem się z dodaniem parametrów ciągu zapytania do mojego adresu URL. Nie mogłem tego zrobić, dopóki nie zdałem sobie sprawy, że muszę dodać
?
na końcu mojego adresu URL, w przeciwnym razie to nie zadziała. Jest to bardzo ważne, ponieważ pozwoli Ci zaoszczędzić godziny na debugowaniu, uwierz mi: byłem tam ... zrobiłem to .Poniżej znajduje się prosty punkt końcowy interfejsu API, który wywołuje interfejs API Open Weather i przekazuje
APPID
,lat
a takżelon
jako parametry zapytania i zwraca dane pogodowe jakoJSON
obiekt. Mam nadzieję że to pomoże.//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. } }) })
Lub jeśli chcesz korzystać z
querystring
modułu, wprowadź następujące zmianyvar queryObject = querystring.stringify({ APPID: OpenWeatherAppId.appId, lat: req.body.lat, lon: req.body.lon }); request({ url:urlOpenWeatherCurrent + queryObject }, function (error, response, body) {...})
źródło
Jeśli kiedykolwiek będziesz musiał wysłać
GET
zapytanie do,IP
a także doDomain
(inne odpowiedzi nie wspominały, że możesz określićport
zmienną), możesz skorzystać z tej funkcji: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); }); }
Nie przegap wymagań dotyczących modułów u góry pliku:
http = require("http"); url = require('url')
Pamiętaj również, że możesz użyć
https
modułu do komunikacji w zabezpieczonej sieci.źródło