Node.js एक्सप्रेस में HTTP GET अनुरोध


192

मैं Node.js या Express.js के भीतर से HTTP अनुरोध कैसे कर सकता हूं? मुझे दूसरी सेवा से जुड़ने की आवश्यकता है। मुझे उम्मीद है कि कॉल अतुल्यकालिक है और कॉलबैक में दूरस्थ सर्वर की प्रतिक्रिया है।

जवाबों:


220

यहाँ मेरा एक नमूना से कुछ कोड का एक टुकड़ा है। यह अतुल्यकालिक है और एक JSON ऑब्जेक्ट देता है। यह GET अनुरोध के किसी भी रूप में कर सकता है।

ध्यान दें कि अधिक इष्टतम तरीके हैं (बस एक नमूना) - उदाहरण के लिए, आप एक सरणी में रखे गए विखंडू को समाप्‍त करने के बजाय और इसे आदि से जोड़ते हैं ... उम्मीद है, यह आपको सही दिशा में शुरू हो जाता है:

const http = require('http');
const https = require('https');

/**
 * getJSON:  RESTful GET request returning JSON object(s)
 * @param options: http options object
 * @param callback: callback to pass the results JSON object(s) back
 */

module.exports.getJSON = (options, onResult) => {
  console.log('rest::getJSON');
  const port = options.port == 443 ? https : http;

  let output = '';

  const req = port.request(options, (res) => {
    console.log(`${options.host} : ${res.statusCode}`);
    res.setEncoding('utf8');

    res.on('data', (chunk) => {
      output += chunk;
    });

    res.on('end', () => {
      let obj = JSON.parse(output);

      onResult(res.statusCode, obj);
    });
  });

  req.on('error', (err) => {
    // res.send('error: ' + err.message);
  });

  req.end();
};

यह एक विकल्प वस्तु बनाने के द्वारा बुलाया जाता है जैसे:

const options = {
  host: 'somesite.com',
  port: 443,
  path: '/some/path',
  method: 'GET',
  headers: {
    'Content-Type': 'application/json'
  }
};

और कॉलबैक फ़ंक्शन प्रदान करता है।

उदाहरण के लिए, एक सेवा में, मुझे ऊपर दिए गए REST मॉड्यूल की आवश्यकता होती है और फिर यह करते हैं:

rest.getJSON(options, (statusCode, result) => {
  // I could work with the resulting HTML/JSON here. I could also just return it
  console.log(`onResult: (${statusCode})\n\n${JSON.stringify(result)}`);

  res.statusCode = statusCode;

  res.send(result);
});

अपडेट करें

यदि आप async/ await(रेखीय, कोई कॉलबैक नहीं), वादे, समय समर्थन और परिचय के लिए खोज रहे हैं , तो हमने एक हल्का HTTP और REST क्लाइंट बनाया जो उस बिल को फिट करता है:

Microsoft टाइप-रेस्ट-क्लाइंट


@bryanmac क्या आप पूरा नमूना भेज / जोड़ सकते हैं?
StErMi

आपकी अनुमति के साथ @bryanmac मैं वर्तमान में इस कोड ग्रन्ट प्लगइन का उपयोग करना चाहूंगा। यकीन नहीं है, लेकिन जब यह पूरा हो जाएगा खुला sourced बनाया जाएगा।
जेफ़एच

3
.. अनुरोध मॉड्यूल की कोशिश यह है बहुत सरल sitepoint.com/making-http-requests-in-node-js
saurshaz

6
हां - अनुरोध मॉड्यूल सरल है, लेकिन यह निम्न स्तर है जो अनुरोध मॉड्यूल जैसे पुस्तकालयों को दिखा रहा है। यदि आपको निम्न स्तर पर नियंत्रण या http अनुरोध (बड़े डाउनलोड आदि पर प्रगति दिखा रहा है ...) की आवश्यकता है, तो यह दिखाता है कि यह कैसे किया जाता है।
bryanmac

1
@KrIsHnA - नोड में एक क्वेरिस्ट्रिंग ऑब्जेक्ट है: nodejs.org/api/querystring.html और url ऑब्जेक्ट nodejs.org/docs/latest/api/url.html
bryanatac

100

नोड में सरल http.get(options, callback)फ़ंक्शन का उपयोग करने का प्रयास करें ।js:

var http = require('http');
var options = {
  host: 'www.google.com',
  path: '/index.html'
};

var req = http.get(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  // Buffer the body entirely for processing as a whole.
  var bodyChunks = [];
  res.on('data', function(chunk) {
    // You can process streamed parts here...
    bodyChunks.push(chunk);
  }).on('end', function() {
    var body = Buffer.concat(bodyChunks);
    console.log('BODY: ' + body);
    // ...and/or process the entire body here.
  })
});

