मैं Node.js या Express.js के भीतर से HTTP अनुरोध कैसे कर सकता हूं? मुझे दूसरी सेवा से जुड़ने की आवश्यकता है। मुझे उम्मीद है कि कॉल अतुल्यकालिक है और कॉलबैक में दूरस्थ सर्वर की प्रतिक्रिया है।
मैं Node.js या Express.js के भीतर से HTTP अनुरोध कैसे कर सकता हूं? मुझे दूसरी सेवा से जुड़ने की आवश्यकता है। मुझे उम्मीद है कि कॉल अतुल्यकालिक है और कॉलबैक में दूरस्थ सर्वर की प्रतिक्रिया है।
जवाबों:
यहाँ मेरा एक नमूना से कुछ कोड का एक टुकड़ा है। यह अतुल्यकालिक है और एक 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 क्लाइंट बनाया जो उस बिल को फिट करता है:
नोड में सरल 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)
फ़ंक्शन भी है जो आपको अनुरोध विधि और अन्य अनुरोध विवरण निर्दिष्ट करने की अनुमति देता है।
GET
अगर मैं इस url है तो मैं इस अनुरोध का उपयोग कैसे कर सकता हूं ? graph.facebook.com/debug_token? input_token={token-to-inspect} &access_token={app-token-or-admin-token}
?
अनुरोध और अतिशयोक्ति उपयोग करने के लिए बहुत अच्छे पुस्तकालय हैं।
नोट: अनुरोध पदावनत है , अपने जोखिम पर उपयोग करें!
का उपयोग कर 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
});
तुम भी उपयोग कर सकते हैं 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();
}
);
यह संस्करण शुरू में 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);
});
});
त्रुटि पर यह सर्वर त्रुटि को मिडलवेयर से निपटने में त्रुटि को दर्शाता है।
get
रूट की परिभाषा के अंदर कैसे किया जाए , जिसमें कई पदों की कमी है।
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)
}
})
आप यहां सीधे नोड डॉक्स पर जा सकते हैं
की जाँच करें चूरे । यह एक नोड HTTP क्लाइंट है जिसे बनाया और बनाए रखा जाता है spire.io , जो रीडायरेक्ट, सत्र और JSON प्रतिक्रियाओं को संभालता है। बाकी एपीआई के साथ बातचीत करने के लिए यह बहुत अच्छा है। देखें इस ब्लॉग पोस्ट अधिक जानकारी के लिए।
यदि आपको केवल सरल अनुरोध प्राप्त करने की आवश्यकता है और किसी अन्य 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
});
रिक्क्लिएंट का उपयोग करें : स्क्रिप्टिंग उद्देश्य के लिए डिज़ाइन नहीं किया गया है जैसे कि 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 सिंटैक्स के साथ , और हमेशा मूल वादा की वस्तुएं लौटाता है।
यदि आपको कभी भी 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) => { ......
## 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)=>{
})