Özellik ikonu

WinHttpRequest

İndirme izni yok

Genel Bakış

WinHttpRequest (WinHTTP WinHttpRequest), Windows'un WinHTTP hizmetini VBA'dan kullanmanızı sağlayan COM nesnesidir. Bir web sunucusuna GET, POST gibi istekler göndermenize, başlık ve zaman aşımı ayarlamanıza ve gelen yanıtı (durum kodu, başlıklar, metin ya da ikili veri) okumanıza yarar. Excel'in kendi nesne modelinde yer almaz; dışarıdan oluşturulur ve genellikle web servislerinden veri çekmek ya da bir hizmete veri göndermek için kullanılır.

Nesneyi oluşturma​

Nesne iki şekilde kullanılabilir. Geç bağlama (late binding) ile başvuru eklemeden çalışır ve başka bilgisayarlarda sorun çıkarma olasılığı düşüktür. Erken bağlama (early binding) için VBA düzenleyicisinde Araçlar > Başvurular (Tools > References) penceresinden Microsoft WinHTTP Services, version 5.1 seçilir; böylece IntelliSense ve WithEvents desteği kazanılır.

Geç bağlama:
VBA 2 satır
Dim http As Object
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
Erken bağlama:
VBA 2 satır
Dim http As WinHttp.WinHttpRequest
Set http = New WinHttp.WinHttpRequest
Tipik kullanım sırası her zaman aynıdır: Open ile yöntem ve adres belirtilir, gerekiyorsa SetRequestHeader ile başlıklar eklenir, Send ile istek gönderilir, ardından Status ve ResponseText okunur.

Önemli özellikler​

  • Status: Sunucunun döndürdüğü sayısal HTTP durum kodu (200, 404, 500 gibi). Salt okunur.
  • StatusText: Durum kodunun metin karşılığı (örneğin OK). Salt okunur.
  • ResponseText: Yanıt gövdesinin metin olarak karşılığı. Karakter kodlaması sunucunun bildirdiği karakter kümesine göre çözülür.
  • ResponseBody: Yanıt gövdesi bayt dizisi (Variant) olarak. Dosya indirme ve UTF-8 dönüştürme işlerinde kullanılır.
  • ResponseStream: Yanıtı IStream arayüzü olarak verir; ADODB.Stream ile birlikte kullanılabilir.
  • Option: Dizinle erişilen seçenekler. Örneğin 0 kullanıcı aracısı (User-Agent) dizesi, 4 SSL hata yoksayma bayrakları, 6 yönlendirmelerin otomatik izlenmesi anlamına gelir.

Önemli yöntemler ve olaylar​

  • Open Yöntem, Adres, [Eşzamansız]: İsteği hazırlar. Yöntem "GET", "POST" gibi bir metindir. Üçüncü parametre isteğe bağlıdır, varsayılanı False'tur (eşzamanlı).
  • SetRequestHeader Başlık, Değer: Open'dan sonra, Send'den önce çağrılır. POST için çoğunlukla Content-Type başlığı gerekir.
  • Send [Gövde]: İsteği gönderir. Gövde isteğe bağlıdır; POST ile gönderilecek metin ya da bayt dizisi buraya yazılır.
  • GetResponseHeader(Başlık): Tek bir yanıt başlığının değerini verir.
  • GetAllResponseHeaders: Tüm yanıt başlıklarını tek metin olarak verir.
  • SetTimeouts Çözümleme, Bağlanma, Gönderme, Alma: Dört zaman aşımını milisaniye olarak ayarlar.
  • WaitForResponse(Zaman aşımı): Eşzamansız istekte yanıtı bekler; saniye cinsinden süre verilir.
  • Abort: Süren isteği iptal eder.
  • SetCredentials, SetProxy: Kimlik bilgisi ve vekil sunucu ayarları içindir.
Erken bağlamada WithEvents ile tanımlanan nesne için OnResponseStart, OnResponseDataAvailable, OnResponseFinished ve OnError olayları kullanılabilir. Bu olaylar yalnız eşzamansız isteklerde anlamlıdır.

Zaman aşımı ve kodlama​

SetTimeouts çağrılmazsa varsayılan değerler geçerlidir: çözümleme için sınırsız, bağlanma için 60000, gönderme için 30000, alma için 30000 milisaniye. Yanıt gelmeyen bir sunucuda Excel uzun süre donmuş gibi görünebileceğinden kısa değerler vermeniz önerilir.