req.on('error', function(e) {
  console.log('ERROR: ' + e.message);
});

एक सामान्य http.request(options, callback)फ़ंक्शन भी है जो आपको अनुरोध विधि और अन्य अनुरोध विवरण निर्दिष्ट करने की अनुमति देता है।


ओपी के लिए पूछे जाने वाले सर्वर की प्रतिक्रिया की सामग्री कहां है?
Dan Dascalescu

अद्यतन के लिए धन्यवाद। ऐसा लगता है कि एक 'अंत' हैंडलर के लिए चोंच को फिर से बदलना है। मूल रूप से @ bryanmac के उत्तर की मात्रा क्या है?
दान डस्केल्सस्कु

@DanDascalescu: हाँ, यदि आप शरीर को एक पूरे के रूप में संसाधित करना चाहते हैं (जो कि संभावना है) तो आप शायद इसे बफर करना चाहते हैं और 'एंड' पर प्रोसेस करना चाहते हैं। मैं अपने उत्तर को पूर्णता के लिए भी अपडेट करूंगा।
मैरिकिक्स

क्षमा करें, मैं यह पता नहीं लगा सकता कि कॉलबैक किन मापदंडों के साथ कहा जाता है ... मैं शरीर कैसे प्राप्त कर सकता हूं और उस पैरामीटर के मापदंडों और गुणों के लिए संदर्भ कहां है।
मुहम्मद उमर

GETअगर मैं इस url है तो मैं इस अनुरोध का उपयोग कैसे कर सकता हूं ? graph.facebook.com/debug_token? input_token={token-to-inspect} &access_token={app-token-or-admin-token}?
फ्रैंक

70

अनुरोध और अतिशयोक्ति उपयोग करने के लिए बहुत अच्छे पुस्तकालय हैं।

नोट: अनुरोध पदावनत है , अपने जोखिम पर उपयोग करें!

का उपयोग कर request:

var request=require('request');

request.get('https://someplace',options,function(err,res,body){
  if(err) //TODO: handle err
  if(res.statusCode === 200 ) //etc
  //TODO Do something with response
});

7
क्या इसे res.statusCode === 200 सेकंड में होना चाहिए? )
ग्लीब डोलज़िकोव

1
विकल्प चर क्या है? बस एक अपरिभाषित पास? मुझे इसमें संदेह है
lxknvlk

32

तुम भी उपयोग कर सकते हैं Requestify , एक बहुत शांत और बहुत सरल HTTP ग्राहक मैं NodeJS के लिए लिखा था + यह कैशिंग का समर्थन करता है।

बस GET विधि अनुरोध के लिए निम्नलिखित करें:

var requestify = require('requestify');

requestify.get('http://example.com/api/resource')
  .then(function(response) {
      // Get the response body (JSON parsed or jQuery object for XMLs)
      response.getBody();
  }
);

1
"यह अन्य उपकरण आज़माएं" एक स्वीकार्य प्रतिक्रिया नहीं है यदि मौजूदा टूलसेट पर्याप्त है।
ग्रुनियन शफेटो

9

यह संस्करण शुरू में bryanmac फ़ंक्शन द्वारा प्रस्तावित पर आधारित है जो वादों, बेहतर त्रुटि से निपटने और ES6 में फिर से लिखा गया है।

let http = require("http"),
    https = require("https");

/**
 * getJSON:  REST get request returning JSON object(s)
 * @param options: http options object
 */
exports.getJSON = function(options)
{
    console.log('rest::getJSON');
    let reqHandler = +options.port === 443 ? https : http;

    return new Promise((resolve, reject) => {
        let req = reqHandler.request(options, (res) =>
        {
            let output = '';
            console.log('rest::', options.host + ':' + res.statusCode);
            res.setEncoding('utf8');

            res.on('data', function (chunk) {
                output += chunk;
            });

            res.on('end', () => {
                try {
                    let obj = JSON.parse(output);
                    // console.log('rest::', obj);
                    resolve({
                        statusCode: res.statusCode,
                        data: obj
                    });
                }
                catch(err) {
                    console.error('rest::end', err);
                    reject(err);
                }
            });
        });

        req.on('error', (err) => {
            console.error('rest::request', err);
            reject(err);
        });

        req.end();
    });
};

परिणामस्वरूप आपको कॉलबैक फ़ंक्शन में पास नहीं होना है, इसके बजाय getJSON () एक वादा वापस करता है। निम्न उदाहरण में एक ExpressJS मार्ग हैंडलर के अंदर फ़ंक्शन का उपयोग किया जाता है

