Я хочу використати інформацію з HTTP-запиту за допомогою Node.js (тобто зателефонуйте на віддалений веб-сервіс та надішліть відповідь клієнтові).
У PHP я б використав CURL для цього. Яка найкраща практика в Node?
Я хочу використати інформацію з HTTP-запиту за допомогою Node.js (тобто зателефонуйте на віддалений веб-сервіс та надішліть відповідь клієнтові).
У PHP я б використав CURL для цього. Яка найкраща практика в Node?
Відповіді:
Повний приклад див. У документації до модуля HTTP:
https://nodejs.org/api/http.html#http_http_request_options_callback
request.js
github.com/mikeal/request
cURL
команду на node.js запит: curl.trillworks.com/#node
http
Модуль , який використовується для запуску серверів також використовуються для віддалених запитів.
Ось приклад у їхніх документах:
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 - і підтверджуйте відповідь Нітіша внизу, яка найкраща відповідь у 2018 році.
Ви можете легко використовувати модуль запиту:
https://www.npmjs.com/package/request
Приклад коду:
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)
}
})
Оскільки зовні схоже node-curl
на мертве, я відправив його, перейменував і змінив, щоб він був більше закрученим і компілювався під Windows.
Приклад використання:
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();
Виконання - це асинхронізація, і зараз немає можливості використовувати його синхронно (і, мабуть, ніколи не буде).
Це все ще в альфа, але це незабаром зміниться, і допомога цінується.
Тепер можна використовувати Easy
ручку безпосередньо для запитів синхронізації, наприклад:
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 ) );
Також проект стабільний зараз!
node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuild
кроку. Будь-які думки?
$ apt-get install libcurl4-openssl-dev
-L
якось використовувати варіант?
curl.setOpt( 'FOLLOWLOCATION', true );
. До речі, подібні запитання краще підходять для відстеження питань, ніж цей розділ коментарів. ;)
Для нових проектів будь ласка, утримайтеся від використання запиту, оскільки зараз проект перебуває в режимі невідкладної допомоги, а згодом буде застарілим
https://github.com/request/request/isissue/3142
Натомість я б рекомендував Axios , бібліотека відповідає останнім стандартам Node, і є кілька доступних плагінів для її покращення, що дозволяє знущатися з відповідей сервера, автоматичних спроб та інших функцій.
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
});
Або використовуючи функцію async / wait:
try{
const response = await axios.get('/user?ID=12345');
console.log(response)
} catch(axiosErr){
console.log(axiosErr)
}
Зазвичай я використовую ЗАПИТАННЯ, його спрощений, але потужний клієнт HTTP для Node.js
https://github.com/request/request
Його на NPM
npm install request
Ось приклад використання:
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.
}
})
Наведені вище приклади працюють, але не йдуть настільки далеко, щоб реально мати справу з прикладом реального світу (тобто, коли ви обробляєте дані, що надходять у декілька фрагментів. Одне, що вам потрібно переконатися, - це те, що у вас є обробник "на шматок", який натисніть дані в масив (найшвидший спосіб зробити це в JS) і обробник "на кінець", який з'єднує їх усі разом, щоб ви могли повернути їх.
Це особливо необхідно, коли ви працюєте з великими запитами (5000+ рядків) і сервер надсилає вам купу даних.
Ось приклад в одній із моїх програм (coffeescript): https://gist.github.com/1105888
Як щодо прикладу https://github.com/joyent/node/wiki/modules#wiki-tcp . Дуже швидкий підсумок =>
Існує НОЕ модуль , щоб зробити завиток як прохання npm curlrequest
.
Крок 1: $npm i -S curlrequest
Крок 2: У файлі вашого вузла
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
})
Для подальшого читання та розуміння, npm curlrequest
Використовувати запит npm-модуля та після дзвінка
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.
});
Для найкращої практики також використовуйте якийсь модуль реєстратора winston або інший простий console.log, а потім запустіть додаток, як
npm start output.txt
Результат вищевказаної команди генерує один файл txt у root із усіма даними, які ви надрукували у console.log
Я в кінцевому рахунку використовував бібліотеку grunt-shell .
Ось мій суть джерела моєї повністю реалізованої задачі Grunt для всіх, хто думає про роботу з API EdgeCast. Ви побачите в моєму прикладі, що я використовую grunt-shell для виконання команди curl, яка очищує CDN.
Це я закінчив, витративши години, намагаючись отримати HTTP-запит на роботу в Node. Мені вдалося отримати одного, хто працює в Ruby та Python, але не відповідав вимогам цього проекту.
Використовує reqclient , це невеликий клієнтський модуль, request
який дозволяє вам реєструвати всю активність у стилі CURL (необов’язково для середовищ розробки). Також є приємні функції, такі як розбір URL-адрес і параметрів, інтеграція автентифікації, підтримка кешу тощо.
Наприклад, якщо ви створюєте клієнтський об'єкт, зробіть запит:
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"}})
Він увійде в консоль приблизно так:
[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}
Запит поверне об’єкт Promise , тому вам доведеться впоратися then
і catch
що робити з результатом.
reqclient
доступний з НПМ , ви можете встановити модуль з: npm install reqclient
.
У мене виникла проблема з надсиланням даних POST до хмарного БД з IOT RaspberryPi, але через години мені вдалося зрозуміти це.
Для цього я використав командний рядок.
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"}'
Командний рядок покаже проблеми - неправильне ім’я користувача / пропуск; поганий запит тощо.
- Місце розташування бази даних / сервера (я використовував просту безкоштовну DB-модуль Cloudant) - користувач - це ім'я частини автентифікації: pass Я ввів через пропуск API -X визначає, яку команду викликати (PUT, GET, POST, DELETE) -H тип вмісту - Cloudant - це база даних документів, де використовується JSON - вміст самих даних, відсортований як JSON
Запит модуля npm Запросити вузол moulde добре використовувати, він має параметри параметрів для запиту get / post, а також широко використовується і у виробничому середовищі.
Ви можете спробувати використати щось подібне
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'));
});
Ви можете використовувати модуль запиту npm. Супер простий у використанні. Запит розрахований на найпростіший спосіб здійснення http-дзвінків. Він підтримує HTTPS і слід переспрямувати за замовчуванням.
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
...