在https的連結中vb使用post提交xml資料
由於工作需要,需要vb提交xml資料到伺服器上,所以,需要找到一個好的方法。
之前有程式碼使用了MSXML2.XMLHTTP物件進行xml資料取得,而且連結是https形式的,於是就參照程式碼提交,寫了下面這麼一個函式,來進行操作
1 Private Function CallAPI(url1 As String, filePath As String) 2 'load file 3 Dim document As MSXML2.DOMDocument 4 Set document = CreateObject("MSXML2.DOMDocument") 5 document.Load filePath 'load xml file 6 'send data to server 7 Dim xmlHttp As MSXML2.XMLHTTP 8 Set xmlHttp = CreateObject("MSXML2.XMLHTTP") 9 xmlHttp.Open "POST", url1, False 'post method to 10 xmlHttp.setRequestHeader "Content-Type", "application/xml" 'xml type of http request xml,not text/xml11 xmlHttp.send (document.xml) 12 'clear 13 Set xmlHttp = Nothing 14 Set document = Nothing 15 End Function
但是,提交總是失敗,在下面的這句程式碼就被中斷,一直找不到原因。
1 xmlHttp.send (document.xml)
突然想到http協議和https協議是不同的,可能在提交資料時有差異,猜測MSXML2.XMLHTTP物件應該不支援https,經過尋找找到另一個物件WinHttp.WinHttpRequest,於是有了下面的程式碼
1 Private Function CallAPI(url1 As String, filePath As String) 2 'load file 3 Dim document As MSXML2.DOMDocument 4 Set document = CreateObject("MSXML2.DOMDocument") 5 document.Load filePath 6 7 Dim xmlHttps As WinHttp.WinHttpRequest 8 Set xmlHttps = CreateObject("WinHttp.WinHttpRequest.5.1") 9 xmlHttps.Open "POST", url1, False 10 xmlHttps.setRequestHeader "Content-Type", "application/xml" 11 12 xmlHttps.send document.xml 13 14 DoEvents 15 16 End Function
執行了上面的程式碼之後程式正常結束,但是遠端的伺服器中的資料沒有變化,查看了xmlHttps.status之後發現,提示沒有許可權,嗯,伺服器那邊需要使用者名稱和密碼驗證的,這邊沒有設定登入使用者名稱和密碼,於是加了一句
1 Private Function CallAPI(url1 As String, filePath As String) 2 'load file 3 Dim document As MSXML2.DOMDocument 4 Set document = CreateObject("MSXML2.DOMDocument") 5 document.Load filePath 6 7 Dim xmlHttps As WinHttp.WinHttpRequest 8 Set xmlHttps = CreateObject("WinHttp.WinHttpRequest.5.1") 9 xmlHttps.Open "POST", url1, False 10 xmlHttps.setRequestHeader "Content-Type", "application/xml" 11 xmlHttps.SetCredentials "使用者名稱 ", "密碼", HTTPREQUEST_SETCREDENTIALS_FOR_SERVER 12 13 xmlHttps.send document.xml 14 15 DoEvents 16 17 End Function
執行了程式碼之後發現,xml物件的資料被正常提交。
總結:
1. MSXML2.XMLHTTP物件不能提交https資料到伺服器上
2. WinHttp.WinHttpRequest物件需要顯式的設定使用者名稱和密碼,在MSXML2.XMLHTTP物件使用的過程中,沒有登入的話,會彈出使用者名稱和密碼輸入框,而WinHttp.WinHttpRequest物件沒有,直接提交資料後,提示沒有許可權
3. 提交xml物件時,設定的請求頭部應該是"Content-Type", "application/xml"而不是"Content-Type", "text/xml"
其它物件也可以達到https提交的效果:
1 ... 2 Dim serverxml As MSXML2.ServerXMLHTTP 3 Set serverxml = CreateObject("MSXML2.ServerXMLHTTP") 4 serverxml.Open "POST", url1, False, "使用者名稱", "密碼" 5 serverxml.setRequestHeader "Content-Type", "application/xml" 6 serverxml.send document.xml 7 ...
注:WinHttp.WinHttpRequest物件需要新增Microsoft WinHTTP Services, version 5.1元件的引用
MSXML2.XMLHTTP和MSXML2.ServerXMLHTTP需要新增Microsoft MsXml元件的引用