Node.js veya Express.js içinden nasıl HTTP isteği yapabilirim? Başka bir hizmete bağlanmam gerekiyor. Arama zaman uyumsuz ve geri arama uzak sunucunun yanıt içeriyor umuyoruz.
Node.js veya Express.js içinden nasıl HTTP isteği yapabilirim? Başka bir hizmete bağlanmam gerekiyor. Arama zaman uyumsuz ve geri arama uzak sunucunun yanıt içeriyor umuyoruz.
Yanıtlar:
İşte benim bir örnekten bazı kod parçacığı. Eşzamansızdır ve bir JSON nesnesi döndürür. Herhangi bir GET isteğini yapabilir.
Daha uygun yolların (sadece bir örnek) olduğunu unutmayın - örneğin, bir diziye koyduğunuz parçaları birleştirmek ve diziye katılmak vb. ... Umarım, doğru yönde başlamanızı sağlar:
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();
};
Buna aşağıdakiler gibi bir seçenekler nesnesi oluşturarak çağrılır:
const options = {
host: 'somesite.com',
port: 443,
path: '/some/path',
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
};
Ve bir geri arama işlevi sağlamak.
Örneğin, bir hizmette, yukarıdaki REST modülüne gereksinim duyuyorum ve sonra bunu yapıyorum:
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);
});
Eğer arıyorsanız async
/ await
(doğrusal, hiçbir geri arama), vaat, derleme zamanı desteği ve intellisense, biz hafif HTTP ve DİNLENME istemcisi yarattığı krizleri o fatura:
Node.js dosyasındaki basit http.get(options, callback)
işlevi kullanmayı deneyin :
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);
});
İstek yöntemini ve diğer istek ayrıntılarını belirtmenize izin veren genel bir http.request(options, callback)
işlev de vardır .
GET
isteği nasıl kullanabilirim ? graph.facebook.com/debug_token? input_token={token-to-inspect} &access_token={app-token-or-admin-token}
?
Request ve Superagent kullanımı oldukça iyi kütüphanelerdir.
not: istek kullanımdan kaldırıldı , risk altında kullanın!
Kullanma 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
});
Ayrıca kullanabilirsiniz Requestify , ben nodeJS için yazdığı gerçekten serin ve çok basit bir HTTP istemcisi + önbelleğe almayı destekler.
GET yöntemi isteği için aşağıdakileri yapmanız yeterlidir:
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();
}
);
Bu sürüm başlangıçta vaatler kullanan, daha iyi hata işleme ve ES6'da yeniden yazılan bryanmac işlevi tarafından önerilmiştir .
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();
});
};
Sonuç olarak, geri arama işlevini iletmeniz gerekmez, bunun yerine getJSON () bir vaat döndürür. Aşağıdaki örnekte işlev, ExpressJS yol işleyicisinin içinde kullanılır
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);
});
});
Hata durumunda hatayı sunucu hatası işleme sunucu hatasına devreder.
get
buradaki birçok gönderinin eksik olduğu bir Ekspres rota tanımı içinde nasıl yapılacağını göstermektedir .
Unirest , Düğümden HTTP istekleri yapmak için karşılaştığım en iyi kütüphane. Çok platformlu bir çerçeve olmayı hedefliyor, bu yüzden Ruby, PHP, Java, Python, Objective C, .Net veya Windows 8'de bir HTTP istemcisi kullanmanız gerekiyorsa Node üzerinde nasıl çalıştığını öğrenmek size iyi hizmet edecektir. Unirest kitaplıklar çoğunlukla mevcut HTTP istemcileri tarafından desteklenmektedir (örneğin Java, Apache HTTP istemcisi, Düğüm üzerinde, Mikeal's İstek libary) - Unirest sadece daha güzel bir API koyar.
İşte Node.js için birkaç kod örneği:
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)
}
})
Burada doğrudan Düğüm belgelerine atlayabilirsiniz
Check parçalamak . Yönlendirmeleri, oturumları ve JSON yanıtlarını işleyen spire.io tarafından oluşturulan ve sürdürülen bir düğüm HTTP istemcisidir . Geri kalan API'lerle etkileşim kurmak için mükemmeldir. Daha fazla ayrıntı için bu blog yayınına bakın.
Sadece basit alma istekleri yapmanız gerekiyorsa ve diğer HTTP yöntemleri için desteğe ihtiyacınız yoksa şu adrese bir göz atın: simple-get :
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
});
Reqclient kullanın : komut dosyası oluşturma amacıyla request
veya diğer birçok kitaplık için tasarlanmamıştır . Reqclient, yapıcıda aynı yapılandırmayı tekrar tekrar kullanmanız gerektiğinde yararlı birçok yapılandırma belirtmenize izin verir: temel URL, başlıklar, kimlik doğrulama seçenekleri, günlük seçenekleri, önbellekleme, vb. Ayrıca sorgu ve URL ayrıştırma, otomatik sorgu kodlama ve JSON ayrıştırma vb.
Kütüphaneyi kullanmanın en iyi yolu, API'yi işaret eden nesneyi ve bağlanmak için gerekli yapılandırmaları dışa aktarmak için bir modül oluşturmaktır:
Modül 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
Ve API kullanımını şu şekilde kullanmanız gereken kontrolörlerde:
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
birçok özelliği destekler, ancak diğer kütüphaneler tarafından desteklenmeyen bazı özelliklere sahiptir: cURL sözdizimi ile OAuth2 entegrasyonu ve logger entegrasyonu ve her zaman yerel Promise nesnelerini döndürür.
Şunun yanı sıra bir GET
istek göndermeniz gerekiyorsa (Diğer yanıtlar bir değişken belirtebileceğinizden bahsetmedi ), bu işlevi kullanabilirsiniz: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);
});
}
Dosyanızın üst kısmında modül istemeyi kaçırmayın:
http = require("http");
url = require('url')
https
Güvenli ağ üzerinden iletişim kurmak için modülü kullanabileceğinizi de unutmayın . böylece bu iki çizgi değişecektir:
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)=>{
})