2008-11-21 64 views
7

El código siguiente funciona. Pero si me comente la línea Dim objRequest As MSXML2.XMLHTTP y elimine la línea Dim objRequest As Object falla con el mensaje de error:El método de envío MSXML2.XMLHTTP funciona con el enlace anticipado, falla con el enlace tardío

el parámetro es incorrecto

Por qué, y lo que (si acaso) puedo hacer al respecto?

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, sí, sé que tendría que hacer que para que el código para trabajar sin una referencia a la biblioteca de tipos MSXML. Ese no es el problema aquí. El código falla cuando se utiliza Dim objRequest As Object independientemente de si utilizo

Set objRequest = NEW MSXML2.XMLHTTP con la referencia, o

Set objRequest = CreateObject("MSXML2.XMLHTTP") sin la referencia.

Respuesta

14

Por alguna razón, esto funciona:

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 

en lugar de construir la URL codificada strPostData a través de la concatenación de cadenas, es fuertemente recomendable utilizar una función de codificación URL:

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

Un par de opciones para una función URLEncode() en VBA son en este hilo: How can I URL encode a string in Excel VBA?

+0

¡Yay! Gracias, Tomalak, ¡eso lo solucionó! :) –

+1

Muy extraño que la solución fue agregar paratensis a '.send (strPostData)'. Pero acabo de confirmar que realmente es el caso. –

+0

@ Bruno: gracias por la confirmación. Estoy convencido de que hay una explicación completamente lógica para esto, en algún lugar en las entrañas de la interacción VBA o VBA-a-COM en general o la biblioteca MSXML2.XMLHTTP en particular, pero no tengo ni idea. Estoy seguro de que @Eric Lippert podría explicarlo. ;) – Tomalak

2

Si utiliza el Dim objRequest como objeto, entonces tendría que código:
Conjunto objRequest = CreateObject ("MSXML2.XMLHTTP")

+0

te dicen mediante la emisión de "Nueva MSXML2.XMLHTTP ". Para mí, ambas formas de hacerlo funcionar. – Tomalak

0

me di cuenta que es casi idéntico al código de Tomalek anterior, pero esta pregunta me ayudó a (todo el crédito debido a usted!) una solución completa a un problema que tuve (Excel presentar al servidor PHP, entonces se trata de la respuesta) ... por lo que en caso de que esto es de ninguna ayuda a alguien más:

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 
Cuestiones relacionadas