2016-09-08 30 views
5

Erişim projemde Asynchronous HTTP Request Class kullanıyorum. Yazar sadece GET ekledi. Bu yüzden sınıfa POST işlevselliğini eklemeyi deniyorum.MS Access'te Eşzamansız HTTP POST İsteği

benim formda aşağıdaki kodu dava ediyorum, yukarıdaki alt çağıran zaman Class

Public Sub PostRequest(serviceURL As Variant, Optional apiBody As String) 
On Error GoTo Sub_Err 

    Set m_oXmlHttp = New MSXML2.XMLHTTP60 

    m_oXmlHttp.Open "POST", serviceURL, True 

    'this sets the onreadystatechange call back to an instance of this object 
    'which causes the default method HandleResponse to be called when the ready 
    'state changes 
    m_oXmlHttp.onreadystatechange = Me 
    m_oXmlHttp.send apiBody 


'Error Catching 
Sub_Exit: 
    Exit Sub 
Sub_Err: 
    MsgBox Error$ 
    Resume Sub_Exit 
End Sub 

eklenen aşağıdaki kodu.

Private WithEvents oAHlogin As clsAsyncHTTP 


Private Sub PostLoginData() 
    Dim apiURL, apiBody As String 
    apiURL = "myurl" 
    apiBody = "mybody" 

    Set oAHlogin = New clsAsyncHTTP          
    oAHlogin.PostRequest apiURL, apiBody  '*This is where the execution stops*. 

End Sub 


Private Sub oAHlogin_ResponseReady(ByVal ready As Boolean) 
    If ready Then 
     Debug.Print oAHlogin.GetReponseText 
    End If 
End Sub 

I yürütme burada durur Bu belirtmiştik hattı, yukarıya bakınız. Herhangi bir yardım takdir edilir. Programlamaya nispeten yeniyim. Yanlış çağı mı arıyorum? Parantez eksik mi?

Sınıfın yazarı tarafından gösterildiği gibi GET doğru şekilde çalıştırabildim. Eklediğim POST,

düzenleme 1 çalışmaz: kopya olarak Q hale Gord Thompson'a Cevap: Question # 1463635 ASP içindir, ben tamamen farklı şeylerdir VBA Erişim için soruyorum.

Edit 2: Access projemde aşağıdaki başvuruları ekledim.

References

+1

