Estoy buscando usar información de una solicitud HTTP usando Node.js (es decir, llamar a un servicio web remoto y hacer eco de la respuesta al cliente).
En PHP, hubiera usado cURL para hacer esto. ¿Cuál es la mejor práctica en Node?
Estoy buscando usar información de una solicitud HTTP usando Node.js (es decir, llamar a un servicio web remoto y hacer eco de la respuesta al cliente).
En PHP, hubiera usado cURL para hacer esto. ¿Cuál es la mejor práctica en Node?
Respuestas:
Consulte la documentación del módulo HTTP para ver un ejemplo completo:
https://nodejs.org/api/http.html#http_http_request_options_callback
request.js
github.com/mikeal/request
El http
módulo que utiliza para ejecutar servidores también se utiliza para realizar solicitudes remotas.
Aquí está el ejemplo en sus documentos:
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 - y vota la respuesta de Nitish a continuación, que es la mejor respuesta en 2018.
puede usar fácilmente el módulo de solicitud:
https://www.npmjs.com/package/request
Código de muestra:
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)
}
})
Como parece que node-curl
está muerto, lo bifurqué, renombré y modifiqué para que sea más curl y se compile en Windows.
Ejemplo de uso:
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();
Realizar es asíncrono, y actualmente no hay forma de usarlo sincrónico (y probablemente nunca lo hará).
Todavía está en alfa, pero esto va a cambiar pronto, y se agradece la ayuda.
Ahora es posible usar el Easy
controlador directamente para las solicitudes de sincronización, por ejemplo:
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 ) );
Además, el proyecto es estable ahora!
node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuild
paso. ¿Alguna idea?
$ apt-get install libcurl4-openssl-dev
-L
opción de alguna manera?
curl.setOpt( 'FOLLOWLOCATION', true );
. Por cierto, preguntas como esa se adaptan mejor al rastreador de problemas que esta sección de comentarios. ;)
Para proyectos nuevos, por favor, abstenerse de usar la solicitud, ya que ahora el proyecto está en modo de gestión y eventualmente será desaprobado.
https://github.com/request/request/issues/3142
En cambio, recomendaría Axios , la biblioteca está en línea con los últimos estándares de Node, y hay algunos complementos disponibles para mejorarla, lo que permite respuestas de servidor simuladas, reintentos automáticos y otras características.
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
});
O usando async / await:
try{
const response = await axios.get('/user?ID=12345');
console.log(response)
} catch(axiosErr){
console.log(axiosErr)
}
Usualmente uso SOLICITUD, es un cliente HTTP simplificado pero potente para Node.js
https://github.com/request/request
Está en NPM
npm install request
Aquí hay una muestra de uso:
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.
}
})
Los ejemplos anteriores funcionan, pero no van tan lejos como para tratar realmente con un ejemplo del mundo real (es decir, cuando procesas datos que vienen en múltiples fragmentos. Una cosa que debes asegurarte es que tienes un controlador 'en bloque' que inserta los datos en una matriz (la forma más rápida de hacer esto en JS) y un controlador 'en el extremo' que los une a todos para que pueda devolverlos.
Esto es especialmente necesario cuando trabajas con solicitudes grandes (más de 5000 líneas) y el servidor te envía muchos datos.
Aquí hay un ejemplo en uno de mis programas (coffeescript): https://gist.github.com/1105888
¿Qué tal por ejemplo https://github.com/joyent/node/wiki/modules#wiki-tcp . Un resumen muy rápido =>
Hay módulo de NPM para hacer un rizo como petición npm curlrequest
.
Paso 1: $npm i -S curlrequest
Paso 2: en su archivo de nodo
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
})
Para mayor lectura y comprensión, npm curlrequest
Utilice el módulo de solicitud npm y después de la llamada
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.
});
Para una mejor práctica también utilizar algunos Winston módulo registrador o simples console.log persona y luego ejecutar su aplicación como
npm start output.txt
El resultado del comando anterior generará un archivo txt en la raíz con todos los datos que haya impreso en console.log
Terminé usando la biblioteca grunt-shell .
Aquí está mi esencia para mi tarea Grunt totalmente implementada para cualquier persona que esté pensando en trabajar con la API EdgeCast. Encontrarás en mi ejemplo que uso un grunt-shell para ejecutar el comando curl que purga el CDN.
Esto fue con lo que terminé después de pasar horas tratando de obtener una solicitud HTTP para trabajar dentro de Node. Pude conseguir uno trabajando en Ruby y Python, pero no cumplí con los requisitos de este proyecto.
Utiliza reqclient , además de un pequeño módulo de cliente request
que le permite registrar toda la actividad con estilo cURL (opcional, para entornos de desarrollo). También tiene buenas características como URL y análisis de parámetros, integraciones de autenticación, soporte de caché, etc.
Por ejemplo, si crea un objeto de cliente y haga una solicitud:
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"}})
Registrará dentro de la consola algo como esto:
[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}
La solicitud devolverá un objeto Promise , por lo que debe manejar then
y catch
qué hacer con el resultado.
reqclient
está disponible con NPM , puede instalar el módulo con: npm install reqclient
.
Tuve un problema al enviar datos POST a la base de datos en la nube desde IOT RaspberryPi, pero después de horas logré aclararlo.
Usé el símbolo del sistema para hacerlo.
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"}'
El símbolo del sistema mostrará los problemas: nombre de usuario / contraseña incorrectos; mala solicitud, etc.
--Ubicación de la base de datos / servidor URL (utilicé la base de datos Cloudant DB simple y gratuita) --usuario es el nombre de usuario de la parte de autenticación: pase que ingresé a través de API pass -X define qué comando llamar (PUT, GET, POST, DELETE) -H tipo de contenido - Cloudant trata sobre la base de datos de documentos, donde se usa JSON - contenido de datos en sí mismo ordenado como JSON
Solicitar módulo npm El nodo de solicitud moulde es bueno para usar, tiene opciones de configuración para obtener / publicar solicitud, además de que es ampliamente utilizado en entornos de producción también.
Es posible que desee intentar usar algo como esto
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'));
});
Puede usar el módulo request npm. Súper simple de usar. La solicitud está diseñada para ser la forma más simple posible de hacer llamadas http. Es compatible con HTTPS y sigue las redirecciones por defecto.
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
...