Làm cách nào để thực hiện cuộc gọi REST từ xa bên trong Node.js? bất kỳ HIỆN TẠI?


189

Trong Node.js , ngoài việc sử dụng quy trình con để thực hiện cuộc gọi CURL , có cách nào để thực hiện cuộc gọi CURL đến API REST của máy chủ từ xa và nhận dữ liệu trả về không?

Tôi cũng cần thiết lập tiêu đề yêu cầu cho cuộc gọi REST từ xa và chuỗi truy vấn cũng như trong GET (hoặc POST).

Tôi tìm thấy cái này: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

nhưng nó không hiển thị bất kỳ cách nào để POST chuỗi truy vấn.


Câu trả lời:


211

Nhìn vào 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
Vì vậy, ngay cả đó là POST, tôi cũng chắp thêm dữ liệu trong chuỗi truy vấn?
murvinlai

3
@murvinlai không chắc. Đi đọc tài liệu, nguồn, thông số HTTP. Không phải là một chuyên gia về khu vực đó.
Raynos

14
Một điều cần lưu ý là bạn không đặt http hoặc https vào mục nhập máy chủ của mình, ví dụ: var Options = {host: graph.facebook.com ....} chứ không phải {host: http: graph.facebook.com}. Điều đó làm tôi vấp ngã trong một vài chu kỳ. (Xem bên dưới). Đây là cả hai câu trả lời tuyệt vời. Cảm ơn cả hai bạn.
nhị phân

9
Tôi có thể chỉ ra rằng nếu trả lời dài, sử dụng res.on ('dữ liệu', ..) là không đủ. Tôi tin rằng cách chính xác là cũng có res.on ('end' ..) để biết khi nào bạn đã nhận được tất cả dữ liệu. Sau đó, bạn có thể xử lý.
Xerri

3
Đây là một câu trả lời rất cũ - đối với những người viết nút js ngày nay, bạn chắc chắn sẽ sử dụng npmjs.com/package/node-fetch hoặc gói dựa trên API tìm nạp khác, dựa trên tiêu chuẩn Fetch. Xem câu trả lời của tôi dưới đây.
thuyền

95

Cách sử dụng Yêu cầu - Máy khách HTTP được đơn giản hóa .

Chỉnh sửa tháng 2 năm 2020: Yêu cầu đã không được chấp nhận vì vậy bạn có thể không nên sử dụng nó nữa.

Đây là một 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 cũng muốn có một POST:

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

1
Hoạt động tốt với google.com nhưng trả về "RequestError: Error: socket treo" khi yêu cầu api biểu đồ của facebook. Xin hướng dẫn, cảm ơn!
Năng động Remo

Module này chứa rất nhiều vấn đề!
Pratik Singhal

Làm cách nào tôi có thể vượt qua một tham số yêu cầu trong khi sử dụng API REST theo cách này?
vdenotaris

1
Kể từ ngày 11 tháng 2 năm 2020, yêu cầu được ĐỔI hoàn toàn. Bạn có thể thấy nó trong trang web github.com/request/request#deprecated
Sadiel

Bất kỳ hướng dẫn về những gì người mới nên sử dụng? Tôi đang lọc rất nhiều ví dụ sử dụng điều này.
Steve3p0

36

Nhìn vào 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
Làm thế nào để tôi truy cập các giá trị từ d ??? d = {"dữ liệu": [{"id": 1111, "tên": "peter"}]}. Làm thế nào để có được giá trị tên?
peter

2
quản lý để nhận các giá trị bằng cách sử dụng var thed = JSON.parse (d); console.log ("id là:" + thed.data [0] .id); Nhưng đôi khi tôi nhận được "Kết thúc đầu vào không mong đợi"
peter

33

Tôi sử dụng tìm nạp nút vì nó sử dụng API tìm nạp ( nếu bạn là nhà phát triển web) quen thuộc . fetch () là cách mới để thực hiện các yêu cầu HTTP tùy ý từ trình duyệt.

Có tôi biết đây là câu hỏi của nút js, nhưng chúng tôi không muốn giảm số lượng nhà phát triển API phải ghi nhớ và hiểu và cải thiện khả năng sử dụng lại mã javascript của chúng tôi? Lấy là một tiêu chuẩn vậy làm thế nào về chúng ta hội tụ về điều đó?

Một điều thú vị khác về fetch () là nó trả về một Promise javascript , vì vậy bạn có thể viết mã async như thế này:

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

Tìm nạp thay thế XMLHTTPRequest . Dưới đây là một số thông tin .


vấn đề với node-fetchkhi viết API là chỉ hoạt động sẽ có URL đầy đủ và sẽ không hoạt động với các URL tương đối.
Sebastian

11

Tôi đã sử dụng restler để thực hiện cuộc gọi dịch vụ web, hoạt động như sự quyến rũ và khá gọn gàng.


5

Axios

Một ví dụ (axios_example.js) sử dụng Axios trong 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);

Hãy chắc chắn trong thư mục dự án của bạn, bạn làm:

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

Sau đó, bạn có thể kiểm tra API REST của Node.js bằng trình duyệt của mình tại: http://localhost:5000/search?queryStr=xxxxxxxxx

Tương tự bạn có thể làm bài, chẳng hạn như:

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

Siêu nhân

Tương tự bạn có thể sử dụng SuperAgent.

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

Và nếu bạn muốn xác thực cơ bản:

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

Tham chiếu:


5

Để sử dụng các tính năng Async / Await mới nhất

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

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

// mã

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

một ví dụ khác - bạn cần cài đặt mô-đun yêu cầu cho điều đó

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

Tôi đã không tìm thấy bất kỳ với cURL vì vậy tôi đã viết một trình bao bọc xung quanh nút-libcurl và có thể được tìm thấy tại https://www.npmjs.com/package/vps-rest-client .

Để tạo một POST cũng giống như vậy:

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

Nếu bạn có Node.js 4.4+, hãy xem reqclient , nó cho phép bạn thực hiện cuộc gọi và ghi nhật ký các yêu cầu theo kiểu cURL , để bạn có thể dễ dàng kiểm tra và tái tạo các cuộc gọi bên ngoài ứng dụng.

Trả về các đối tượng Hứa thay vì vượt qua các cuộc gọi lại đơn giản, do đó bạn có thể xử lý kết quả theo cách "thời trang" hơn, xâu chuỗi kết quả dễ dàng và xử lý lỗi theo cách tiêu chuẩn. Đồng thời xóa rất nhiều cấu hình soạn sẵn cho mỗi yêu cầu: URL cơ sở, hết thời gian, định dạng loại nội dung, tiêu đề mặc định, tham số và ràng buộc truy vấn trong URL và các tính năng bộ đệm cơ bản.

Đây là một ví dụ về cách khởi tạo nó, thực hiện cuộc gọi và ghi nhật ký thao tác với kiểu 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"});

Điều này sẽ đăng nhập vào bảng điều khiển ...

[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

Và khi phản hồi được trả lại ...

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

Đây là một ví dụ về cách xử lý phản hồi với đối tượng lời hứa:

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

Tất nhiên, nó có thể được cài đặt với : npm install reqclient.


1

Bạn có thể sử dụng curlrequest để dễ dàng đặt thời gian yêu cầu bạn muốn thực hiện ... thậm chí bạn có thể đặt tiêu đề trong các tùy chọn để " giả " một cuộc gọi trình duyệt.


0

Tôi thấy superagent thực sự hữu ích, ví dụ rất đơn giản

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

0

Cảnh báo: Kể từ ngày 11 tháng 2 năm 2020, yêu cầu hoàn toàn không được chấp nhận.

Nếu bạn triển khai với dữ liệu biểu mẫu, để biết thêm thông tin ( https://tanaikech.github.io/2017/07/27/multipart-post-request-USE-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);
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.