2008-11-21 4 views
7

Код ниже работает. Но если я закомментируйте строку Dim objRequest As MSXML2.XMLHTTP и раскомментировать строку Dim objRequest As Object он терпит неудачу с сообщением об ошибке:Метод отправки MSXML2.XMLHTTP работает с ранним связыванием, не работает с последним связыванием

Параметр неверен

Почему, и что (если что-нибудь) я могу поделать?

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, да, я знаю, что я должен был бы сделать это для того, чтобы мой код, чтобы работать без ссылки на библиотеку типов MSXML. Это не проблема. Код не при использовании Dim objRequest As Object независимо от того, используется ли я

Set objRequest = NEW MSXML2.XMLHTTP с ссылкой, или

Set objRequest = CreateObject("MSXML2.XMLHTTP") без ссылки.

ответ

14

По некоторым причинам, это работает:

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 

Вместо построения URL-закодирован strPostData с помощью конкатенации, это сильно рекомендуется использовать функцию кодирования URL:

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

Несколько вариантов для URLEncode() функции в VBA в этой теме: How can I URL encode a string in Excel VBA?

+0

Yay! Спасибо, Томалак, это исправило это! :) – 2008-11-21 14:28:01

2

Если вы используете Dim objRequest As Object, то вам нужно будет код:
Set objRequest = CreateObject ("Msxml2.XMLHTTP")

+0

Вы сказать, выпуская «New Msxml2.XMLHTTP ». Для меня оба способа сделать это работают. – Tomalak 2008-11-21 14:00:24

0

Я понимаю, что это почти идентичен коду из Tomalek выше, но этот вопрос помог мне в сторону (всего кредита из-за вас!) полное решение проблемы, я имел (Excel подчиняясь PHP сервер, то имеем дело с ответом) ... так что в случае, если это какой-либо помощи кому-либо еще:

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