Como fazer chamadas REST remotas dentro do Node.js? qualquer onda?

189

No Node.js , além de usar o processo filho para fazer uma chamada CURL , existe uma maneira de fazer uma chamada CURL para a API REST do servidor remoto e obter os dados de retorno?

Também preciso configurar o cabeçalho da solicitação para a chamada REST remota e também a string de consulta no GET (ou POST).

Acho este: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

mas não mostra nenhuma maneira de POST string de consulta.

murvinlai
fonte
Eu escrevi este github.com/jonataswalker/vps-rest-client
Jonatas Walker

Respostas:

212

Olhe para http.request

var options = {
  host: url,
  port: 80,
  path: '/resource?id=foo&bar=baz',
  method: 'POST'
};

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);
  });
}).end();
Raynos
fonte
3
Então, mesmo que seja POST, também anexo dados na string de consulta?
Murvinlai
3
@murvinlai não tenho certeza. Vá ler os documentos, fonte, especificação HTTP. Não é um especialista nessa região.
Raynos
15
Uma coisa a observar é que você não coloca http ou https na entrada do host, por exemplo, var options = {host: graph.facebook.com ....} não {host: http: graph.facebook.com}. Isso me fez tropeçar por alguns ciclos. (Ver abaixo). Essas são duas ótimas respostas. Graças a vocês dois.
precisa saber é
9
Posso apenas salientar que, se a resposta for longa, usar res.on ('dados', ..) não será suficiente. Acredito que a maneira correta é também ter res.on ('end' ..) para saber quando você recebeu todos os dados. Então você pode processar.
Xerri 26/03/2013
4
Essa é uma resposta muito antiga - para quem escreve o nó js hoje, certamente você usaria o npmjs.com/package/node-fetch ou outro pacote baseado em API de busca, baseado no padrão de busca. Veja minha resposta abaixo.
saille
95

Que tal usar solicitação - cliente HTTP simplificado .

Editar fevereiro de 2020: a solicitação foi preterida, portanto você provavelmente não deve mais usá-la.

Aqui está um GET:

var request = require('request');
request('http://www.google.com', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body) // Print the google web page.
     }
})

A OP também queria um POST:

request.post('http://service.com/upload', {form:{key:'value'}})
Matt Frear
fonte
1
Funciona bem com o google.com, mas retorna "RequestError: Error: socket hang up" ao solicitar a API do gráfico do Facebook. Por favor, guia, obrigado!
Dynamic Remo
Este módulo contém muitos problemas!
Pratik Singhal
Como posso passar um parâmetro de solicitação ao consumir uma API REST dessa maneira?
Vdenotaris
2
A partir de 11 de fevereiro de 2020, a solicitação será totalmente RETIRADA. Você pode vê-lo no site github.com/request/request#deprecated
Sadiel
Alguma orientação sobre quais iniciantes devem usar? Estou filtrando vários exemplos que usam isso.
Steve3p0 16/04
36

Veja http://isolasoftware.it/2012/05/28/call-rest-api-with-node-js/

var https = require('https');

/**
 * HOW TO Make an HTTP Call - GET
 */
// options for GET
var optionsget = {
    host : 'graph.facebook.com', // here only the domain name
    // (no http/https !)
    port : 443,
    path : '/youscada', // the rest of the url with parameters if needed
    method : 'GET' // do GET
};

console.info('Options prepared:');
console.info(optionsget);
console.info('Do the GET call');

// do the GET request
var reqGet = https.request(optionsget, function(res) {
    console.log("statusCode: ", res.statusCode);
    // uncomment it for header details
//  console.log("headers: ", res.headers);


    res.on('data', function(d) {
        console.info('GET result:\n');
        process.stdout.write(d);
        console.info('\n\nCall completed');
    });

});

reqGet.end();
reqGet.on('error', function(e) {
    console.error(e);
});

/**
 * HOW TO Make an HTTP Call - POST
 */
// do a POST request
// create the JSON object
jsonObject = JSON.stringify({
    "message" : "The web of things is approaching, let do some tests to be ready!",
    "name" : "Test message posted with node.js",
    "caption" : "Some tests with node.js",
    "link" : "http://www.youscada.com",
    "description" : "this is a description",
    "picture" : "http://youscada.com/wp-content/uploads/2012/05/logo2.png",
    "actions" : [ {
        "name" : "youSCADA",
        "link" : "http://www.youscada.com"
    } ]
});

// prepare the header
var postheaders = {
    'Content-Type' : 'application/json',
    'Content-Length' : Buffer.byteLength(jsonObject, 'utf8')
};

