node.js http 'क्वेरी स्ट्रिंग मापदंडों के साथ' अनुरोध मिलता है


84

मेरे पास एक Node.js एप्लिकेशन है जो http क्लाइंट है (फिलहाल)। तो मैं कर रहा हूँ:

var query = require('querystring').stringify(propertiesObject);
http.get(url + query, function(res) {
   console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
    console.log("Got error: " + e.message);
});

इसे पूरा करने के लिए एक अच्छा पर्याप्त तरीका लगता है। हालाँकि मैं कुछ हद तक miffed हूं कि मुझे यह url + queryकदम उठाना था। यह एक आम पुस्तकालय द्वारा समझाया जाना चाहिए, लेकिन मैं इसे नोड के httpपुस्तकालय में अभी तक नहीं देखता हूं और मुझे यकीन नहीं है कि मानक एनपीएम पैकेज इसे पूरा कर सकता है। वहाँ एक काफी व्यापक रूप से इस्तेमाल तरीका है कि बेहतर है?

url.format मेथड अपने URL बनाने के काम को बचाता है। लेकिन आदर्श रूप से अनुरोध इस से भी उच्च स्तर का होगा।



जवाबों:


158

की जाँच करें अनुरोध मॉड्यूल।

यह नोड के अंतर्निहित http क्लाइंट से अधिक पूर्ण विशेषताओं वाला है।

var request = require('request');

var propertiesObject = { field1:'test1', field2:'test2' };

request({url:url, qs:propertiesObject}, function(err, response, body) {
  if(err) { console.log(err); return; }
  console.log("Get response: " + response.statusCode);
});

एक विशिष्ट गुण कैसे दिखेगा। मुझे यह काम करने के लिए नहीं मिल सकता है
user264230

3
Qs क्वेरी स्ट्रिंग कुंजी है। तो क्या आप कभी भी क्वेरी स्ट्रिंग में फ़ील्ड चाहते हैं। {फ़ील्ड 1: 'टेस्ट 1', फील्ड 2: 'टेस्ट 2'}
डैनियल

किसी को भी पता है कि यह सिर्फ नोड्सज कोर http मॉड्यूल के साथ कैसे करना है?
अलेक्जेंडर मिल्स

1
@AlexanderMills मेरा जवाब देखें। एक 3 पार्टी पुस्तकालय आवश्यक नहीं है।
जस्टिन मीनर्स

9
अनुरोध मॉड्यूल अब दिनांकित और पदावनत है।
आमीनदिमी

19

3 पार्टी लाइब्रेरी के लिए कोई ज़रूरत नहीं है। क्वेरी पैरामीटर के साथ URL बनाने के लिए नोडज url मॉड्यूल का उपयोग करें :

const requestUrl = url.parse(url.format({
    protocol: 'https',
    hostname: 'yoursite.com',
    pathname: '/the/path',
    query: {
        key: value
    }
}));

फिर प्रारूपित url के साथ अनुरोध करें। requestUrl.pathक्वेरी पैरामीटर शामिल होंगे।

const req = https.get({
    hostname: requestUrl.hostname,
    path: requestUrl.path,
}, (res) => {
   // ...
})

मैं इस समाधान का उपयोग करने का प्रयास करने जा रहा हूं क्योंकि मैं कुछ मौजूदा कोड का उपयोग करना चाहूंगा जो बिल्ट-इन का उपयोग करता है https, हालांकि ओपी ने प्रश्नों के साथ यूआरएल स्ट्रिंग्स की रचना के लिए उच्च-स्तरीय अमूर्त और / या पुस्तकालयों के लिए कहा है, इसलिए मुझे लगता है कि स्वीकृत उत्तर व्यक्तिगत रूप से अधिक मान्य है
स्कॉट एंडरसन

3
@ScottAnderson मैं ठीक हूँ अगर मैं स्वीकृत उत्तर नहीं हूँ। बस लोगों को वह करने में मदद करना चाहते हैं जो उन्हें चाहिए। खुशी है कि यह आपकी मदद कर सकता है।
जस्टिन मेनर्स