router.get('/:id', (req, res, next) => {
    rest.getJSON({
        host: host,
        path: `/posts/${req.params.id}`,
        method: 'GET'
    }).then(({status, data}) => {
        res.json(data);
    }, (error) => {
        next(error);
    });
});

त्रुटि पर यह सर्वर त्रुटि को मिडलवेयर से निपटने में त्रुटि को दर्शाता है।


1
हां, यह उदाहरण दिखा रहा है कि इसे एक्सप्रेस getरूट की परिभाषा के अंदर कैसे किया जाए , जिसमें कई पदों की कमी है।
माइक्रोकस

7

Unirest सबसे अच्छा पुस्तकालय है जो मैं नोड से HTTP अनुरोध बनाने के लिए भर में आया हूँ। यह एक मल्टीप्लायर फ्रेमवर्क होने के कारण है, इसलिए यह सीखना कि यह नोड पर कैसे काम करता है, यदि आप रूबी, पीएचपी, जावा, पायथन, ऑब्जेक्टिव सी, .नेट या विंडोज 8 पर भी HTTP क्लाइंट का उपयोग करने की आवश्यकता है तो यह आपकी अच्छी सेवा करेगा। जहाँ तक मैं बता सकता हूँ कि सबसे अनधिकृत लाइब्रेरियों को मौजूदा HTTP क्लाइंट्स (जैसे जावा पर, Apache HTTP क्लाइंट, नोड पर, मिकेल की रिक्वेस्ट लिबरी) द्वारा सपोर्ट किया जाता है - Unirest सिर्फ एक अच्छे API को शीर्ष पर रखता है।

यहाँ Node.js के लिए कुछ कोड उदाहरण दिए गए हैं:

var unirest = require('unirest')

// GET a resource
unirest.get('http://httpbin.org/get')
  .query({'foo': 'bar'})
  .query({'stack': 'overflow'})
  .end(function(res) {
    if (res.error) {
      console.log('GET error', res.error)
    } else {
      console.log('GET response', res.body)
    }
  })

// POST a form with an attached file
unirest.post('http://httpbin.org/post')
  .field('foo', 'bar')
  .field('stack', 'overflow')
  .attach('myfile', 'examples.js')
  .end(function(res) {
    if (res.error) {
      console.log('POST error', res.error)
    } else {
      console.log('POST response', res.body)
    }
  })

आप यहां सीधे नोड डॉक्स पर जा सकते हैं


3

की जाँच करें चूरे । यह एक नोड HTTP क्लाइंट है जिसे बनाया और बनाए रखा जाता है spire.io , जो रीडायरेक्ट, सत्र और JSON प्रतिक्रियाओं को संभालता है। बाकी एपीआई के साथ बातचीत करने के लिए यह बहुत अच्छा है। देखें इस ब्लॉग पोस्ट अधिक जानकारी के लिए।


3

चेक आउट कैंप की : यह एक नोड लाइब्रेरी है, जिसे मैंने बनाया है क्योंकि मैं निराश था कि वहां कोई सरल http GET या POST मॉड्यूल नहीं था ;;


0

यदि आपको केवल सरल अनुरोध प्राप्त करने की आवश्यकता है और किसी अन्य HTTP तरीकों के लिए समर्थन की आवश्यकता नहीं है, तो एक नज़र डालें: सरल-प्राप्त करें :

var get = require('simple-get');

get('http://example.com', function (err, res) {
  if (err) throw err;
  console.log(res.statusCode); // 200
  res.pipe(process.stdout); // `res` is a stream
});

0

रिक्क्लिएंट का उपयोग करें : स्क्रिप्टिंग उद्देश्य के लिए डिज़ाइन नहीं किया गया है जैसे कि requestया कई अन्य पुस्तकालय। जब आप बार-बार एक ही कॉन्फ़िगरेशन का पुन: उपयोग करने की आवश्यकता होती है, तो निर्माणक में पुनर्संयोजक कई कॉन्फ़िगरेशन को उपयोगी बताता है: बेस URL, हेडर, ऑरिजनल विकल्प, लॉगिंग विकल्प, कैशिंग, आदि। इसमें क्वेरी और URL पार्सिंग, स्वचालित क्वेरी एन्कोडिंग जैसी उपयोगी विशेषताएं भी हैं और JSON पार्सिंग, आदि।

लाइब्रेरी का उपयोग करने का सबसे अच्छा तरीका एपीआई को इंगित करने वाले ऑब्जेक्ट को निर्यात करने के लिए एक मॉड्यूल बनाना है और इसके साथ कनेक्ट करने के लिए आवश्यक कॉन्फ़िगरेशन:

मॉड्यूल client.js:

let RequestClient = require("reqclient").RequestClient

let client = new RequestClient({
  baseUrl: "https://myapp.com/api/v1",
  cache: true,
  auth: {user: "admin", pass: "secret"}
})

module.exports = client

और नियंत्रकों में जहां आपको इस तरह एपीआई उपयोग की आवश्यकता होती है:

let client = require('client')
//let router = ...

router.get('/dashboard', (req, res) => {
  // Simple GET with Promise handling to https://myapp.com/api/v1/reports/clients
  client.get("reports/clients")
    .then(response => {
       console.log("Report for client", response.userId)  // REST responses are parsed as JSON objects
       res.render('clients/dashboard', {title: 'Customer Report', report: response})
    })
    .catch(err => {
      console.error("Ups!", err)
      res.status(400).render('error', {error: err})
    })
})

router.get('/orders', (req, res, next) => {
  // GET with query (https://myapp.com/api/v1/orders?state=open&limit=10)
  client.get({"uri": "orders", "query": {"state": "open", "limit": 10}})
    .then(orders => {
      res.render('clients/orders', {title: 'Customer Orders', orders: orders})
    })
    .catch(err => someErrorHandler(req, res, next))
})

router.delete('/orders', (req, res, next) => {
  // DELETE with params (https://myapp.com/api/v1/orders/1234/A987)
  client.delete({
    "uri": "orders/{client}/{id}",
    "params": {"client": "A987", "id": 1234}
  })
  .then(resp => res.status(204))
  .catch(err => someErrorHandler(req, res, next))
})

reqclientकई विशेषताओं का समर्थन करता है, लेकिन इसमें कुछ ऐसे हैं जो अन्य पुस्तकालयों द्वारा समर्थित नहीं हैं: OAuth2 एकीकरण और लकड़हारा एकीकरण cURL सिंटैक्स के साथ , और हमेशा मूल वादा की वस्तुएं लौटाता है।


0

यदि आपको कभी भी GETअनुरोध भेजने की आवश्यकता हो और IPसाथ ही Domain(अन्य जवाबों में यह उल्लेख नहीं किया गया है कि आप एक portचर निर्दिष्ट कर सकते हैं ), तो आप इस फ़ंक्शन का उपयोग कर सकते हैं:

function getCode(host, port, path, queryString) {
    console.log("(" + host + ":" + port + path + ")" + "Running httpHelper.getCode()")

    // Construct url and query string
    const requestUrl = url.parse(url.format({
        protocol: 'http',
        hostname: host,
        pathname: path,
        port: port,
        query: queryString
    }));

    console.log("(" + host + path + ")" + "Sending GET request")
    // Send request
    console.log(url.format(requestUrl))
    http.get(url.format(requestUrl), (resp) => {
        let data = '';

        // A chunk of data has been received.
        resp.on('data', (chunk) => {
            console.log("GET chunk: " + chunk);
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', () => {
            console.log("GET end of response: " + data);
        });

    }).on("error", (err) => {
        console.log("GET Error: " + err);
    });
}

अपनी फ़ाइल के शीर्ष पर आवश्यक मॉड्यूल याद न करें:

http = require("http");
url = require('url')

यह भी ध्यान में रखते हुए कि आप httpsसुरक्षित नेटवर्क पर संचार के लिए मॉड्यूल का उपयोग कर सकते हैं । इसलिए ये दो लाइनें बदल जाएंगी:

https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......

-1
## you can use request module and promise in express to make any request ##
const promise                       = require('promise');
const requestModule                 = require('request');

const curlRequest =(requestOption) =>{
    return new Promise((resolve, reject)=> {
        requestModule(requestOption, (error, response, body) => {
            try {
                if (error) {
                    throw error;
                }
                if (body) {

                    try {
                        body = (body) ? JSON.parse(body) : body;
                        resolve(body);
                    }catch(error){
                        resolve(body);
                    }

                } else {

                    throw new Error('something wrong');
                }
            } catch (error) {

                reject(error);
            }
        })
    })
};

const option = {
    url : uri,
    method : "GET",
    headers : {

    }
};


curlRequest(option).then((data)=>{
}).catch((err)=>{
})

(जैसा कि ऐसा होता है, यह समस्या को हल नहीं करेगा। यह कोड अनुरोध के लिए सुनेगा लेकिन सवाल पूछ रहा है कि अनुरोध कैसे भेजा जाए )
क्वेंटिन

1
यह तय है, आप इसे आजमा सकते हैं। @ क्वेंटिन
इज़हार अहमद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.