cURL equivalente en Node.js?

152

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?

astuto
fuente
13
http.request...
Raynos
¡El problema con todas estas soluciones es que requieren control de cors!
Marco

Respuestas:

103

Consulte la documentación del módulo HTTP para ver un ejemplo completo:

https://nodejs.org/api/http.html#http_http_request_options_callback

Dan Grossman
fuente
10
También vale la pena señalar que hay una biblioteca de envoltorios muy popular request.js github.com/mikeal/request
Farzher
2
http request y async, curl is sync.
e-info128
2
@WHK tal es la naturaleza de node.js
slifty
El gran problema que veo con esto es que no puede simplemente ingresar la URL y obtener respuesta. Necesita separar la URL en unidades para solicitarla. Pero, maldición, probablemente haya una manera, sería más conveniente usar un comando curl like para esto.
Jānis Gruzis
15
Este sitio puede convertir su cURLcomando a la solicitud node.js
Maxim Mai
74

El httpmó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();
Jeremy Banks
fuente
14
Este es un nivel muy bajo en comparación con el comportamiento similar al rizo que solicitó el OP.
Dan Dascalescu
1
Para todos: hoy en día, usa request- npmjs.com/package/request - y vota la respuesta de Nitish a continuación, que es la mejor respuesta en 2018.
Dan Nissenbaum
Bienvenido a la realidad: la solicitud ha quedado en desuso, consulte github.com/request/request/issues/3142 Me parece que la operación de "bajo nivel" tiene más potencial que esto, porque no es bajo en absoluto, es BÁSICO
vintproykt
35

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)
  }
})
Nitish Agarwal
fuente
27

Como parece que node-curlestá muerto, lo bifurqué, renombré y modifiqué para que sea más curl y se compile en Windows.

node-libcurl

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 Easycontrolador 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!

JCM
fuente
Intenté instalar tanto node-curl como node-libcurl, pero ambos me dan el mismo mensaje: "No se puede encontrar el archivo de encabezado de curl". Esto es durante el node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuildpaso. ¿Alguna idea?
SaganRitual
@GreatBigBore necesita el paquete libcurl devel instalado en su máquina. Si está utilizando Debian, por ejemplo, puede instalarlo con$ apt-get install libcurl4-openssl-dev
JCM
1
¿Puedes usar la -Lopción de alguna manera?
corvid
2
Sí: CURLOPT_FOLLOWLOCATION , con node-libcurl que vas a usar curl.setOpt( 'FOLLOWLOCATION', true );. Por cierto, preguntas como esa se adaptan mejor al rastreador de problemas que esta sección de comentarios. ;)
JCM
23

EDITAR:

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.
   }
})
Aronis Mariano
fuente
9

bueno, si realmente necesitas un rizo equivalente puedes probar node-curl

npm install node-curl

probablemente necesitará agregar libcurl4-gnutls-dev.

guerras
fuente
8

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

Brad Dickason
fuente
4

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

Laksh Goel
fuente
3

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

DM Patel
fuente
1

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.

fresaMarshmallow
fuente
1

Utiliza reqclient , además de un pequeño módulo de cliente requestque 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 theny catchqué hacer con el resultado.

reqclientestá disponible con NPM , puede instalar el módulo con: npm install reqclient.

Mariano Ruiz
fuente
1

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

Rudolfs
fuente
1

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.

Indrani Sen
fuente
0

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'));
});
Gautam Anand
fuente
0

Puede intentar usar la aplicación POSTMAN Chrome para su solicitud y puede generar el código de nodo js desde allí

Ravi Teja
fuente
0

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.
});
Rubin Bhandari
fuente