Sunucu UTF-8 gönderdiği halde karakter kümesi başlıkta belirtilmemişse ResponseText Türkçe karakterleri bozuk gösterebilir. Bu durumda ResponseBody bayt dizisi ADODB.Stream nesnesine yazılıp Charset özelliği "utf-8" yapılarak metne çevrilir.

1. Sunucuya GET isteği gönderme​

Sayfada A2 hücresinde sunucu adı, B2 hücresinde yol bulunur. Kodu standart modüle yapıştırın; adres kod içinde parçalardan birleştirilir. Makro durum kodunu, durum metnini ve yanıt uzunluğunu C2:E2 hücrelerine yazar. Bu örnek ağ bağlantısı gerektirdiği için burada çalıştırılmaz.
VBA 26 satır
Option Explicit

Sub SunucuyaSor()
    Dim http As Object
    Dim adres As String

    ' Adres, sunucu ve yol hücrelerinden birleştirilir
    adres = "https" & ":" & "//" & Range("A2").Value & Range("B2").Value

    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
    On Error GoTo Hata

    ' Çözümleme, bağlanma, gönderme, alma süreleri (milisaniye)
    http.SetTimeouts 5000, 5000, 10000, 15000
    http.Open "GET", adres, False
    http.SetRequestHeader "Accept", "text/plain"
    http.Send

    Range("C2").Value = http.Status
    Range("D2").Value = http.StatusText
    Range("E2").Value = Len(http.ResponseText)
    Exit Sub

Hata:
    Range("D2").Value = "Hata: " & Err.Description
End Sub
WinHttpRequest
Formülünü incelemek için bir hücre seçin.
ABCDE
1SunucuYolDurum KoduDurum MetniYanıt Uzunluğu
2sunucu.ornek/urunler
Sunucu SorgusuExcelDepo v1.0.0
Makro çalıştığında sunucu yanıt verirse C2 hücresine durum kodu, D2 hücresine durum metni, E2 hücresine yanıt metninin karakter sayısı yazılır. Bağlantı kurulamazsa On Error sayesinde makro durmaz ve D2 hücresinde hata açıklaması görünür. Örnekteki sunucu adı kurgusaldır; kendi sunucu adınızı ve yolunuzu yazarak deneyin.

2. Yanıt metnini satırlara ve alanlara ayırma​

Gerçek bir yanıt yerine, ResponseText ile gelebilecek noktalı virgülle ayrılmış üç satırlık bir metin kod içinde tanımlanır. Kodu standart modüle yapıştırın. Makro metni satırlara, satırları alanlara böler ve A2:C4 aralığına yazar.
VBA 22 satır
Option Explicit

Sub YaniAyristir()
    Dim yanit As String
    Dim satirlar() As String
    Dim alanlar() As String
    Dim i As Long

    ' ResponseText ile gelebilecek örnek yanıt
    yanit = "Ankara;18;Güneşli" & vbLf & "İzmir;24;Açık" & vbLf & "Trabzon;15;Yağmurlu"

    ' Bazı sunucular satır sonu olarak vbCrLf gönderir; önce vbLf'ye çeviriyoruz
    yanit = Replace(yanit, vbCrLf, vbLf)

    satirlar = Split(yanit, vbLf)
    For i = 0 To UBound(satirlar)
        alanlar = Split(satirlar(i), ";")
        Cells(i + 2, 1).Value = alanlar(0)
        Cells(i + 2, 2).Value = CLng(alanlar(1))
        Cells(i + 2, 3).Value = alanlar(2)
    Next i
End Sub
WinHttpRequest
Formülünü incelemek için bir hücre seçin.
ABC
1ŞehirSıcaklıkDurum
2Ankara18Güneşli
3İzmir24Açık
4Trabzon15Yağmurlu
Hava YanıtıExcelDepo v1.0.0
Makro çalışınca A2 hücresine Ankara, B2 hücresine 18, C2 hücresine Güneşli yazılır; diğer iki satır da aynı biçimde doldurulur. Sıcaklık değeri CLng ile sayıya çevrildiği için B sütunu sayı olarak tutulur ve hesaplamalarda kullanılabilir. Gerçek bir istekte yanit değişkenine http.ResponseText atanır, ayrıştırma kısmı aynı kalır.

3. Durum kodlarını yorumlama​

