Chcę użyć informacji z żądania HTTP przy użyciu Node.js (tj. Wywołać zdalną usługę internetową i powtórzyć odpowiedź do klienta).
W PHP użyłbym do tego cURL. Jaka jest najlepsza praktyka w Node?
Chcę użyć informacji z żądania HTTP przy użyciu Node.js (tj. Wywołać zdalną usługę internetową i powtórzyć odpowiedź do klienta).
W PHP użyłbym do tego cURL. Jaka jest najlepsza praktyka w Node?
Odpowiedzi:
Pełny przykład można znaleźć w dokumentacji modułu HTTP:
https://nodejs.org/api/http.html#http_http_request_options_callback
Plik http
Moduł użyć do uruchomienia serwerów jest także wykorzystywane do nawiązywania zdalnych żądań.
Oto przykład w ich dokumentach:
var http = require("http");
var options = {
host: 'www.google.com',
port: 80,
path: '/upload',
method: 'POST'
};
var req = http.request(options, function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
// write data to request body
req.write('data\n');
req.write('data\n');
req.end();
request
- npmjs.com/package/request - i zagłosuj poniżej odpowiedzi Nitisha, która jest lepszą odpowiedzią w 2018 roku.
w prosty sposób możesz skorzystać z modułu zapytań:
https://www.npmjs.com/package/request
Przykładowy kod:
var request = require('request');
request('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Show the HTML for the Google homepage.
}
else {
console.log("Error "+response.statusCode)
}
})
Ponieważ wygląda na node-curl
to, że jest martwy, rozwidliłem go, zmieniłem nazwę i zmodyfikowałem, aby był bardziej podobny do curl i kompilował pod Windows.
Przykład użycia:
var Curl = require( 'node-libcurl' ).Curl;
var curl = new Curl();
curl.setOpt( Curl.option.URL, 'www.google.com' );
curl.setOpt( 'FOLLOWLOCATION', true );
curl.on( 'end', function( statusCode, body, headers ) {
console.info( statusCode );
console.info( '---' );
console.info( body.length );
console.info( '---' );
console.info( headers );
console.info( '---' );
console.info( this.getInfo( Curl.info.TOTAL_TIME ) );
this.close();
});
curl.on( 'error', function( err, curlErrorCode ) {
console.error( err.message );
console.error( '---' );
console.error( curlErrorCode );
this.close();
});
curl.perform();
Perform jest asynchroniczny i obecnie nie ma możliwości używania go synchronicznie (i prawdopodobnie nigdy nie będzie).
Nadal jest w wersji alfa, ale wkrótce się to zmieni, a pomoc jest mile widziana.
Teraz można używać Easy
obsługi bezpośrednio do żądań synchronizacji, na przykład:
var Easy = require( 'node-libcurl' ).Easy,
Curl = require( 'node-libcurl' ).Curl,
url = process.argv[2] || 'http://www.google.com',
ret, ch;
ch = new Easy();
ch.setOpt( Curl.option.URL, url );
ch.setOpt( Curl.option.HEADERFUNCTION, function( buf, size, nmemb ) {
console.log( buf );
return size * nmemb;
});
ch.setOpt( Curl.option.WRITEFUNCTION, function( buf, size, nmemb ) {
console.log( arguments );
return size * nmemb;
});
// this call is sync!
ret = ch.perform();
ch.close();
console.log( ret, ret == Curl.code.CURLE_OK, Easy.strError( ret ) );
Ponadto projekt jest teraz stabilny!
node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuild
kroku. jakieś pomysły?
$ apt-get install libcurl4-openssl-dev
-L
jakoś skorzystać z tej opcji?
curl.setOpt( 'FOLLOWLOCATION', true );
. Przy okazji, takie pytania lepiej pasują do śledzenia problemów niż ta sekcja komentarzy. ;)
W przypadku nowych projektów powstrzymaj się od używania żądania, ponieważ teraz projekt jest w trybie zarządzania i ostatecznie zostanie wycofany
https://github.com/request/request/issues/3142
Zamiast tego poleciłbym Axios , biblioteka jest zgodna z najnowszymi standardami Node i jest kilka dostępnych wtyczek, które ją ulepszają, umożliwiając pozorowane odpowiedzi serwera, automatyczne ponawianie i inne funkcje.
https://github.com/axios/axios
const axios = require('axios');
// Make a request for a user with a given ID
axios.get('/user?ID=12345')
.then(function (response) {
// handle success
console.log(response);
})
.catch(function (error) {
// handle error
console.log(error);
})
.then(function () {
// always executed
});
Lub używając async / await:
try{
const response = await axios.get('/user?ID=12345');
console.log(response)
} catch(axiosErr){
console.log(axiosErr)
}
Zwykle używam REQUEST, jest to uproszczony, ale potężny klient HTTP dla Node.js.
https://github.com/request/request
Jest na NPM
npm install request
Oto próbka użycia:
var request = require('request');
request('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Show the HTML for the Google homepage.
}
})
Powyższe przykłady działają, ale nie posuwają się tak daleko, aby naprawdę zajmować się przykładem ze świata rzeczywistego (tj. Gdy przetwarzasz dane w wielu fragmentach. Jedną rzeczą, którą musisz upewnić się, jest to, że masz moduł obsługi „on chunk”), który wypycha dane do tablicy (najszybszy sposób na zrobienie tego w JS) i modułu obsługi „na końcu”, który łączy je wszystkie razem, aby można było je zwrócić.
Jest to szczególnie konieczne, gdy pracujesz z dużymi żądaniami (ponad 5000 linii), a serwer wysyła do ciebie mnóstwo danych.
Oto przykład w jednym z moich programów (coffeescript): https://gist.github.com/1105888
A może na przykład https://github.com/joyent/node/wiki/modules#wiki-tcp . Bardzo krótkie podsumowanie =>
Istnieje moduł npm do tworzenia curl like request, npm curlrequest
.
Krok 1: $npm i -S curlrequest
Krok 2: w pliku węzłów
let curl = require('curlrequest')
let options = {} // url, method, data, timeout,data, etc can be passed as options
curl.request(options,(err,response)=>{
// err is the error returned from the api
// response contains the data returned from the api
})
W celu dalszego czytania i zrozumienia, npm curlrequest
Użyj modułu request npm i po wywołaniu
var request = require('request');
request('http://www.google.com', function (error, response, body) {
console.log('error:', error); // Print the error if one occurred
console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
console.log('body:', body); // Print the HTML for the Google homepage.
});
Aby uzyskać najlepszą praktykę, użyj również modułu rejestratora winston lub prostego pliku console.log, a następnie uruchom aplikację, taką jak
npm start output.txt
Wynik powyższego polecenia wygeneruje jeden plik txt w katalogu głównym ze wszystkimi danymi, które wypisałeś w console.log
Skończyło się na tym, że korzystałem z biblioteki grunt-shell .
Tutaj moje źródło mojego w pełni zaimplementowanego zadania Grunt dla każdego, kto myśli o pracy z EdgeCast API. W moim przykładzie zobaczysz, że używam powłoki gruntowej do wykonania polecenia curl, które czyści CDN.
Skończyło się na tym, że spędziłem wiele godzin próbując uzyskać żądanie HTTP do pracy w Node. Udało mi się uzyskać taki działający w Rubim i Pythonie, ale nie spełniał wymagań tego projektu.
Używa reqclient , jest to mały moduł klienta, request
który umożliwia rejestrowanie całej aktywności w stylu cURL (opcjonalnie, dla środowisk programistycznych). Posiada również fajne funkcje, takie jak parsowanie adresów URL i parametrów, integracje uwierzytelniania, obsługa pamięci podręcznej itp.
Na przykład, jeśli utworzysz obiekt klienta, wykonaj żądanie:
var RequestClient = require("reqclient").RequestClient;
var client = new RequestClient({
baseUrl:"http://baseurl.com/api/v1.1",
debugRequest:true, debugResponse:true
});
var resp = client.post("client/orders", {"client":1234,"ref_id":"A987"}, {headers: {"x-token":"AFF01XX"}})
W konsoli zaloguje się coś takiego:
[Requesting client/orders]-> -X POST http://baseurl.com/api/v1.1/client/orders -d '{"client": 1234, "ref_id": "A987"}' -H '{"x-token": "AFF01XX"}' -H Content-Type:application/json
[Response client/orders]<- Status 200 - {"orderId": 1320934}
Żądanie zwróci obiekt Promise , więc musisz sobie poradzić z wynikiem then
i catch
co z nim zrobić.
reqclient
dostępny jest z KMP , można zainstalować moduł z: npm install reqclient
.
Miałem problem z wysyłaniem danych POST do chmury DB z IOT RaspberryPi, ale po godzinach udało mi się to prosto.
Użyłem do tego wiersza poleceń.
sudo curl --URL http://<username>.cloudant.com/<database_name> --user <api_key>:<pass_key> -X POST -H "Content-Type:application/json" --data '{"id":"123","type":"987"}'
Wiersz polecenia pokaże problemy - zła nazwa użytkownika / hasło; zła prośba itp.
- Lokalizacja bazy danych / serwera URL (użyłem prostej, bezpłatnej bazy danych Cloudant) --user to nazwa użytkownika części uwierzytelniającej: hasło wprowadzone przez interfejs API -X określa, jakie polecenie wywołać (PUT, GET, POST, DELETE) -H typ zawartości - Cloudant dotyczy bazy danych dokumentów, w której używany jest JSON - sama zawartość danych posortowana jako JSON
Moduł żądania npm Moduł żądania węzła jest dobry w użyciu, ma ustawienia opcji dla żądania pobierania / wysyłania, a także jest szeroko stosowany w środowisku produkcyjnym.
Możesz spróbować użyć czegoś takiego
curl = require('node-curl');
curl('www.google.com', function(err) {
console.info(this.status);
console.info('-----');
console.info(this.body);
console.info('-----');
console.info(this.info('SIZE_DOWNLOAD'));
});
Możesz użyć modułu request npm. Bardzo prosty w użyciu. Żądanie ma być najprostszym możliwym sposobem wykonywania połączeń HTTP. Obsługuje protokół HTTPS i domyślnie śledzi przekierowania.
var request = require('request');
request('http://www.google.com', function (error, response, body) {
console.log('error:', error); // Print the error if one occurred
console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
console.log('body:', body); // Print the HTML for the Google homepage.
});
http.request
...