cURL equivalente em Node.js?

152

Eu estou olhando para usar informações de uma solicitação HTTP usando Node.js (ou seja, chamar um serviço da Web remoto e ecoar a resposta ao cliente).

No PHP, eu teria usado o cURL para fazer isso. Qual é a melhor prática no Node?

desleixado
fonte
13
http.request...
Raynos
O problema com todas essas soluções é que elas exigem controle de cors!
28919 Marco

Respostas:

103

Consulte a documentação do módulo HTTP para obter um exemplo completo:

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

Dan Grossman
fonte
10
Aslo importante ressaltar que há um muito popular biblioteca wrapper request.js github.com/mikeal/request
Farzher
2
solicitação http e assíncrona, ondulação é sincronização.
e-info128
2
@WHK tal é a natureza da node.js
slifty
O grande problema que vejo com isso é que você não pode simplesmente inserir a URL e obter resposta. Você precisa separar o URL em unidades para solicitá-lo. Mas, por maldição, provavelmente existe uma maneira, seria mais conveniente usar um comando curl like para isso.
Jānis Gruzis
15
Este site pode converter seu cURLcomando em node.js request: curl.trillworks.com/#node
Maxim Mai
74

O httpmódulo que você usa para executar servidores também é usado para fazer solicitações remotas.

Aqui está o exemplo em seus 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
fonte
14
Esse nível é muito baixo comparado ao comportamento de ondulação solicitado pelo OP.
Dan Dascalescu 27/02
1
Para Todos: Hoje em dia, o uso request- npmjs.com/package/request - e upvote resposta de Nitish, abaixo, qual é a melhor resposta em 2018.
Dan Nissenbaum
Bem-vindo à realidade: a solicitação foi descontinuada, consulte github.com/request/request/issues/3142 Parece-me que a operação "de baixo nível" tem mais potencial do que isso, porque não é nada baixa, é BASIC
vintproykt
35

você pode facilmente usar o módulo de solicitação:

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

Código de amostra:

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
fonte
27

Como parece que node-curlestá morto, eu o bifurquei, renomeei e modifiquei para ser mais curvilíneo e compilar no Windows.

node-libcurl

Exemplo 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();

Perform é assíncrono e não há como usá-lo síncrono atualmente (e provavelmente nunca o terá).

Ainda está em alfa, mas isso vai mudar em breve, e a ajuda é apreciada.

Agora é possível usar o Easyhandle diretamente para solicitações de sincronização, por exemplo:

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 ) );

Além disso, o projeto está estável agora!

JCM
fonte
Tentei instalar o node-curl e o node-libcurl, mas ambos me deram a mesma mensagem: "Não é possível encontrar o arquivo de cabeçalho do curl". Isso é durante a node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuildetapa. Alguma ideia?
SaganRitual 5/05
@GreatBigBore, você precisa do pacote libcurl devel instalado em sua máquina. Se você estiver usando o debian, por exemplo, poderá instalá-lo com$ apt-get install libcurl4-openssl-dev
JCM
1
você pode usar a -Lopção de alguma forma?
Corvid #
2
Sim: CURLOPT_FOLLOWLOCATION , com o node-libcurl você usará curl.setOpt( 'FOLLOWLOCATION', true );. Aliás, perguntas como essa são mais adequadas ao rastreador de problemas do que esta seção de comentários. ;)
JCM 10/10
23

EDITAR:

Para novos projetos, evite usar a solicitação, pois agora o projeto está no modo de manutenção e, eventualmente, será preterido

https://github.com/request/request/issues/3142

Em vez disso, eu recomendaria o Axios , a biblioteca está alinhada com os padrões mais recentes do Node e existem alguns plug-ins disponíveis para aprimorá-lo, permitindo respostas falsas ao servidor, novas tentativas automáticas e outros recursos.

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

Ou usando async / waitit:

try{
    const response = await axios.get('/user?ID=12345');
    console.log(response)
} catch(axiosErr){
    console.log(axiosErr)
}

Eu costumo usar REQUEST, é um cliente HTTP simplificado, porém poderoso, para o Node.js

https://github.com/request/request