// the post options
var optionspost = {
    host : 'graph.facebook.com',
    port : 443,
    path : '/youscada/feed?access_token=your_api_key',
    method : 'POST',
    headers : postheaders
};

console.info('Options prepared:');
console.info(optionspost);
console.info('Do the POST call');

// do the POST call
var reqPost = https.request(optionspost, function(res) {
    console.log("statusCode: ", res.statusCode);
    // uncomment it for header details
//  console.log("headers: ", res.headers);

    res.on('data', function(d) {
        console.info('POST result:\n');
        process.stdout.write(d);
        console.info('\n\nPOST completed');
    });
});

// write the json data
reqPost.write(jsonObject);
reqPost.end();
reqPost.on('error', function(e) {
    console.error(e);
});

/**
 * Get Message - GET
 */
// options for GET
var optionsgetmsg = {
    host : 'graph.facebook.com', // here only the domain name
    // (no http/https !)
    port : 443,
    path : '/youscada/feed?access_token=you_api_key', // the rest of the url with parameters if needed
    method : 'GET' // do GET
};

console.info('Options prepared:');
console.info(optionsgetmsg);
console.info('Do the GET call');

// do the GET request
var reqGet = https.request(optionsgetmsg, function(res) {
    console.log("statusCode: ", res.statusCode);
    // uncomment it for header details
//  console.log("headers: ", res.headers);


    res.on('data', function(d) {
        console.info('GET result after POST:\n');
        process.stdout.write(d);
        console.info('\n\nCall completed');
    });

});

reqGet.end();
reqGet.on('error', function(e) {
    console.error(e);
});
Giulio Roggero
fonte
1
Como faço para acessar os valores de d ??? d = {"dados": [{"id": 1111, "nome": "peter"}]}. como obter o valor do nome?
peter
2
conseguiu obter valores usando var thed = JSON.parse (d); console.log ("o ID é:" + thed.data [0] .id); Mas, em algum momento, recebo "Fim inesperado de entrada"
peter
33

Eu uso o node-fetch porque ele usa a API fetch () familiar (se você é um desenvolvedor da web ) . fetch () é a nova maneira de fazer solicitações HTTP arbitrárias do navegador.

Sim, eu sei que essa é uma questão de nó js, mas não queremos reduzir o número de desenvolvedores da API para memorizar e entender e melhorar a reutilização do nosso código javascript? Buscar é um padrão então que tal convergirmos para isso?

A outra coisa interessante sobre fetch () é que ele retorna uma promessa em javascript , para que você possa escrever um código assíncrono como este:

let fetch = require('node-fetch');

fetch('http://localhost', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{}'
}).then(response => {
  return response.json();
}).catch(err => {console.log(err);});

A busca substitui XMLHTTPRequest . Aqui estão mais algumas informações .

veleiro
fonte
O problema com a node-fetchcriação de APIs é que apenas funciona URL completo e não funcionará com URLs relativos.
Sebastian
11

Eu tenho usado restler para fazer chamadas de webservices, funciona como charme e é bem legal.

swapnil_mishra
fonte
5

Axios

Um exemplo (axios_example.js) usando o Axios no Node.js:

const axios = require('axios');
const express = require('express');
const app = express();
const port = process.env.PORT || 5000;

app.get('/search', function(req, res) {
    let query = req.query.queryStr;
    let url = `https://your.service.org?query=${query}`;

    axios({
        method:'get',
        url,
        auth: {
            username: 'the_username',
            password: 'the_password'
        }
    })
    .then(function (response) {
        res.send(JSON.stringify(response.data));
    })
    .catch(function (error) {
        console.log(error);
    });
});

var server = app.listen(port);

Certifique-se de que você faça no diretório do projeto:

npm init
npm install express
npm install axios
node axios_example.js

Em seguida, você pode testar a API REST do Node.js. usando seu navegador em: http://localhost:5000/search?queryStr=xxxxxxxxx

Da mesma forma, você pode publicar, como:

axios({
  method: 'post',
  url: 'https://your.service.org/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});

SuperAgent

Da mesma forma, você pode usar o SuperAgent.

superagent.get('https://your.service.org?query=xxxx')
.end((err, response) => {
    if (err) { return console.log(err); }
    res.send(JSON.stringify(response.body));
});

E se você quiser fazer autenticação básica:

superagent.get('https://your.service.org?query=xxxx')
.auth('the_username', 'the_password')
.end((err, response) => {
    if (err) { return console.log(err); }
    res.send(JSON.stringify(response.body));
});

Ref:

Yuci
fonte
5

Para usar os recursos mais recentes do Async / Await

https://www.npmjs.com/package/request-promise-native

npm install --save request
npm install --save request-promise-native

//código

async function getData (){
    try{
          var rp = require ('request-promise-native');
          var options = {
          uri:'https://reqres.in/api/users/2',
          json:true
        };

        var response = await rp(options);
        return response;
    }catch(error){
        throw error;
    }        
}

try{
    console.log(getData());
}catch(error){
    console.log(error);
}
codemirror
fonte
4

outro exemplo - você precisa instalar o módulo de solicitação para esse

var request = require('request');
function get_trustyou(trust_you_id, callback) {
    var options = {
        uri : 'https://api.trustyou.com/hotels/'+trust_you_id+'/seal.json',
        method : 'GET'
    }; 
    var res = '';
    request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            res = body;
        }
        else {
            res = 'Not Found';
        }
        callback(res);
    });
}