6

यदि आप बाहरी पैकेज का उपयोग नहीं करना चाहते हैं, तो अपनी उपयोगिताओं में निम्न फ़ंक्शन जोड़ें:

var params=function(req){
  let q=req.url.split('?'),result={};
  if(q.length>=2){
      q[1].split('&').forEach((item)=>{
           try {
             result[item.split('=')[0]]=item.split('=')[1];
           } catch (e) {
             result[item.split('=')[0]]='';
           }
      })
  }
  return result;
}

फिर, में createServerकॉल बैक, विशेषता जोड़ने paramsके लिए requestवस्तु:

 http.createServer(function(req,res){
     req.params=params(req); // call the function above ;
      /**
       * http://mysite/add?name=Ahmed
       */
     console.log(req.params.name) ; // display : "Ahmed"

})

2
ओपी का प्रश्न http क्लाइंट्स की चिंता करता है, न कि http सर्वरों की। यह उत्तर एक HTTP सर्वर में क्वेरी स्ट्रिंग को पार्स करने के लिए प्रासंगिक है, एक HTTP अनुरोध के लिए क्वेरी स्ट्रिंग को एन्कोडिंग नहीं।
स्टीफन स्काउब

यह सवाल क्या पूछ रहा था, इसके विपरीत कर रहा है, और यह भी बेहतर है कि नोड के अंतर्निहित querystringमॉड्यूल का उपयोग करने के बजाय यह खुद को पार्स करने की कोशिश कर रहा है।
पेट्रिग्नन

6

मैं अपने URL में क्वेरी स्ट्रिंग पैरामीटर जोड़ने के तरीके से जूझ रहा हूं। जब तक मुझे एहसास नहीं हुआ कि मुझे ?अपने URL के अंत में जोड़ने की आवश्यकता है, तब तक मैं इसे काम नहीं कर सकता , अन्यथा यह काम नहीं करेगा। यह बहुत महत्वपूर्ण है क्योंकि यह आपको डिबगिंग के घंटों को बचाएगा, मेरा विश्वास करें: वहां ... किया गया

नीचे, एक साधारण एपीआई एंडपॉइंट है जो ओपन वेदर एपीआई को कॉल करता है और पास होता है APPID, latऔर lonक्वेरी पैरामीटर के रूप में और मौसम डेटा को JSONऑब्जेक्ट के रूप में वापस करता है । उम्मीद है की यह मदद करेगा।

//Load the request module
var request = require('request');

//Load the query String module
var querystring = require('querystring');

// Load OpenWeather Credentials
var OpenWeatherAppId = require('../config/third-party').openWeather;

router.post('/getCurrentWeather', function (req, res) {
    var urlOpenWeatherCurrent = 'http://api.openweathermap.org/data/2.5/weather?'
    var queryObject = {
        APPID: OpenWeatherAppId.appId,
        lat: req.body.lat,
        lon: req.body.lon
    }
    console.log(queryObject)
    request({
        url:urlOpenWeatherCurrent,
        qs: queryObject
    }, function (error, response, body) {
        if (error) {
            console.log('error:', error); // Print the error if one occurred

        } else if(response && body) {
            console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
            res.json({'body': body}); // Print JSON response.
        }
    })
})  

या यदि आप querystringमॉड्यूल का उपयोग करना चाहते हैं , तो निम्नलिखित परिवर्तन करें

var queryObject = querystring.stringify({
    APPID: OpenWeatherAppId.appId,
    lat: req.body.lat,
    lon: req.body.lon
});

request({
   url:urlOpenWeatherCurrent + queryObject
}, function (error, response, body) {...})

1

यदि आपको कभी भी 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सुरक्षित नेटवर्क पर संचार के लिए मॉड्यूल का उपयोग कर सकते हैं ।

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