Как сделать удаленный вызов REST внутри Node.js? любой CURL?

В Node.js, кроме использования дочернего процесса для вызова CURL, существует ли способ сделать вызов CURL удаленному серверу REST API и получить возвращаемые данные?

Мне также нужно настроить заголовок запроса на удаленный вызов REST, а также строку запроса, а также в GET (или POST).

Я нахожу это: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

но он не показывает никакого способа строки запроса POST.

Ответ 1

Посмотрите 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();

Ответ 2

Как насчет использования Запрос - упрощенный HTTP-клиент.

Здесь 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.
     }
})

OP также хотел POST:

request.post('http://service.com/upload', {form:{key:'value'}})

Ответ 3

Посмотрите 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);
});

Ответ 4

Я использую node-fetch, потому что он использует знакомые (если вы веб-разработчик) API fetch(). fetch() - это новый способ сделать произвольные HTTP-запросы из браузера.

Да, я знаю, что это вопрос node js, но не хотим ли мы сократить количество разработчиков API, чтобы запоминать и понимать, а также улучшать возможность повторного использования нашего javascript-кода? Fetch - это стандарт, а как насчет того, что мы сходим на этом?

Другая приятная вещь о fetch() заключается в том, что она возвращает javascript Promise, поэтому вы можете написать асинхронный код следующим образом:

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

Fetch supersedes XMLHTTPRequest. Здесь несколько больше информации.

Ответ 5

Я использую restler для вызова веб-сервисов, работает как шарм и довольно аккуратный.

Ответ 6

другой пример - вам нужно установить модуль запроса для

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

Ответ 7

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

});

Ответ 8

Я не нашел никакого с cURL, поэтому написал обертку node-libcurl и может быть найден в https://www.npmjs.com/package/vps-rest-client.

Сделать POST так:

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

Ответ 9

Вы можете использовать curlrequest, чтобы легко установить время запроса, которое вы хотите сделать... вы даже можете установить заголовки в параметрах "подделать" вызов браузера.

Ответ 10

Если у вас есть Node.js 4.4+, посмотрите reqclient, он позволяет совершать вызовы и регистрировать запросы в стиле cURL, поэтому вы можете легко проверять и воспроизводить вызовы вне приложения.

Возвращает Promise объекты вместо передачи простых обратных вызовов, поэтому вы можете обрабатывать результат более "способом", chain результат легко и обрабатывать ошибки стандартным образом. Также удаляется множество конфигураций шаблонов по каждому запросу: базовый URL-адрес, тайм-аут, формат содержимого, заголовки по умолчанию, параметры и привязка запроса в URL-адресе и основные функции кеширования.

Это пример того, как его инициализировать, выполнить вызов и зарегистрировать операцию с помощью завитка:

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

Это запустится в консоли...

[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

И когда ответ возвращается...

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

Это пример того, как обрабатывать ответ с помощью объекта обещания:

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

Конечно, его можно установить с помощью npm install reqclient.