Node.js Express'te HTTP GET İsteği


192

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:


220

İş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);
});

GÜNCELLEME

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:

Microsoft yazılan dinlenme istemcisi


@ bryanmac gönderebilir / eklemek komple örnek?
StErMi

@bryanmac izninizle ben şu anda inşa ediyorum bu kod grunt eklentisini kullanmak istiyorum. Ne zaman emin değilim ama tamamlandığında açık kaynaklı hale getirilecekti.
JeffH

3
o çok daha kolaydır .. istek modülü denemek sitepoint.com/making-http-requests-in-node-js
saurshaz

6
evet - istek modülü basittir ancak bu, istek modülü gibi kitaplıkların ne yaptığını gösteren daha düşük düzeydedir. Daha düşük seviye kontrolüne veya http isteklerine ihtiyacınız varsa (büyük indirmelerde ilerleme gösteriliyor vb.), Bu nasıl yapıldığını gösterir.
bryanmac

1
@KrIsHnA - düğümde bir sorgu dizesi nesnesi var: nodejs.org/api/querystring.html ve url nesnesi nodejs.org/docs/latest/api/url.html
bryanmac

100

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 .


OP'nin talep ettiği sunucunun yanıtının içeriği nerede?
Dan Dascalescu

Güncelleme için teşekkürler. Öyleyse parçaları birleştirmek için bir 'son' işleyiciye ihtiyaç var gibi görünüyor. Temel olarak @ bryanmac'ın cevabı nedir?
Dan Dascalescu

@DanDascalescu: ya, eğer vücudu bir bütün olarak işlemek istiyorsanız (muhtemelen) o zaman muhtemelen tamponlamak ve 'sonunda' işlemek istersiniz. Cevabımı eksiksiz olması için de güncelleyeceğim.
maerics

üzgünüm, geri arama ile hangi parametrelerin çağrıldığını anlayamıyorum ... nasıl vücut alabilirim ve bu parametrelerin parametreleri ve özellikleri için referans nerede.
Muhammad Umer

@maerics Bu URL'ye sahipsem bu GETisteği nasıl kullanabilirim ? graph.facebook.com/debug_token? input_token={token-to-inspect} &access_token={app-token-or-admin-token}?
frank17

70

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
});

7
Res.statusCode === 200 saniyede olmalı mı? )
Gleb Dolzikov

1
seçenekler değişkeni nedir? tanımsız olanı mı geçeceksin? i şüphe
lxknvlk

32

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();
  }
);

1
Mevcut araç seti yeterliyse "Bu diğer aracı deneyin" kabul edilebilir bir yanıt değildir.
Grunion Shaftoe

9

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.


1
Evet, bu örnek, getburadaki birçok gönderinin eksik olduğu bir Ekspres rota tanımı içinde nasıl yapılacağını göstermektedir .
Micros

7

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


3

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.


3

Httpreq göz atın : Ben orada basit bir http GET veya POST modülü ;-) orada hayal kırıklığına uğradım çünkü oluşturduğum bir düğüm kütüphanesi


0

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
});

0

Reqclient kullanın : komut dosyası oluşturma amacıyla requestveya 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))
})

reqclientbirç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.


0

Şunun yanı sıra bir GETistek göndermeniz gerekiyorsa (Diğer yanıtlar bir değişken belirtebileceğinizden bahsetmedi ), bu işlevi kullanabilirsiniz:IPDomainport

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')

httpsGü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) => { ......

-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)=>{
})

(Olduğu gibi, sorunu çözmez. Bu kod bir istek dinleyecektir, ancak soru nasıl bir istek gönderileceğini soruyor )
Quentin

1
düzeltildi, deneyebilirsiniz. @Quentin
izhar ahmad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.