farkmt2official 1
farkmt2official
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Bvural41 1
Bvural41
Hikaye Ekle

[NODE JS] http.get ile Başka API'ye İstek Atma

nodejs.png


[NODE JS] http.get ile Başka API'ye İstek Atma​


Node.js uygulamalarında sıklıkla dış API'lere istek atmamız gerekiyor. Hava durumu verisi çekmek, ödeme işlemi yapmak, sosyal medya entegrasyonu kurmak... Bunların hepsi dış API'lere yapılan HTTP istekleriyle gerçekleşiyor. Node.js'in built-in http ve https modülleri ile bu istekleri herhangi bir ek paket kurmadan yapabilirsiniz.

http.get metodu GET istekleri için kısayol sağlayan bir fonksiyon. http.request'in daha basit bir versiyonu diyebiliriz. Otomatik olarak metodu GET yapar ve req.end() çağırır. Yani siz sadece URL'yi verip callback'te gelen veriyi okuyorsunuz.

Ben kariyerimde ilk dış API entegrasyonunu yaparken çok zorlanmıştım. Response'un chunk'lar halinde geldiğini bilmiyordum ve sadece ilk chunk'ı alıp response tamamlandı sanıyordum. Veri yarım geliyordu, JSON parse etmeye çalışınca hata alıyordum. O deneyimden sonra her zaman tüm chunk'ları birleştirip, 'end' event'inde parse etmeyi öğrendim.

http.get ile istek yaparken response bir stream olarak gelir. Her data event'inde bir chunk alırsınız ve bunları birleştirmeniz gerekir. End event'i geldiğinde tüm veri gelmiş demektir ve o zaman parse edebilirsiniz. Hata yönetimi de çok önemli. Hem request hem response seviyesinde error event'lerini dinlemeniz lazım. Ağ bağlantısı koparsa, DNS çözümlemesi başarısız olursa veya timeout olursa bu hatalar tetiklenir.

HTTPS API'lerine istek atarken http modülü yerine https modülünü kullanmanız gerekiyor. API'nin adresi https ile başlıyorsa https.get kullanmalısınız, aksi halde bağlantı hatası alırsınız. Bu çok sık yapılan bir hata, dikkat edin.

Status code kontrolü de çok önemli. API 200 dışında bir kod dönebilir: 404, 500, 429 (rate limit) gibi. Gelen response'un statusCode'unu mutlaka kontrol edin. 3xx kodları redirect anlamına gelir ve http.get bunları otomatik takip etmez. Redirect'leri manuel olarak takip etmeniz ya da bunun için bir paket kullanmanız gerekir.

Timeout ayarı da kritik bir konu. Varsayılan olarak Node.js'te HTTP isteklerinde timeout yoktur. Yani API cevap vermezse uygulamanız sonsuza dek bekleyebilir. setTimeout veya request.setTimeout ile mutlaka bir timeout süresi belirleyin. Ben genellikle 10-15 saniye timeout kullanıyorum.

Gerçek projelerde http.get yerine genellikle axios, node-fetch veya got gibi paketler kullanılır. Bunlar Promise tabanlı çalışır, otomatik JSON parse eder, redirect takip eder ve interceptor desteği sunar. Ama built-in modülleri bilmek çok önemli çünkü bu paketlerin altında da aynı mekanizma çalışıyor. Sorun çıktığında debug edebilmek için temelini bilmeniz gerekiyor.

Birden fazla API'ye paralel istek atmanız gereken durumlar da olacak. Promise.all ile bunu kolayca yapabilirsiniz. Her isteği bir Promise'e sarmalayıp hepsini Promise.all'a verirsiniz. Bu sayede istekler paralel olarak gider ve hepsi tamamlandığında sonuçları alırsınız. Sıralı istek yapmak istiyorsanız async/await ile for döngüsü kullanabilirsiniz.

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

