Bagaimana cara membuat panggilan REST jarak jauh di dalam Node.js? ada CURL?


189

Di Node.js , selain menggunakan proses anak untuk membuat panggilan CURL , apakah ada cara untuk membuat panggilan CURL ke server jarak jauh REST API dan mendapatkan data pengembalian?

Saya juga perlu mengatur header permintaan ke panggilan REST jarak jauh , dan juga string permintaan di GET (atau POST).

Saya menemukan ini: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

tetapi tidak menunjukkan cara apa pun untuk string kueri POST.


Jawaban:


212

Melihat 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
Jadi, meskipun POST, saya juga menambahkan data dalam string kueri?
murvinlai

3
@murvinlai tidak yakin. Bacalah dokumen, sumber, spesifikasi HTTP. Bukan ahli di wilayah itu.
Raynos

15
Satu hal yang perlu diperhatikan adalah Anda tidak memasukkan http atau https ke entri host Anda, mis. Var options = {host: graph.facebook.com ....} bukan {host: http: graph.facebook.com}. Itu membuat saya tersandung selama beberapa siklus. (Lihat di bawah). Keduanya adalah jawaban yang bagus. Terima kasih untuk kalian berdua.
binarygiant

9
Bisakah saya menunjukkan bahwa jika balasannya panjang, menggunakan res.on ('data', ..) tidak cukup. Saya percaya cara yang benar adalah dengan memiliki res.on ('end' ..) untuk mengetahui kapan Anda telah menerima semua data. Maka Anda bisa memproses.
Xerri

4
Ini adalah jawaban yang sangat lama - untuk mereka yang menulis simpul js hari ini Anda pasti akan menggunakan npmjs.com/package/node-fetch atau paket berbasis API fetch lainnya, yang didasarkan pada standar Fetch. Lihat jawaban saya di bawah ini.
berlayar

95

Bagaimana dengan menggunakan Permintaan - klien HTTP Sederhana .

Sunting Februari 2020: Permintaan telah usang sehingga Anda mungkin tidak boleh menggunakannya lagi.

Inilah 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 juga menginginkan POST:

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

1
Berfungsi baik dengan google.com tetapi mengembalikan "RequestError: Error: socket hang up" saat meminta grafik api facebook. Mohon panduannya, terima kasih!
Dynamic Remo

Modul ini mengandung banyak masalah!
Pratik Singhal

Bagaimana saya bisa melewatkan parameter permintaan sambil mengonsumsi REST API dengan cara ini?
vdenotaris

2
Pada 11 Februari 2020, permintaan sepenuhnya DIHAPUSKAN. Anda dapat melihatnya di situs web github.com/request/request#deprecated
Sadiel

Adakah panduan tentang pemula apa yang harus digunakan? Saya memfilter melalui BANYAK contoh yang menggunakan ini.
Steve3p0

36

Lihatlah 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
Bagaimana cara saya mengakses nilai dari d ??? d = {"data": [{"id": 1111, "name": "peter"}]}. bagaimana cara mendapatkan nilai nama?
peter

2
berhasil mendapatkan nilai dengan menggunakan var thed = JSON.parse (d); console.log ("id adalah:" + thed.data [0] .id); Tetapi beberapa waktu saya mendapatkan "Akhir input tak terduga"
peter

33

Saya menggunakan node-fetch karena menggunakan API fetch () yang Anda kenal (jika Anda adalah pengembang web ) . fetch () adalah cara baru untuk membuat permintaan HTTP sewenang-wenang dari browser.

Ya saya tahu ini adalah pertanyaan simpul js, tetapi tidakkah kita ingin mengurangi jumlah pengembang API yang harus menghafal dan memahami, dan meningkatkan penggunaan ulang kode javascript kita? Ambil adalah standar jadi bagaimana kalau kita bertemu itu?

Hal menyenangkan lainnya tentang fetch () adalah ia mengembalikan javascript Promise , sehingga Anda dapat menulis kode async seperti ini:

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

Ambil menggantikan XMLHTTPRequest . Ini beberapa info lebih lanjut .


masalah dengan node-fetchketika menulis API adalah bahwa hanya URL yang berfungsi akan penuh dan tidak akan berfungsi dengan URL relatif.
Sebastian


5

Aksioma

Contoh (axios_example.js) menggunakan Axios di 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);

Pastikan dalam direktori proyek Anda Anda melakukannya:

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

Anda kemudian dapat menguji NEST.js REST API menggunakan browser Anda di: http://localhost:5000/search?queryStr=xxxxxxxxx

Demikian pula Anda dapat melakukan posting, seperti:

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

SuperAgent

Demikian pula Anda dapat menggunakan SuperAgent.

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

Dan jika Anda ingin melakukan otentikasi dasar:

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

Untuk menggunakan fitur Async / Await terbaru

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

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

//kode

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

satu contoh lain - Anda perlu menginstal modul permintaan untuk itu

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

Saya tidak menemukan satupun dengan CURL jadi saya menulis pembungkus di sekitar node-libcurl dan dapat ditemukan di https://www.npmjs.com/package/vps-rest-client .

Untuk membuat POST seperti ini:

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

Jika Anda memiliki Node.js 4.4+, lihat reqclient , memungkinkan Anda untuk membuat panggilan dan mencatat permintaan dengan gaya CURL , sehingga Anda dapat dengan mudah memeriksa dan mereproduksi panggilan di luar aplikasi.

Mengembalikan objek Janji alih-alih meneruskan panggilan balik sederhana, sehingga Anda dapat menangani hasilnya dengan cara yang lebih "mode" , mengaitkan hasilnya dengan mudah, dan menangani kesalahan dengan cara standar. Juga menghapus banyak konfigurasi pelat pada setiap permintaan: URL dasar, batas waktu, format tipe konten, tajuk default, parameter dan kueri yang mengikat dalam URL, dan fitur cache dasar.

Ini adalah contoh cara menginisialisasi, membuat panggilan dan mencatat operasi dengan gaya ikal :

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

Ini akan masuk ke konsol ...

[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

Dan ketika respons dikembalikan ...

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

Ini adalah contoh bagaimana menangani respons dengan objek yang dijanjikan:

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

Tentu saja, hal itu dapat diinstal dengan: npm install reqclient.


1

Anda dapat menggunakan curlrequest untuk dengan mudah mengatur waktu permintaan yang ingin Anda lakukan ... Anda bahkan dapat mengatur header di opsi untuk " memalsukan " panggilan browser.


1

Peringatan: Pada 11 Februari 2020, permintaan sudah tidak digunakan lagi.

Jika Anda menerapkan dengan formulir-data, untuk info lebih lanjut ( 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

Saya menemukan superagent sangat bermanfaat, sangat sederhana misalnya

const superagent=require('superagent')
superagent
.get('google.com')
.set('Authorization','Authorization object')
.set('Accept','application/json')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.