2008-11-21 5 views
7

Le code ci-dessous fonctionne. Mais si je commente la ligne Dim objRequest As MSXML2.XMLHTTP et décommenter la ligne Dim objRequest As Object il échoue avec le message d'erreur:La méthode d'envoi MSXML2.XMLHTTP fonctionne avec une liaison anticipée, échoue avec une liaison tardive

Le paramètre est incorrect

Pourquoi, et ce que (le cas échéant) puis-je faire?

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, oui, je sais que je dois faire pour que mon code fonctionne sans référence à la bibliothèque de type MSXML. Ce n'est pas le problème ici. Le code échoue lorsque vous utilisez Dim objRequest As Object indépendamment du fait que j'utilise

Set objRequest = NEW MSXML2.XMLHTTP avec la référence ou

Set objRequest = CreateObject("MSXML2.XMLHTTP") sans référence.

Répondre

14

Pour une raison quelconque, cela fonctionne:

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 

au lieu de construire l'URL codée strPostData par concaténation de chaîne, il est fortement conseillé d'utiliser une fonction de codage URL:

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

Un couple de choix pour une fonction URLEncode() en VBA sont dans ce fil: How can I URL encode a string in Excel VBA?

+0

Yay! Merci, Tomalak, qui l'a réparé! :) –

+1

Très étrange que la solution était d'ajouter parathensis à '.send (strPostData)'. Mais je viens de confirmer que c'est vraiment le cas. –

+0

@Bruno: Merci pour la confirmation. Je suis convaincu qu'il y a une explication tout à fait logique à cela, quelque part dans les entrailles de l'interaction VBA ou VBA-to-COM en général ou de la bibliothèque MSXML2.XMLHTTP en particulier, mais je n'en ai aucune idée. Je suis sûr que @Eric Lippert pourrait expliquer. ;) – Tomalak

2

Si vous utilisez le Dim objRequest comme objet que vous aurez alors besoin de code:
Set objRequest = CreateObject ("MSXML2.XMLHTTP")

+0

vous dire par l'émission « New MSXML2.XMLHTTP ". Pour moi, les deux façons de le faire fonctionner. – Tomalak

0

Je sais que cela est presque identique au code de Tomalek ci-dessus, mais cette question m'a aidé à (tout crédit à cause de vous!) une solution complète à un problème que j'avais (Excel soumettre au serveur PHP, traiter ensuite avec réponse) ... donc dans le cas où cela est de toute aide à quelqu'un d'autre:

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 
Questions connexes