يعمل MSXML2.XMLHTTP ترسل الأسلوب مع الربط المبكر، يفشل مع الربط المتأخر

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

سؤال

ورمز أدناه يعمل. ولكن إذا كنت التعليق خارج Dim objRequest As MSXML2.XMLHTTP خط و uncomment 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") دون الإشارة.

هل كانت مفيدة؟

المحلول

لسبب ما، وهذا يعمل:

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

وبدلا من بناء strPostData ترميز URL عبر سلسلة سلسلة، انها <م> بشدة المستحسن استخدام دالة ترميز URL:

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

وزوجان من الخيارات لوظيفة URLEncode() في VBA هم في هذا الموضوع: <لأ href = "https://stackoverflow.com/questions/218181/how-can-i-url-encode-a-string-in -excel-VBA "> كيف يمكنني URL ترميز سلسلة في Excel VBA؟

نصائح أخرى

إذا كنت تستخدم خافت objRequest ككائن فإنك سوف تحتاج إلى رمز:
    تعيين objRequest = CREATEOBJECT ( "MSXML2.XMLHTTP")

وأنا أدرك هذا هو مطابق تقريبا لرمز من Tomalek فوق (جميع الائتمان نظرا للكم!)، ولكن ساعدني هذا السؤال نحو الحل الكامل لمشكلة لدي (اكسل تقديم إلى خادم 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top