2008-11-21 12 views
7

Poniższy kod działa. Ale jeśli mogę wypowiedzieć się linię Dim objRequest As MSXML2.XMLHTTP i usuń linię Dim objRequest As Object nie powiedzie się z komunikatem o błędzie:Metoda wysyłania MSXML2.XMLHTTP działa z wczesnym wiązaniem, nie działa z późnym wiązaniem

Parametr jest niepoprawny

Dlaczego i co (jeśli cokolwiek) mogę z tym zrobić?

Public Function GetSessionId(strApiId, strUserName, strPassword) As String 

    Dim strPostData As String 

    Dim objRequest As MSXML2.XMLHTTP 
    'Dim objRequest As Object ' 

    strPostData = "api_id=" & strApiId & "&user=" & strUserName & "&password=" & strPassword 

    Set objRequest = New MSXML2.XMLHTTP 
    With objRequest 
     .Open "POST", "https://api.clickatell.com/http/auth", False 
     .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
     .send strPostData 
     GetSessionId = .responseText 
    End With 

End Function 

Corey, tak, wiem, że muszę to zrobić, aby mój kod do pracy bez odniesienia do typu biblioteki MSXML. To nie jest problem tutaj. Kod awarii podczas korzystania Dim objRequest As Object niezależnie od tego, czy używam

Set objRequest = NEW MSXML2.XMLHTTP z odniesieniem lub

Set objRequest = CreateObject("MSXML2.XMLHTTP") bez odniesienia.

Odpowiedz

14

Z jakiegoś powodu, to działa:

Dim strPostData As String 
Dim objRequest As Object 

strPostData = "api_id=" & strApiId & "&user=" & strUserName & "&password=" & strPassword 

Set objRequest = New MSXML2.XMLHTTP 
With objRequest 
    .Open "POST", "https://api.clickatell.com/http/auth", False 
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
    .send (strPostData) 
    GetSessionId = .responseText 
End With 

zamiast budować URL zakodowane strPostData poprzez ciąg konkatenacji, to silnie zaleca się użycie funkcji kodowania URL:

strPostData = "api_id=" & URLEncode(strApiId) & _ 
       "&user=" & URLEncode(strUserName) & _ 
       "&password=" & URLEncode(strPassword) 

Kilka wyborów dla URLEncode() funkcji w VBA są w tym wątku: How can I URL encode a string in Excel VBA?

+0

Yay! Dziękuję, Tomalak, że to naprawiłem! :) –

+1

Bardzo dziwne, że rozwiązaniem było dodanie parathensis do '.send (strPostData)'. Ale właśnie potwierdziłem, że tak jest naprawdę. –

+0

@Bruno: Dzięki za potwierdzenie. Jestem przekonany, że istnieje całkowicie logiczne wytłumaczenie tego, gdzieś w głębi VBA, w ogóle interakcji VBA-do-COM lub w szczególności z biblioteką MSXML2.XMLHTTP, ale nie mam pojęcia. Jestem pewien, że @Eric Lippert mógłby wyjaśnić. ;) – Tomalak

2

Jeśli używasz Dim objRequest As Object wtedy musiałby kodu:
Set objRequest = CreateObject ("MSXML2.XMLHTTP")

+0

powiesz wydając „New MSXML2.XMLHTTP ". Dla mnie oba sposoby na to działają. – Tomalak

0

Zdaję sobie sprawę, to jest prawie identyczny z kodem z Tomalek powyżej, ale to pytanie pomogła mi w kierunku (wszystkich kredytów ze względu na ciebie!) pełne rozwiązanie problemu miałem (Excel złożenie do serwera PHP, wtedy do czynienia z odpowiedzi) ... więc w przypadku, gdy ma żadnej pomocy nikomu innemu:

Sub Button1_Click2() 

Dim objXMLSendDoc As Object 
Set objXMLSendDoc = New MSXML2.DOMDocument 
objXMLSendDoc.async = False 
Dim myxml As String 
myxml = "<?xml version='1.0'?><Request>Do Something</Request>" 
If Not objXMLSendDoc.LoadXML(myxml) Then 
    Err.Raise objXMLSendDoc.parseError.ErrorCode, , objXMLSendDoc.parseError.reason 
End If 

Dim objRequest As MSXML2.XMLHTTP 
Set objRequest = New MSXML2.XMLHTTP 
With objRequest 
    .Open "POST", "http://localhost/SISADraftCalcs/Test2.php", False 
    .setRequestHeader "Content-Type", "application/xml;charset=UTF-16" 
    .setRequestHeader "Cache-Control", "no-cache" 
    .send objXMLSendDoc 
End With 

Dim objXMLDoc As MSXML2.DOMDocument 
Set objXMLDoc = objRequest.responseXML 
If objXMLDoc.XML = "" Then 
    objXMLDoc.LoadXML objRequest.responseText 
    If objXMLDoc.parseError.ErrorCode <> 0 Then 
     MsgBox objXMLDoc.parseError.reason 
    End If 
End If 

Dim rootNode As IXMLDOMElement 
Set rootNode = objXMLDoc.DocumentElement 

MsgBox rootNode.SelectNodes("text").Item(0).text 

End Sub