Msxml2.XMLHTTP senden arbeitet Methode mit der frühen Bindung, nicht mit der späten Bindung

StackOverflow https://stackoverflow.com/questions/308826

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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top