วิธีการโทร REST ระยะไกลภายใน Node.js? CURL ใด ๆ


189

ในNode.jsนอกเหนือจากการใช้กระบวนการลูกเพื่อทำการโทรCURLมีวิธีใดในการโทร CURL ไปยังเซิร์ฟเวอร์ระยะไกลREST API และรับข้อมูลส่งคืนหรือไม่

ฉันยังต้องตั้งค่าส่วนหัวคำขอไปยังการเรียกใช้RESTระยะไกลและสตริงข้อความค้นหาเช่นกันใน GET (หรือ POST)

ฉันพบสิ่งนี้: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

แต่จะไม่แสดงวิธีใด ๆ กับสตริงข้อความค้นหา POST


คำตอบ:


212

ดูที่ 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 ฉันยังผนวกข้อมูลในสตริงการสืบค้นหรือไม่
murvinlai

3
@murvinlai ไม่แน่ใจ ไปอ่านเอกสารแหล่งที่มาข้อมูลจำเพาะ HTTP ไม่ใช่ผู้เชี่ยวชาญในภูมิภาคนั้น
Raynos

15
สิ่งหนึ่งที่ควรทราบคือคุณไม่ใส่ http หรือ https ในรายการโฮสต์ของคุณเช่นตัวเลือก var = {host: graph.facebook.com .... } ไม่ใช่ {host: http: graph.facebook.com} นั่นทำให้ผมสะดุดขึ้นสักสองสามรอบ (ดูด้านล่าง) นี่เป็นคำตอบที่ยอดเยี่ยม ขอบคุณทั้งคุณ
binarygiant

9
ฉันสามารถชี้ให้เห็นว่าถ้าการตอบกลับยาวการใช้ res.on ('data', .. ) ไม่เพียงพอ ฉันเชื่อว่าวิธีที่ถูกต้องคือการมี res.on ('end' .. ) เพื่อทราบเมื่อคุณได้รับข้อมูลทั้งหมด จากนั้นคุณสามารถประมวลผล
Xerri

4
นี่เป็นคำตอบที่เก่ามาก - สำหรับผู้ที่เขียนโหนด js วันนี้คุณจะต้องใช้npmjs.com/package/node-fetchหรือแพ็กเกจที่ใช้ API การดึงข้อมูลอื่น ๆ ซึ่งเป็นไปตามมาตรฐานการดึงข้อมูล ดูคำตอบของฉันด้านล่าง
แล่นเรือใบ

95

วิธีการเกี่ยวกับการใช้คำขอ - ย่อ HTTP ลูกค้า

แก้ไขกุมภาพันธ์ 2020: คำขอเลิกใช้แล้วดังนั้นคุณอาจไม่ควรใช้อีกต่อไป

นี่คือ 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'}})

1
ทำงานได้ดีกับ google.com แต่ส่งคืน "RequestError: ข้อผิดพลาด: ซ็อกเก็ตวางสาย" เมื่อขอกราฟ API ของ facebook กรุณาแนะนำขอบคุณ!
Dynamic Remo

โมดูลนี้มีปัญหามากมาย!
Pratik Singhal

ฉันจะส่งพารามิเตอร์คำขอในขณะที่ใช้ REST API ด้วยวิธีนี้ได้อย่างไร
vdenotaris

2
ตั้งแต่วันที่ 11 ก.พ. 2020 คำขอจะถูกยกเลิกอย่างสมบูรณ์ คุณสามารถดูได้ในเว็บไซต์github.com/request/request#deprecated
Sadiel

คำแนะนำใด ๆ เกี่ยวกับสิ่งที่มือใหม่ควรใช้? ฉันกำลังกรองตัวอย่างมากมายที่ใช้สิ่งนี้
Steve3p0

36

ดูที่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 ??? d = {"data": [{"id": 1111, "name": "peter"}]}} วิธีรับค่าชื่อ
เตอร์

2
จัดการเพื่อรับค่าโดยใช้ var thed = JSON.parse (d); console.log ("id คือ:" + thed.data [0] .id); แต่บางครั้งฉันได้รับ "ไม่คาดหวังจุดจบของการป้อนข้อมูล"
peter

33

