Метод отправки MSXML2.XMLHTTP работает с ранним связыванием, завершается с поздним связыванием - PullRequest
8 голосов
/ 21 ноября 2008

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

Неверный параметр

Почему и что (если что) я могу с этим поделать?

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

Кори, да, я знаю, что должен был бы сделать это, чтобы мой код работал без ссылки на библиотеку типов MSXML. Это не проблема здесь. Сбой кода при использовании Dim objRequest As Object независимо от того, использую ли я

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

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

Ответы [ 3 ]

15 голосов
/ 21 ноября 2008

По какой-то причине это работает:

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: Как URL-кодировать строку в Excel VBA?

2 голосов
/ 21 ноября 2008

Если вы используете Dim objRequest в качестве объекта, вам потребуется код:
Установите objRequest = CreateObject ("MSXML2.XMLHTTP")

0 голосов
/ 22 февраля 2010

Я понимаю, что это почти идентично коду из 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
...