2008-11-21 10 views
7

Der folgende Code funktioniert. Aber wenn ich die Linie Dim objRequest As MSXML2.XMLHTTP Kommentar und Kommentar- die Zeile Dim objRequest As Object es mit der Fehlermeldung fehlschlägt:MSXML2.XMLHTTP-Sendemethode funktioniert mit früher Bindung, schlägt mit später Bindung fehl

Der Parameter ist falsch

Warum, und was (wenn überhaupt) kann ich dagegen tun?

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, ja, ich weiß, ich würde zu tun hat, dass, um für meinen Code an die MSXML Typbibliothek ohne Referenz zu arbeiten. Das ist nicht das Problem hier. Der Code schlägt fehl, wenn mit Dim objRequest As Object unabhängig davon, ob ich

Set objRequest = NEW MSXML2.XMLHTTP mit der Referenz oder

Set objRequest = CreateObject("MSXML2.XMLHTTP") ohne Referenz.

Antwort

14

Aus irgendeinem Grund, dies funktioniert:

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 

anstatt den Aufbau der URL-codierte strPostData über String-Verkettung, dann ist es stark ratsam, eine URL-Codierung-Funktion:

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

Ein paar Möglichkeiten für eine URLEncode() Funktion in VBA sind in diesem Thread: How can I URL encode a string in Excel VBA?

+0

Yay! Danke, Tomalak, das hat es repariert! :) –

+1

Sehr seltsam, dass die Lösung Parathensis zu '.send (strPostData)' hinzuzufügen. Aber ich habe gerade bestätigt, dass es wirklich so ist. –

+0

@Bruno: Danke für die Bestätigung. Ich bin davon überzeugt, dass es eine völlig logische Erklärung hierfür gibt, irgendwo im Kern von VBA oder VBA-zu-COM-Interaktion im Allgemeinen oder der MSXML2.XMLHTTP-Bibliothek im Besonderen, aber ich habe keine Ahnung. Ich bin sicher @eric Lippert könnte das erklären. ;) – Tomalak

2

Wenn Sie die Dim objRequest As Object verwenden dann möchten Sie Code benötigen:
Set objRequest = Create ("MSXML2.XMLHTTP")

+0

Sie erzählen von „New MSXML2.XMLHTTP Ausgabe ". Für mich funktionieren beide Möglichkeiten. – Tomalak

0

Ich weiß, das von Tomalek oben auf den Code fast identisch ist, aber diese Frage hat mir geholfen, zu (alle Ehre gebührt euch!) eine vollständige Lösung für ein Problem, das ich (Excel Vorlage auf PHP-Server, dann mit Antwort zu tun) hatte ... also, falls dies ist keine Hilfe zu jemandem anderen:

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