VBA kullanarak Excel'den bir sunucuya nasıl HTTP POST isteği gönderebilirim?


Yanıtlar:


147
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.send("")

Alternatif olarak, HTTP isteği üzerinde daha fazla kontrol için kullanabileceğiniz WinHttp.WinHttpRequest.5.1yerine MSXML2.ServerXMLHTTP.


9
HTTP isteği üzerinde daha fazla denetim için "MSXML2.ServerXMLHTTP" yerine "WinHttp.WinHttpRequest.5.1" kullanabilirsiniz
Matthew Murdoch

5
Dikkat çekici olan, bunu "POST" yerine "PUT" olarak değiştirerek bir HTTP PUT vermek için de kullanabilmenizdir. PUT içeriği .send () yöntemine gider. Ayarlamanız gereken ek başlıklar da User-Agent örneğinde kullanılan sözdizimini izleyerek yapılabilir.
radicand

7
Sub'un dönüş değerini kullanmıyorsanız lütfen parametrelerin etrafında parantez kullanmayın: VBA Sözdizimi, Sub parametrelerinin etrafında parantezlere izin vermez (yine de İşlevler için gereklidir), bu nedenle bu parantezler aslında operatör önceliğini netleştirmek için kullanılan aritmetik parantezlerdir. Yanıltıcı ve belirsiz olmasının yanı sıra, argüman bir nesne ise, sonunda çalışma zamanı hatasına neden olabilir. Her ne kadar açıkça istenmese de, genellikle tarafından alınabilecek HTTP yanıtını kullanmak istersiniz objHTTP.responseText.
Leviathan

4
Parens aslında bundan daha yapmak @Leviathan: onlar VBA çalışma zamanı yapmak bir değer olarak ifade değerlendirmek ve yönteme ByVal iletecek olursa olsun yöntemin imzası diyor bakılmaksızın ByRefya da değil. Bu nedenle bunları varsayılan üyesi olmayan bir türdeki nesne değişkenleriyle kullanmak çalışma zamanı hatalarına neden olur; ve bir nesne üzerinde bunları kullanarak yapar varsayılan üyeye sahip, gerçek nesnenin yerine varsayılan üyenin değeri geçirir.
Mathieu Guindon

1
Milyonlarca kez teşekkür ederim. Nedenini bilmiyorum, çünkü başka örneklerde görmedim, ancak "Kullanıcı-Aracı" başlığı benim için çok önemliydi, çünkü aksi takdirde vücut isteğimde gönderilmiyordu.
Ekim

51

Hem Mac hem de Windows'ta çalışması için QueryTable'ları kullanabilirsiniz:

With ActiveSheet.QueryTables.Add(Connection:="URL;http://carbon.brighterplanet.com/flights.txt", Destination:=Range("A2"))
    .PostText = "origin_airport=MSN&destination_airport=ORD"
    .RefreshStyle = xlOverwriteCells
    .SaveData = True
    .Refresh
End With

Notlar:

  • Çıktı ile ilgili olarak ... Sonuçları VBA işlevi olarak adlandırılan aynı hücreye döndürmenin mümkün olup olmadığını bilmiyorum. Yukarıdaki örnekte, sonuç A2'ye yazılmıştır.
  • Girdi ile ilgili olarak ... Belirli hücreleri değiştirdiğinizde sonuçların yenilenmesini istiyorsanız, bu hücrelerin VBA işlevinizin argümanı olduğundan emin olun.
  • Bu, VBA'sı olmayan Mac 2008 için Excel'de çalışmaz. Mac 2011 için Excel VBA'yı geri aldı.

Daha fazla ayrıntı için, " Excel'den web hizmetlerini kullanma " hakkındaki tam özetimi görebilirsiniz .


3
+1: Yalnızca Windows'da buna ihtiyacım var, ancak çapraz platform çözümü başka birine fayda sağlayabilir.
Matthew Murdoch

Aslında html koduna erişebileceğinizi sanmıyorum, sadece işlenmiş web sayfasındaki bilgileri (gerçek html kodunu değil) alabilirsiniz
user1493046

