Node.js içinde uzaktan REST çağrısı nasıl yapılır? herhangi bir CURL?


189

In node.js yapmak için çocuk işlemi kullanarak dışındaki CURL çağrıyı, uzak sunucu için CURL çağrısı yapmak için bir yol var DİNLENME API ve dönüş verileri almak?

Ayrıca uzak REST çağrısı için istek üstbilgisini ayarlamak ve ayrıca GET (veya POST) de dize sorgu gerekir.

Bunu buluyorum: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

ancak POST sorgu dizesine herhangi bir yol göstermez.


Yanıtlar:


212

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

3
POST olsa bile, ben de sorgu dizesine veri eklemek?
murvinlai

3
@murvinlai emin değilim. Git belgeleri, kaynağı, HTTP spesifikasyonunu okuyun. O bölgede uzman değil.
Raynos

15
Unutulmaması gereken bir nokta, ana bilgisayar girişinize http veya https koymamanızdır, örn. {Host: http: graph.facebook.com} değil var options = {host: graph.facebook.com ....}. Bu beni birkaç döngü attı. (Aşağıya bakınız). Bunlar harika cevaplar. İkinize de teşekkürler.
binarygiant

9
Sadece cevap uzunsa res.on ('data', ..) kullanmanın yeterli olmadığını belirtebilir miyim? Ben de doğru yolu tüm verileri ne zaman aldığınızı bilmek için res.on ('end' ..) olması olduğuna inanıyorum. Sonra işleyebilirsiniz.
Xerri

4
Bu çok eski bir cevaptır - js düğümü yazanlar için bugün kesinlikle Fetch standardına dayanan npmjs.com/package/node-fetch veya diğer getirme API tabanlı paketi kullanacaksınız. Cevabımı aşağıda görebilirsiniz.
saille

95

İstek - Basitleştirilmiş HTTP istemcisi kullanma hakkında .

Şubat 2020'yi düzenleyin: Muhtemelen daha fazla kullanmamanız için istek kullanımdan kaldırılmıştır.

İşte bir 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 ayrıca bir POST istedi:

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

1
Google.com ile iyi çalışır ama facebook grafik api isterken "RequestError: Hata: soket telefonu kapat" döndürür. Lütfen rehberlik edin, teşekkürler!
Dynamic Remo

Bu modül birçok sorun içeriyor!
Pratik Singhal

Bu şekilde bir REST API'sini tüketirken nasıl bir istek parametresini iletebilirim?
vdenotaris

2
11 Şubat 2020 itibariyle talep tamamen KESİNTİSİZDİR. Bunu web sitesinde görebilirsiniz github.com/request/request#deprecated
Sadiel

Hangi yeni başlayanların kullanılması gerektiğine dair bir rehberlik var mı? Bunu kullanan bir çok örnek filtreliyorum.
Steve3p0

36

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

1
D'den değerlere nasıl erişebilirim? d = {"data": [{"id": 1111, "name": "peter"}]}. isim değeri nasıl alınır?
peter

2
var thed = JSON.parse (d) kullanarak değer almayı başardı; console.log ("id:" + thed.data [0] .id); Ama bir süre "Beklenmedik giriş sonu"
peter

33

Tanıdık (bir web geliştiricisi iseniz) fetch () API kullandığından, düğüm-fetch kullanın . fetch (), tarayıcıdan rastgele HTTP istekleri yapmanın yeni yoludur.

Evet, bu bir düğüm js sorusu olduğunu biliyorum, ama API geliştiricilerinin ezberlemek ve anlamak zorunda ve javascript kodumuzun yeniden kullanılabilirliğini artırmak zorunda sayısını azaltmak istemiyor musunuz? Getirme bir standarttır, bu yüzden buna yaklaşmaya ne dersiniz?

Fetch () ile ilgili diğer güzel şey, bir javascript Promise döndürmesidir , böylece async kodunu şöyle yazabilirsiniz:

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

Getirme XMLHTTPRequest öğesinin yerine geçer . İşte biraz daha bilgi .


node-fetchAPI'leri yazarken sorun yalnızca URL'nin tam olması ve göreli URL'lerle çalışmayacak olmasıdır.
Sebastian


5

Axios

Node.js'de Axios kullanan bir örnek (axios_example.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);

Proje dizininizde şunları yaptığınızdan emin olun:

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

Daha sonra Node.js REST API'sını şu adresteki tarayıcınızı kullanarak test edebilirsiniz: http://localhost:5000/search?queryStr=xxxxxxxxx

Benzer şekilde, aşağıdaki gibi yayın yapabilirsiniz:

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

superagent

Benzer şekilde SuperAgent'ı kullanabilirsiniz.

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

Ve temel kimlik doğrulaması yapmak istiyorsanız:

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:


5

En son Async / Await özelliklerini kullanmak için

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

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

// kod

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

4

başka bir örnek - bunun için istek modülü yüklemeniz gerekiyor

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

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

});

3

Ben cURL ile herhangi bir bulamadık bu yüzden düğüm libcurl etrafında bir sarıcı yazdı ve https://www.npmjs.com/package/vps-rest-client adresinde bulunabilir .

POST yapmak şu şekildedir:

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

2

Node.js 4.4+ sürümüne sahipseniz , reqclient'e bir göz atın , arama yapmanıza ve istekleri cURL tarzında günlüğe kaydetmenize olanak tanır , böylece aramaları uygulama dışında kolayca kontrol edebilir ve çoğaltabilirsiniz.

Basit geri aramaları iletmek yerine Promise nesnelerini döndürür , böylece sonucu daha "moda" bir şekilde işleyebilir, sonucu kolayca zincirleyebilir ve hataları standart bir şekilde işleyebilirsiniz. Ayrıca, her istekte çok sayıda kaynak plakası yapılandırmasını kaldırır: temel URL, zaman aşımı, içerik türü biçimi, varsayılan üstbilgiler, URL'deki parametreler ve sorgu bağlama ve temel önbellek özellikleri.

Bu, nasıl başlatılacağına, nasıl çağrı yapılacağına ve işlemin kıvrılma stiliyle nasıl kaydedileceğine bir örnektir :

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

Bu konsolda oturum açacak ...

[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

Ve cevap geri döndüğünde ...

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

Bu, promise nesnesiyle yanıtı nasıl ele alacağınıza bir örnektir:

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

Tabii ki, bu birlikte monte edilebilir: npm install reqclient.


1

Sen kullanabilirsiniz curlrequest hatta "için seçeneklerinde başlıklarını ayarlayabilirsiniz ... kolayca yapmak istediğiniz isteğin ne zaman ayarlamak için sahte " Bir tarayıcı çağrısı.


1

Uyarı: 11 Şubat 2020 itibariyle istek tamamen kullanımdan kaldırıldı.

Form verileriyle uygularsanız, daha fazla bilgi için ( 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);
});

0

Superagent'ı gerçekten yararlı buldum, örneğin çok basit

const superagent=require('superagent')
superagent
.get('google.com')
.set('Authorization','Authorization object')
.set('Accept','application/json')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.