XMLHTTP“发布”不起作用(VBA)

时间:2014-03-28 10:19:23

标签: xmlhttprequest

我可以在一个网站上使用“POST”请求,但是有一个网站,其中POST方法似乎不起作用。我已经失去了理智。 : - (

这是我的网站测试代码:

    Sub test()
    Dim result As String
    Dim myURL As String, postData As String
   Dim winHttpReq As Object
   Set winHttpReq = CreateObject("MSXML2.XMLHTTP")
   Dim ele
   Dim html As Object

   myURL = "http://www.mca.gov.in/DCAPortalWeb/dca/CompanyMaster.do?method=getName"
   postData = "taskID=9412&method=find&cmpnyname=&cmpnyID=U24232TN2004PLC054527"

   winHttpReq.Open "POST", myURL, False
   winHttpReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
   winHttpReq.send (postData)

   result = winHttpReq.responseText
   Sheets("sheet1").Range("A1") = result

   end sub

该网站的主页为“http://www.mca.gov.in/DCAPortalWeb/dca/MyMCALogin.do?method=setDefaultProperty&mode=31”,我使用livehttp标头获取POST URL链接。

但它似乎不起作用。我正在使用公司ID进行搜索。 样品编号:U24232TN2004PLC054527

非常需要你的帮助。我想我在这里使用的URL不正确。但我使用了实时HTTP标头中显示的所有URL,似乎没有任何效果。请帮忙!

1 个答案:

答案 0 :(得分:1)

可以使用Fiddler来分析问题,http://www.mca.gov.in/DCAPortalWeb/dca/CompanyMaster.do提供了比livehttp标头更多的详细信息。使用Fiddler composer功能,您可以试验POST请求并查看响应。

我对所提供的网址进行了判断,并发现由于未在请求中设置了JSESSIONID Cookie,因此回复时会显示“您的会话已过期”。

发布的请求:

POST http://www.mca.gov.in/DCAPortalWeb/dca/CompanyMaster.do HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: www.mca.gov.in
Content-Length: 64

taskID=9412&method=find&cmpnyname=&cmpnyID=U24232TN2004PLC054527

回应:

HTTP/1.1 200 OK
Date: Thu, 08 Jan 2015 11:31:55 GMT
Server: IBM_HTTP_Server
Surrogate-Control: no-store
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Cache-Control: no-cache="set-cookie, set-cookie2"
X-UA-Compatible: IE=edge
Vary: Accept-Encoding
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-US
via: HTTP/1.1 proxy226
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
Set-Cookie: JSESSIONID=0000NHNQgGMo247hf4dpRRcsrLP:17ufavb50; Path=/
Content-Length: 702

在回复正文中,我们收到消息“您的会话已过期”。

如果您首先转到主页,则会设置一个cookie,该cookie将被传递给进一步的呼叫。当您直接提出POST请求时,未设置JSESSIONID cookie。

您需要首先在VBA代码中打开主页,然后阅读响应标头以识别cookie,并使用它来填充POST请求标头。另请注意,必须在没有?method = getName的情况下对URL“{{3}}”执行POST。此外,需要使用响应体来创建用于填写excel文件的数据。

示例代码:

Sub test_new()
    Dim result As String
    Dim myURL As String, postData As String
    Dim Cookie As String
    Dim winHttpReq As Object
    Dim oStream As Object
    Dim objStream As Object
    Set winHttpReq = CreateObject("MSXML2.XMLHTTP")

' GET the JSESSIONID cookie first frm home page
    myURL = "http://www.mca.gov.in/DCAPortalWeb/dca/MyMCALogin.do?method=setDefaultProperty&mode=31"
    winHttpReq.Open "GET", myURL, False
    winHttpReq.send

' Get the JSESSIONID from cookies ''' JSESSIONID=0000QSz0qJtUmQ8QRmEGBbVBFsm:18ungce99; Path=/
    Cookie = Split(winHttpReq.getResponseHeader("Set-Cookie"), ";")(0)
    myURL = "http://www.mca.gov.in/DCAPortalWeb/dca/CompanyMaster.do"       '   ?method=getName"
    postData = "taskID=9412&method=find&cmpnyname=&cmpnyID=U24232TN2004PLC054527"
    winHttpReq.Open "POST", myURL, False
    winHttpReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
' POST the request with cookies
    winHttpReq.setRequestHeader "Cookie", Cookie
    winHttpReq.send (postData)

' Get Text from response Body
    If winHttpReq.Status = 200 Then
        Set oStream = CreateObject("ADODB.Stream")
        oStream.Open
        oStream.Type = 1
        oStream.Write winHttpReq.responseBody
        oStream.Position = 0
        oStream.Type = 2 'Text
        oStream.Charset = "UTF-8"
        result = oStream.ReadText
    End If
    Sheets("Sheet1").Range("A1") = result
End Sub

请注意,这只将html代码保存到单元格A1中。如果您确实想使用html内容,则应使用htmlfile对象或使用oStream.SaveToFile将流保存到本地文件,并使用它而不是oStream.Position = 0中的代码。