يعمل MSXML2.XMLHTTP ترسل الأسلوب مع الربط المبكر، يفشل مع الربط المتأخر
-
08-07-2019 - |
سؤال
ورمز أدناه يعمل. ولكن إذا كنت التعليق خارج 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