2011-07-25 37 views
94

Estoy buscando utilizar información de una solicitud HTTP utilizando nodejs (es decir, llamar a un servicio web remoto y repetir la respuesta del cliente).Curl equivalent en nodejs?

En PHP, habría utilizado curl para hacer esto. ¿Cuál es la mejor práctica en el nodo?

+9

'http.request' ... – Raynos

Respuesta

69

Véase la documentación del módulo HTTP para un ejemplo completo:

http://nodejs.org/docs/v0.5.2/api/http.html#http.request

+9

también cabe destacar la http. obtener el método de conveniencia. – slifty

+8

También vale la pena señalar que hay una biblioteca de contenedor muy popular 'request.js' https://github.com/mikeal/request –

+1

http request y async, curl es sincronización. –

55

El módulo http que se utiliza para ejecutar servidores también se utiliza para hacer las peticiones 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(); 
+12

Este es un nivel muy bajo en comparación con el comportamiento tipo rizo que solicitó OP. –

+0

Para todos: Hoy en día, use 'request' - https://www.npmjs.com/package/request - y vote la respuesta de Nitish a continuación, que es la mejor respuesta en 2018. –

7

Los ejemplos anteriores funcionan, pero no van tan lejos como para tratar realmente con un ejemplo del mundo real (es decir, al procesar los datos procedentes en múltiples partes. Una cosa de la que debes asegurarte es que tienes un manejador 'en bloque' que inserta los datos en una matriz (la manera más rápida de hacer esto en JS) y un manejador 'en extremo' que los une a todos para que pueda devolverlo.

Esto es especialmente necesario cuando trabaja con solicitudes grandes (más de 5000 líneas) y el servidor le envía una gran cantidad de datos.

He aquí un ejemplo de uno de mis programas (CoffeeScript): https://gist.github.com/1105888

6

bien si realmente necesita un equivalente de rizo puede probar node-curl

npm install node-curl 

es probable que necesite añadir libcurl4-gnutls-dev.

17

Como parece que node-curl está muerto, lo he bifurcado, renombrado y modificado para que sea más curl y compilar 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(); 

realizan es asíncrono, y no hay manera de usarlo sincrónica actualmente (y probablemente nunca tendrá).

Todavía está en alfa, pero esto va a cambiar pronto, y se agradece la ayuda.

Ahora es posible utilizar Easy mango directamente para solicitudes de sincronización, 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!

+0

Intenté instalar node-curl y node -libcurl, pero ambos me dan el mismo mensaje: "No se puede encontrar el archivo de encabezado curl". Esto es durante el paso 'node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp Rebuild'. ¿Alguna idea? – GreatBigBore

+0

@GreatBigBore necesita el paquete de desarrollo libcurl instalado en su máquina. Si está utilizando Debian por ejemplo, puede instalarlo con '' $ apt-get install libcurl4-openssl-dev'' – JCM

+1

¿puede usar la opción '-L' de alguna manera? – corvid

1

Terminé usando la biblioteca grunt-shell.

Here es mi fuente de información para mi tarea Grunt totalmente implementada para cualquier persona que esté pensando en trabajar con la API de EdgeCast. Encontrarás en mi ejemplo que utilizo un grunt-shell para ejecutar el comando curl que purga el CDN.

Esto fue lo que terminé después de pasar horas tratando de obtener una solicitud HTTP para trabajar dentro de Nodo. Pude obtener uno trabajando en Ruby y Python, pero no cumplí con los requisitos de este proyecto.

8

por lo general de solicitud de uso, es un cliente simplificada pero potente HTTP para Node.js

https://github.com/request/request

Está en la NGP npm install request

Este es un ejemplo 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. 
    } 
}) 
14

puede usar fácilmente el módulo de solicitud:

https://www.npmjs.com/package/request

Código de ejemplo:

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) 
    } 
}) 
+0

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ crítica/mensajes de baja calidad/10812843) –

+1

Es por eso que he escrito un código de muestra –

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

Usted puede intentar usar CARTERO Chrome para su solicitud y se puede generar js nodo código de allí

1

Utiliza reqclient, es un pequeño módulo de cliente en la parte superior de request que le permite registrar toda la actividad con estilo cURL (opcional, para entornos de desarrollo). También tiene características agradables como URL y parámetros de análisis sintáctico, integraciones de autenticación, el soporte de cache, etc.

Por ejemplo, si se crea un objeto de cliente hace 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"}}) 

se registrará dentro de la consola algo de esta manera:

[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, así que hay que manejar con then y catch qué hacer con el resultado.

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

3

Hay un módulo npm para hacer una solicitud tipo curl, npm curlrequest.

Paso 1: $npm i -S curlrequest

Paso 2: En el 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 más lectura y comprensión, npm curlrequest

0

tuve un problema al enviar datos POST a la nube DB de IOT Raspberry Pi , pero después de horas logré entenderlo.

Utilicé 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; solicitud incorrecta etc.

--url ubicación de base de datos/servidor (que usa libre simple Cloudant DB) --user nombre de usuario es la parte de autenticación: paso entré a través de la API pasan -X define qué comando para llamar (PUT, GET, POST, DELETE) -H tipo de contenido - Cloudant se trata de la base de datos de documentos, donde se utiliza JSON contenido --Hojas sí ordenan como JSON