É no NPM npm install request

Aqui está uma amostra 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
fonte
9

bem, se você realmente precisa de um equivalente de onda, você pode tentar node-curl

npm install node-curl

você provavelmente precisará adicionar libcurl4-gnutls-dev.

warfares
fonte
8

Os exemplos acima funcionam, mas não chegam ao ponto de realmente lidar com um exemplo do mundo real (ou seja, quando você processa dados que vêm em vários pedaços. É preciso ter certeza de que você tem um manipulador 'on chunk' que envie os dados para uma matriz (a maneira mais rápida de fazer isso em JS) e um manipulador 'on end' que os une para que você possa devolvê-los.

Isso é especialmente necessário quando você está trabalhando com grandes solicitações (mais de 5000 linhas) e o servidor envia muitos dados para você.

Aqui está um exemplo em um dos meus programas (coffeescript): https://gist.github.com/1105888

Brad Dickason
fonte
4

Existe um módulo npm para fazer uma solicitação de ondulação npm curlrequest,.

Passo 1: $npm i -S curlrequest

Etapa 2: no seu arquivo de nó

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 leitura e compreensão adicionais, npm curlrequest

Laksh Goel
fonte
3

Use o módulo request npm e após a chamada

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 práticas recomendadas, use também o módulo winston logger ou o console.log simples e, em seguida, execute seu aplicativo como

npm start output.txt 

O resultado do comando acima gerará um arquivo txt na raiz com todos os dados que você imprimiu no console.log

DM Patel
fonte
1

Acabei usando a biblioteca grunt-shell .

Aqui está minha essência da fonte da minha tarefa Grunt totalmente implementada para qualquer pessoa que esteja pensando em trabalhar com a API EdgeCast. Você encontrará no meu exemplo que eu uso um grunt-shell para executar o comando curl que limpa a CDN.

Foi com isso que acabei depois de passar horas tentando obter uma solicitação HTTP para trabalhar no Node. Consegui conseguir um trabalhando em Ruby e Python, mas não atendi aos requisitos deste projeto.

morangoMarshmallow
fonte
1

Utiliza reqclient , é um pequeno módulo de cliente requestque permite registrar toda a atividade com o estilo cURL (opcional, para ambientes de desenvolvimento). Também possui recursos interessantes, como análise de URL e parâmetros, integrações de autenticação, suporte a cache, etc.

Por exemplo, se você criar um objeto de cliente e fazer uma solicitação:

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"}})

Ele registrará no console algo como isto:

[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}

A solicitação retornará um objeto Promise , para que você tenha que lidar com thene catcho que fazer com o resultado.

reqclientestá disponível com NPM , você pode instalar o módulo com: npm install reqclient.

Mariano Ruiz
fonte
1

Eu tive um problema ao enviar dados POST para o banco de dados em nuvem do IOT RaspberryPi, mas depois de horas eu consegui entender direito.

Eu usei o prompt de comando para fazer isso.

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"}'

O prompt de comando mostrará os problemas - nome de usuário / senha incorretos; pedido ruim etc.

--URL banco de dados / localização do servidor (usei o Cloudant DB simples e gratuito) --user é o nome de usuário da parte de autenticação: passe que eu inseri através da API pass -X define o comando a ser chamado (PUT, GET, POST, DELETE) -H tipo de conteúdo - Cloudant é sobre banco de dados de documentos, onde o JSON é usado - conteúdo de dados em si, classificado como JSON

Rudolfs
fonte
1

Request npm module O nó de requisição moulde é bom de usar, possui configurações de opções para solicitação de obtenção / publicação, além de ser amplamente utilizado no ambiente de produção.

Indrani Sen
fonte
0

Você pode tentar usar algo parecido com isto

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
fonte
0

Você pode tentar usar o aplicativo POSTMAN Chrome para sua solicitação e gerar o código js do nó a partir daí

Ravi Teja
fonte
0

Você pode usar o módulo request npm. Super simples de usar. A solicitação foi projetada para ser a maneira mais simples possível de fazer chamadas http. Ele suporta HTTPS e segue os redirecionamentos por padrão.

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
fonte