1
Çapraz platform çözümü için +1 ve gist bağlantısı ve tümü ile birlikte tam özet için +1 (yapabilirsem). Teşekkürler!!
hava saldırısı

Hem pencereleri hem de mac'u desteklemeliydim ve bu çözüm doğru! PostText'i belirttiğinizde URL'nin POST isteklerini, aksi takdirde GET isteklerini işlemesi gerektiğini unutmayın.
amolk

1
Sonuçları Aralık yerine bir değişkene çıktılamak mümkün müdür? Bazı Json ayrıştırma yapmak gerekiyor.
Stanislasdrg Monica'yı yeniden

42

Kertenkele Bill'in patronuna ek olarak :

Arka uçların çoğu ham yazı verilerini ayrıştırır. Örneğin PHP'de $_POST, gönderi verilerindeki bağımsız değişkenlerin saklanacağı bir diziniz olacaktır. Bu durumda ek bir başlık kullanmanız gerekir "Content-type: application/x-www-form-urlencoded":

Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHTTP.send ("var1=value1&var2=value2&var3=value3")

Aksi takdirde, değişkenin ham post verilerini okumalısınız "$HTTP_RAW_POST_DATA".


1
Bu isteği (kıvırcık parantez ile) göndermek ve derleme hataları almak için çalışıyorum ... u u yardım: "{" istek ": {" carName ":" Honda "," model ":" 1A5 "}}"
keman

6

Sen kullanabilirsiniz ServerXMLHTTPbir başvuru ekleyerek VBA projesinde MSXML.

  1. VBA Düzenleyicisini açın (genellikle bir Makro düzenleyerek)
  2. Kullanılabilir Referanslar listesine gidin
  3. Microsoft XML'yi kontrol edin
  4. Tamam'ı tıklayın.

( VBA Projelerinde MSXML'ye Yönelikten )

ServerXMLHTTP MSDN belgelerine tüm özellikleri ve ServerXMLHTTP yöntemleri hakkında tüm detayları vardır.

Kısacası, temelde şöyle çalışır:

  1. Uzak sunucuya bağlanmak için açık yöntemi çağırın
  2. İsteği göndermek için send'i arayın .
  3. ResponseXML , responseText , responseStream veya response aracılığıyla yanıtı okuyun

1
bu bağlantı VBA değil jscript kullanıyor
John Henckel

1
Teşekkürler @JohnHenckel. Bu cevabı güncel hale getirmek için bazı değişiklikler yaptım.
Mark Biek

3

Diğer kullanıcıların yanıtlarını tamamlamak için:

Bunun için bir "WinHttp.WinHttpRequest.5.1" nesnesi oluşturdum .

VBA'yı kullanarak Excel'den bazı verilerle bir gönderme isteği gönderin:

Dim LoginRequest As Object
Set LoginRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
LoginRequest.Open "POST", "http://...", False
LoginRequest.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
LoginRequest.send ("key1=value1&key2=value2")

VBA kullanarak Excel'den token kimlik doğrulaması ile bir get isteği gönderin:

Dim TCRequestItem As Object
Set TCRequestItem = CreateObject("WinHttp.WinHttpRequest.5.1")
TCRequestItem.Open "GET", "http://...", False
TCRequestItem.setRequestHeader "Content-Type", "application/xml"
TCRequestItem.setRequestHeader "Accept", "application/xml"
TCRequestItem.setRequestHeader "Authorization", "Bearer " & token
TCRequestItem.send

David, isteği gönderdikten sonra yanıtı nasıl okuyorsun?
ps0604

Yanıt içeride TCRequestItem Object, okuyabilirsiniz: TCRequestItem.ResponseTextyaptıktan sonraTCRequestItem.send
David Q

0

MSXML kitaplığını kullanmadan önce ve sonra XMLHttpRequest nesnesini kullanarak yaptım, buraya bakın .


1
Dosya bulunamadı.
SuShuang
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.