// Basit bir GET istegi - JSONPlaceholder API
function fetchUsers() {{
  return new Promise((resolve, reject) => {{
    https.get('https://jsonplaceholder.typicode.com/users', (res) => {{
      let data = '';

      // Status code kontrolu
      if (res.statusCode !== 200) {{
        reject(new Error(`API hata dondurdu: ${{res.statusCode}}`));
        res.resume(); // response'u tuket ki memory leak olmasin
        return;
      }}

      // Content-Type kontrolu
      const contentType = res.headers['content-type'];
      if (!contentType || !contentType.includes('application/json')) {{
        reject(new Error(`Beklenmeyen content-type: ${{contentType}}`));
        res.resume();
        return;
      }}

      // Verileri chunk chunk topla
      res.on('data', (chunk) => {{
        data += chunk;
      }});

      // Tum veri geldiginde parse et
      res.on('end', () => {{
        try {{
          const parsed = JSON.parse(data);
          resolve(parsed);
        }} catch (err) {{
          reject(new Error(`JSON parse hatasi: ${{err.message}}`));
        }}
      }});
    }}).on('error', (err) => {{
      reject(new Error(`Istek hatasi: ${{err.message}}`));
    }});
  }});
}}

// Timeout ve ozel header'larla istek
function fetchWithOptions(url, timeoutMs = 10000) {{
  return new Promise((resolve, reject) => {{
    const parsedUrl = new URL(url);
    const client = parsedUrl.protocol === 'https:' ? https : http;

    const options = {{
      hostname: parsedUrl.hostname,
      port: parsedUrl.port,
      path: parsedUrl.pathname + parsedUrl.search,
      method: 'GET',
      headers: {{
        'Accept': 'application/json',
        'User-Agent': 'NodeJS-Egitim/1.0',
      }},
      timeout: timeoutMs,
    }};

    const req = client.request(options, (res) => {{
      let data = '';

      // Redirect kontrolu
      if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {{
        console.log(`Redirect: ${{res.statusCode}} -> ${{res.headers.location}}`);
        fetchWithOptions(res.headers.location, timeoutMs)
          .then(resolve)
          .catch(reject);
        return;
      }}

      res.setEncoding('utf8');
      res.on('data', (chunk) => {{ data += chunk; }});
      res.on('end', () => {{
        try {{
          resolve({{
            status: res.statusCode,
            headers: res.headers,
            data: JSON.parse(data),
          }});
        }} catch (e) {{
          resolve({{ status: res.statusCode, headers: res.headers, data }});
        }}
      }});
    }});

    req.on('timeout', () => {{
      req.destroy();
      reject(new Error(`Istek zaman asimina ugradi: ${{timeoutMs}}ms`));
    }});

    req.on('error', (err) => {{
      reject(new Error(`Baglanti hatasi: ${{err.message}}`));
    }});

    req.end();
  }});
}}

// Kullanim
async function main() {{
  try {{
    console.log('Kullanicilar getiriliyor...');
    const users = await fetchUsers();
    console.log(`${{users.length}} kullanici bulundu:`);
    users.forEach(u => console.log(`  - ${{u.name}} (${{u.email}})`));

    console.log('\nOzel istekle veri cekiliyor...');
    const result = await fetchWithOptions(
      'https://jsonplaceholder.typicode.com/posts?userId=1'
    );
    console.log(`Status: ${{result.status}}, ${{result.data.length}} post bulundu`);
  }} catch (err) {{
    console.error('Hata:', err.message);
  }}
}}

main();

Dış API'lere istek atarken rate limiting'e dikkat edin. Çoğu API dakikada veya saatte belirli sayıda istek yapmanıza izin verir. Bu limitleri aşarsanız 429 Too Many Requests hatası alırsınız. Retry mekanizması kurarken exponential backoff kullanmanızı tavsiye ederim.
 
Emeğiniz ve katkınız için teşekkür ederiz!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar! 🎉
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst