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.
Geç bağlama:
Erken bağlama:
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.
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.
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.
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.
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.
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")
VBA
2 satır
Dim http As WinHttp.WinHttpRequest
Set http = New WinHttp.WinHttpRequest
Ö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.
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.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Sunucu | Yol | Durum Kodu | Durum Metni | Yanıt Uzunluğu |
| 2 | sunucu.ornek | /urunler |
Sunucu SorgusuExcelDepo v1.0.0
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.| A | B | C | |
|---|---|---|---|
| 1 | Şehir | Sıcaklık | Durum |
| 2 | Ankara | 18 | Güneşli |
| 3 | İzmir | 24 | Açık |
| 4 | Trabzon | 15 | Yağmurlu |
Hava YanıtıExcelDepo v1.0.0
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.| A | B | C | |
|---|---|---|---|
| 1 | Durum Kodu | Anlam | Yeniden Dene |
| 2 | 200 | Başarılı | Hayır |
| 3 | 301 | Yönlendirme | Hayır |
| 4 | 404 | Bulunamadı | Hayır |
| 5 | 429 | Çok fazla istek | Evet |
| 6 | 500 | Sunucu hatası | Evet |
| 7 | 503 | Sunucu hatası | Evet |
Durum KodlarıExcelDepo v1.0.0
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.