1. 程式人生 > >在https的連結中vb使用post提交xml資料

在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/xml
11 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元件的引用