ฉันใช้โหนดเรียกเพราะมันใช้คุ้นเคย (ถ้าคุณเป็นนักพัฒนาเว็บ) สามารถดึงข้อมูล () API fetch () เป็นวิธีใหม่ในการสร้างคำขอ HTTP โดยพลการจากเบราว์เซอร์

ใช่ฉันรู้ว่านี่เป็นคำถามของโหนด js แต่เราไม่ต้องการลดจำนวนนักพัฒนาของ API ที่ต้องจดจำและเข้าใจและปรับปรุงการใช้งานจาวาสคริปต์ของเราอีกครั้งหรือไม่ การดึงข้อมูลเป็นมาตรฐานดังนั้นเราจะมาบรรจบกันได้อย่างไร

อีกสิ่งที่ดีเกี่ยวกับการดึงข้อมูล () คือการส่งคืนสัญญาจาวาสคริปต์เพื่อให้คุณสามารถเขียนรหัส async ดังนี้:

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 แทนที่XMLHttpRequest นี่คือบางส่วนข้อมูลเพิ่มเติม


ปัญหาnode-fetchเมื่อ writting APIs นั้นใช้ได้เฉพาะ URL เต็มและจะไม่ทำงานกับ URL สัมพัทธ์
เซบาสเตียน


5

Axios

ตัวอย่าง (axios_example.js) โดยใช้ Axios ใน 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);

ตรวจสอบให้แน่ใจในไดเรกทอรีโครงการของคุณ:

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

จากนั้นคุณสามารถทดสอบ Node.js REST API โดยใช้เบราว์เซอร์ของคุณที่: http://localhost:5000/search?queryStr=xxxxxxxxx

ในทำนองเดียวกันคุณสามารถโพสต์เช่น:

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

SuperAgent

ในทำนองเดียวกันคุณสามารถใช้ SuperAgent

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

และถ้าคุณต้องการทำการรับรองความถูกต้องเบื้องต้น:

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

หากต้องการใช้คุณสมบัติ Async / Await ล่าสุด

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

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

//รหัส

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

อีกตัวอย่างหนึ่ง - คุณต้องติดตั้งโมดูลคำขอสำหรับสิ่งนั้น

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

ฉันไม่พบใด ๆ กับม้วนดังนั้นฉันเขียนกระดาษห่อรอบโหนด 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));

2

หากคุณมี Node.js 4.4+ ลองดูreqclientซึ่งจะช่วยให้คุณสามารถโทรออกและบันทึกคำขอในรูปแบบcURLเพื่อให้คุณสามารถตรวจสอบและโทรออกนอกแอปพลิเคชันได้อย่างง่ายดาย

ผลตอบแทนที่ได้สัญญาวัตถุแทนการเรียกกลับผ่านง่ายเพื่อให้คุณสามารถจัดการกับผลที่ตามมาในอีก"แฟชั่น"วิธีโซ่ผลได้อย่างง่ายดายและข้อผิดพลาดในการจัดการในวิธีการมาตรฐาน ยังลบการกำหนดค่าสำเร็จรูปจำนวนมากในแต่ละคำขอ: URL ฐานหมดเวลารูปแบบชนิดเนื้อหาส่วนหัวเริ่มต้นพารามิเตอร์และการเชื่อมโยงแบบสอบถามใน URL และคุณสมบัติแคชพื้นฐาน

นี่คือตัวอย่างของวิธีการเริ่มต้นโทรและบันทึกการดำเนินงานด้วยสไตล์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"});

สิ่งนี้จะเข้าสู่ระบบในคอนโซล ...

[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แน่นอนมันสามารถติดตั้งได้ด้วย:


1

คุณสามารถใช้curlrequestเพื่อกำหนดเวลาที่ต้องการได้อย่างง่ายดาย ... คุณยังสามารถตั้งค่าส่วนหัวในตัวเลือกเพื่อเรียกเบราว์เซอร์" ปลอม "


1

คำเตือน: ตั้งแต่วันที่ 11 กุมภาพันธ์ 2020 คำขอไม่ได้รับการสนับสนุนอย่างเต็มที่

หากคุณใช้กับ form-data สำหรับข้อมูลเพิ่มเติม ( 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);
});

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.