Bir istekten dönebilecek HTTP durum kodları A sütununda listelenmiştir. Kodu standart modüle yapıştırın. Makro her kod için bir açıklama ve isteğin yeniden denenip denenmeyeceğini B ve C sütunlarına yazar. Aynı işlev, gerçek isteklerde http.Status değerini yorumlamak için de kullanılabilir.
VBA 34 satır
Option Explicit

Function KodAciklama(ByVal kod As Long) As String
    Select Case kod
        Case 200
            KodAciklama = "Başarılı"
        Case 301, 302
            KodAciklama = "Yönlendirme"
        Case 404
            KodAciklama = "Bulunamadı"
        Case 429
            KodAciklama = "Çok fazla istek"
        Case Is >= 500
            KodAciklama = "Sunucu hatası"
        Case Else
            KodAciklama = "Diğer"
    End Select
End Function

Sub DurumKodlariniYorumla()
    Dim i As Long
    Dim kod As Long

    For i = 2 To 7
        kod = Cells(i, 1).Value
        Cells(i, 2).Value = KodAciklama(kod)
        ' 429 ve 5xx kodlarında bir süre sonra yeniden denemek mantıklıdır
        If kod = 429 Or kod >= 500 Then
            Cells(i, 3).Value = "Evet"
        Else
            Cells(i, 3).Value = "Hayır"
        End If
    Next i
End Sub
WinHttpRequest
Formülünü incelemek için bir hücre seçin.
ABC
1Durum KoduAnlamYeniden Dene
2200BaşarılıHayır
3301YönlendirmeHayır
4404BulunamadıHayır
5429Çok fazla istekEvet
6500Sunucu hatasıEvet
7503Sunucu hatasıEvet
Durum KodlarıExcelDepo v1.0.0
200 kodu için B2 hücresinde Başarılı, 404 kodu için B4 hücresinde Bulunamadı görünür. 429 kodunun yeniden deneme durumu C5 hücresinde Evet, 503 kodunun açıklaması B7 hücresinde Sunucu hatası olarak yazılır. Gerçek bir istekte WinHttpRequest hata durumlarında da (404, 500 gibi) hata üretmez; Status değerini siz kontrol etmelisiniz.

Kullanırken dikkat edin​

  • Durum kodunu mutlaka kontrol edin: WinHttpRequest, sunucu 404 ya da 500 döndürdüğünde VBA hatası oluşturmaz. Hata yalnız ağ düzeyinde sorun (adres çözülemedi, zaman aşımı gibi) olduğunda oluşur. ResponseText'i kullanmadan önce Status değerinin 200 olup olmadığına bakın.
  • Zaman aşımı ayarlayın: Varsayılan sürelerle yanıt vermeyen bir sunucuda Excel dakikalarca yanıtsız kalabilir. SetTimeouts ile kısa süreler verin ve çağrıyı On Error ile koruyun.
  • Türkçe karakter sorunları: ResponseText'te ğ, ş, İ gibi harfler bozuk görünüyorsa sunucu karakter kümesini bildirmiyor olabilir. ResponseBody bayt dizisini ADODB.Stream ile utf-8 olarak çözün. Gönderdiğiniz POST gövdesinde de Türkçe karakter varsa gövdeyi UTF-8 olarak kodlayıp Content-Type başlığında charset belirtin.
  • Çağrı sırası önemlidir: SetRequestHeader yalnız Open çağrıldıktan sonra ve Send çağrılmadan önce kullanılabilir. Sıra bozulursa çalışma zamanı hatası alırsınız.
  • Eşzamanlı ve eşzamansız istek: Open'ın üçüncü parametresi False iken (varsayılan) Send yanıt gelene kadar makroyu bekletir. True verirseniz Send hemen döner; sonucu WaitForResponse ile beklemeniz ya da WithEvents ile olayları izlemeniz gerekir.
  • Platform ve güvenlik: WinHttpRequest Windows'a özgüdür; Mac için Excel'de çalışmaz. SSL sertifika hatalarını Option(4) ile yoksaymak güvenliği düşürür, yalnız denetlediğiniz test ortamlarında kullanın. Kurumsal güvenlik yazılımları bu tür nesnelerin oluşturulmasını engelleyebilir.
  • İlgili konular: CreateObject işlevi, MSXML2.XMLHTTP nesnesi, ADODB.Stream nesnesi, Split işlevi, Replace işlevi, Select Case deyimi, On Error deyimi, WithEvents anahtar sözcüğü, Araçlar > Başvurular (Tools > References) penceresi, METNEBÖL ve PARÇAAL gibi metin işlevleri.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
11
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst