Msxml2.XMLHTTP senden arbeitet Methode mit der frühen Bindung, nicht mit der späten Bindung
-
08-07-2019 - |
Frage
Der folgende Code funktioniert. Aber wenn ich die Linie Dim objRequest As MSXML2.XMLHTTP
Kommentar und Kommentar- der Zeile Dim objRequest As Object
es schlägt mit der Fehlermeldung:
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 muss das tun, um würde für meinen Code ohne einen Verweis auf die MSXML-Typenbibliothek zu arbeiten. Das ist hier nicht das Thema. 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.
Lösung
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, es ist 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: Wie kann ich URL eine Zeichenkette in Excel VBA kodieren?
Andere Tipps
Wenn Sie die Dim objRequest As Object verwenden dann möchten Sie Code benötigen:
Set objRequest = Create ( "MSXML2.XMLHTTP")
Ich weiß, das auf den Code von Tomalek über nahezu identisch ist (alle Ehre gebührt sie!), Aber diese Frage hat mir geholfen, zu einer vollständigen Lösung für ein Problem hatte ich (Excel PHP-Server einreichen, dann mit Antwort zu tun) ... so, falls dies ist keine Hilfe zu jemand anderem:
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