* "Soru # 1463635 ASP içindir, VBA'da Access'i tamamen farklı şeyler istiyorum." * - Hayır, değiller. VBScript, VBA ve VB6, farklı olduklarından çok daha benzerdir. Diğer yanıtta (http://stackoverflow.com/a/1463700/2144390) temel yaklaşım Access VBA ile çalışır; Bu soruyu çift olarak işaretlemeden önce test ettim. –

+0

@GordThompson, MS Access'teki cevabı test ettiğiniz için teşekkür ederiz. Ben de aynısını kullanmayı denedim. Hata alıyorum ** Değişken bulunamadı ** satırında Server.CreateObject ("MSXML2.ServerXMLHTTP.6.0") '. Benim Soru –

+1

içinde referansların ekran görüntüsü eklediniz Sadece 'Server.CreateObject' yerine' CreateObject' kullanın. –

cevap

2

Size "post" iseniz fark ing veya ing "GET" değildir: Bu sonuçta benim için çalıştı kodudur. Bunu yapmadan önce anlamanız gereken birkaç şey var.

  1. MS Access vba tek bir iş parçacığıdır, bu nedenle harici DLL'leri veya az kullanılabilir hackleri kullanmak dışında paralel yürütme veya iş parçacığı yürütme mümkün değildir.
  2. "Eşzamansız HTTP İstekleri" ni elde etmek için veya başka bir deyişle, VBA'nın HTTP yanıtını beklememesini söylemek için geri arama sınıfında küçük bir kesinti yapmanız gerekir.

süreç akışı bu şekildedir:

  1. atamak
  2. Gönder/MSXML2 açın bir geri çağırma işlevi
  3. tüm parametreleri eklemek için HTTP isteği oluşturun ve
  4. her şey. [VarAsyn] = True
  5. ile XMLHTTP, vba http yanıtı alındığında, diğer kod üzerinde çalışmaya devam etsin, t Geri çağırma sınıfı bir olayı tetikleyecektir.Önemli

: Geri arama işlevi, bir sınıf olacak ve o sınıf kesmek gerekir.

[Adım 1: Hazırlama geri arama sınıfı]

, sizin VBA'DA yeni sınıf modül oluşturun aşağıdaki kodla HTTP_HANDLER_CLASS çağrı:

Option Compare Database 
Option Explicit 
Dim m_xmlHttp As MSXML2.XMLHTTP 

Public Sub Initialize(ByRef xmlHttpRequest As MSXML2.XMLHTTP) 
    Set m_xmlHttp = xmlHttpRequest 
End Sub 

Sub OnReadyStateChange() 
    If m_xmlHttp.ReadyState = 4 Then 
     If m_xmlHttp.status = 200 Then 
     Debug.Print m_xmlHttp.responseText 
     Else 
     'Error happened 
    End If 
    End If 
End Sub 

[Adım 2: burada geliştirme/Call hack back class]

  1. Artık sınıfı dışa aktarın ve masaüstünüze HTTP_HANDLER olarak kaydedin.
  2. Add herhangi bir metin düzenleme aracı
  3. Aç ihraç sınıf _CLASS.cls: "Özellik OnReadyStateChange.VB_UserMemId = 0" sadece alt altında "Sub OnReadyStateChange()" enter image description here
  4. VBA geri dönün ve sınıfını içe

    [Adım: biz en önemli kısmı olması ve şu ana kadar yaptığın ne istediğini olan bu varsayılan fonksiyonu olarak() onreadystatechange yapacak

(üzerine veya mevcut silme) 3: gönderen g bu örnekteki SOAP eylemini kullanır] Bir web servisinin "CallingServiceName" olduğunu varsayın; iEmail, iPassword iki parametre alır ve oturum açma başarılı olursa bir dizge döndürür.

Module level variable: 
Public xmlHttpRequest As MSXML2.XMLHTTP 

Public Function HTTP_TEST() 

On Error GoTo FailedState 
If Not xmlHttpRequest Is Nothing Then Set xmlHttpRequest = Nothing 

Dim MyXmlHttpHandler As HTTP_HANDLER_CLASS 'our hacked call back class 
Set xmlHttpRequest = New MSXML2.XMLHTTP 

Dim sURL As String 
Dim sEnv As String 


sURL = "http://mydomain.co.uk/mywebsite/myservices.asmx?op=CallingServiceName" 

sEnv = "<?xml version=""1.0"" encoding=""utf-8""?>" 
sEnv = sEnv & "<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">" 
sEnv = sEnv & " <soap:Body>" 
sEnv = sEnv & " <CallingServiceName xmlns=""http://mydomain.co.uk/"">" 
sEnv = sEnv & "  <iEmail>username</iEmail>" 
sEnv = sEnv & "  <iPassword>mypassword</iPassword>" 
sEnv = sEnv & " </CallingServiceName>" 
sEnv = sEnv & " </soap:Body>" 
sEnv = sEnv & "</soap:Envelope>" 

' Now create an instance of our call-back class 
Set MyXmlHttpHandler = New HTTP_HANDLER_CLASS 
MyXmlHttpHandler.Initialize xmlHttpRequest 

    ' Now attach the call-back class to our request, so whenever the request's state changes, callback classs default function will fire. 
    xmlHttpRequest.OnReadyStateChange = MyXmlHttpHandler 

    ' seal the envelop and send it 
    xmlHttpRequest.Open "Post", sURL, True ' here set varAsyn=true 
    xmlHttpRequest.setRequestHeader "Host", "mydomain.co.uk" 
    xmlHttpRequest.setRequestHeader "Content-Type", "text/xml; charset=utf-8" 
    xmlHttpRequest.setRequestHeader "soapAction", "http://mydomain.co.uk/CallingServiceName" 
    xmlHttpRequest.Send sEnv 

    Debug.Print "Controller finished job" ' this is for you to realize vba will continue to work, the http result will be fired whenever the onstateChanges. 

    Exit Function 

FailedState: 
    'MsgBox err.Number & ": " & err.description 
End Function 

[Sonuç] Result

ah btw Microsoft XML v3 bunun için yeterlidir. Yukarıdaki örnek enter image description here

SABUN sürümünü kullanır ancak herhangi yöntemini kullanabilirsiniz. Bu yardımcı olduysa lütfen bana bildirin.

+0

Numaranız için çok teşekkürler. Çok yardımcı oldu. 'Amazing' –

1

Sen başlıklarını ayarlamak gerekir - Eğer biraz daha buldum koduyla etrafında dolaştıktan sonra .Send

m_oXmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
+0

Firebase kullanıyorum beri, üstbilgi gerekli değildir."GET" alt yordamları bile başlıkları ' –

+0

olmadan çalışır GET – dbmitch

+0

ile form-ağa kodlanmış üstbilgiye gereksinim duymadım VBA'da xmlhttp kullanarak Firebase'in ne ilgisi olduğundan emin değilim. Aslında "apiBody" ile ne gönderiyorsun? Firebase, soru ve cevap için önemliyse, belirtilmeli ve etiketlenmelidir. – dbmitch

1

aramadan önce En azından siz, sınıfına bu satırı eklemeniz gerekir Asenkronize bir POST yaparken, daha önce çift olarak işaretlediğim soruya verilen cevapta kodda birkaç ince değişiklik yapılması gerektiğine dikkat çekildi.

' VBA project reference required: 
'  Microsoft XML, v6.0 

Dim postData As String 
postData = "word1=hello&word2=world" 

Dim objXmlHttp As New MSXML2.XMLHTTP 
objXmlHttp.Open "POST", "http://localhost:8080/postTest.php", True 
objXmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
objXmlHttp.setRequestHeader "Content-Length", Len(postData) 
objXmlHttp.send postData 
Set objXmlHttp = Nothing 
+0

Tüm çabalarınız için teşekkürler. Bu kod MS Access için çalışır. POST da başarılı oldu. Fakat asenkron değildir. MS Access, yukarıdaki kod bloğunun tamamlanmasını bekler. Ancak daha sonra başka kod bloğu yürütülür. Söz konusu "Eşzamansız HTTP İstek Sınıfı" nın kullanılmasının nedeni budur. –

İlgili konular