get_trustyou("674fa44c-1fbd-4275-aa72-a20f262372cd", function(resp){
    console.log(resp);
});
Hardik Ranpariya
fonte
4
var http = require('http');
var url = process.argv[2];

http.get(url, function(response) {
  var finalData = "";

  response.on("data", function (data) {
    finalData += data.toString();
  });

  response.on("end", function() {
    console.log(finalData.length);
    console.log(finalData.toString());
  });

});
Seb
fonte
3

Não encontrei nenhum com cURL, então escrevi um invólucro node-libcurl e pode ser encontrado em https://www.npmjs.com/package/vps-rest-client .

Para fazer um POST é assim:

var host = 'https://api.budgetvm.com/v2/dns/record';
var key = 'some___key';
var domain_id = 'some___id';

var rest = require('vps-rest-client');
var client = rest.createClient(key, {
  verbose: false
});

var post = {
  domain: domain_id,
  record: 'test.example.net',
  type: 'A',
  content: '111.111.111.111'
};

client.post(host, post).then(function(resp) {
  console.info(resp);

  if (resp.success === true) {
    // some action
  }
  client.close();
}).catch((err) => console.info(err));
Jonatas Walker
fonte
2

Se você possui o Node.js 4.4 ou superior, consulte reqclient , que permite fazer chamadas e registrar as solicitações em cURL estilo , para que você possa verificar e reproduzir facilmente as chamadas fora do aplicativo.

Retorna objetos Promise , em vez de transmitir retornos de chamada simples, para que você possa lidar com o resultado de uma maneira mais "fashion" , encadeando o resultado facilmente e manipular erros de maneira padrão. Também remove muitas configurações padrão em cada solicitação: URL base, tempo limite, formato do tipo de conteúdo, cabeçalhos padrão, parâmetros e ligação de consulta na URL e recursos básicos de cache.

Este é um exemplo de como inicializá-lo, fazer uma chamada e registrar a operação com o estilo curl :

var RequestClient = require("reqclient").RequestClient;
var client = new RequestClient({
    baseUrl:"http://baseurl.com/api/", debugRequest:true, debugResponse:true});
client.post("client/orders", {"client": 1234, "ref_id": "A987"},{"x-token": "AFF01XX"});

Isso fará o login no console ...

[Requesting client/orders]-> -X POST http://baseurl.com/api/client/orders -d '{"client": 1234, "ref_id": "A987"}' -H '{"x-token": "AFF01XX"}' -H Content-Type:application/json

E quando a resposta é retornada ...

[Response   client/orders]<- Status 200 - {"orderId": 1320934}

Este é um exemplo de como lidar com a resposta com o objeto de promessa:

client.get("reports/clients")
  .then(function(response) {
    // Do something with the result
  }).catch(console.error);  // In case of error ...

Claro, ele pode ser instalado com: npm install reqclient.

Mariano Ruiz
fonte
1

Você pode usar o curlrequest para definir facilmente o horário da solicitação que deseja fazer ... você pode até definir cabeçalhos nas opções para " falsificar " uma chamada do navegador.

luizpanariello
fonte
1

Aviso: a partir de 11 de fevereiro de 2020, a solicitação foi totalmente descontinuada.

Se você implementar com dados do formulário, para obter mais informações ( https://tanaikech.github.io/2017/07/27/multipart-post-request-using-node.js ):

var fs = require('fs');
var request = require('request');
request.post({
  url: 'https://slack.com/api/files.upload',
  formData: {
    file: fs.createReadStream('sample.zip'),
    token: '### access token ###',
    filetype: 'zip',
    filename: 'samplefilename',
    channels: 'sample',
    title: 'sampletitle',
  },
}, function (error, response, body) {
  console.log(body);
});
Lwf804
fonte
0

Achei superagente muito útil, é muito simples, por exemplo

const superagent=require('superagent')
superagent
.get('google.com')
.set('Authorization','Authorization object')
.set('Accept','application/json')
David Innocent
fonte