我查看了SO建议的链接,但似乎没有一个相关,所以这里是..
(下面的实际网址和 header 数据已被混淆)
我真的很感激一些帮助,可以使用 Delphi 和(最好)Twebbrowser 自动从 https 网页下载数据,因为我在 Indy 方面没有取得很大成功。
在 Firefox 中,我导航到网址:https://www.thedomain.com/folder1/Showdata.aspx?code=111显示一些数据,我可以单击一个图像,将数据下载为 csv。
我正在尝试使用 Delphi 中的 Twebbrowser 自动化该过程,方法是导航到 url,然后单击该图像,或者以编程方式调用与图像相同的函数。
网页显示带有 anchor 文本的图像...
<a class="button dlCSV" href="javascript:void(0);" onclick="MyLib.DownloadCsv();return false;">Download</a>
看起来点击此按钮会导致 POST 到
https://www.thedomain.com/folder1/AnotherFolder/Sendcsv.ashx
(带有大量 header )实际执行下载。
我首先尝试使用 TWebbrowser 导航到
https://www.thedomain.com/folder1/Showdata.aspx?code=111
然后在 Twebbrowser 窗口中手动单击该按钮。 下载了一个名为 Sendcsv.ashx 的空文件。
然后我尝试使用此处找到的代码以编程方式单击图像: http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_27493399.html 。 那似乎并没有起到任何作用。它找到了图像并调用了它的 click 方法,但没有下载任何内容,也没有显示错误消息。
任何人都可以帮我编写使用 Delphi 下载此数据所需的代码吗?
<小时/>可能有用的其他信息。
使用 Firefox 调试器中的网络选项卡,我设法发现单击图像会导致 POST https://www.thedomain.com/folder1/AnotherFolder/Sendcsv.ashx
并且有大量标题,如下所示。 但是我不知道如何编写将这些 header 发送到 Sendcsv.ashx 的代码(如果这是我需要做的!)。
响应 header
- 缓存控制:“max-age=0”
- 内容处置:“附件;文件名=thedata.csv”
- 内容编码:“gzip”
- 内容长度:“6050”
- 内容类型:“text/html;charset=utf-8”
- 日期:“2014 年 11 月 3 日星期二 10:05:43 GMT”
- 编译指示:“公共(public)”
- 服务器:“Microsoft-IIS/8.0”
- X-AspNet-版本:“4.0.30319”
- X-Powered-By:“ASP.NET”
请求 header
- 主机:“www.thedomain.com”用户代理:“Mozilla/5.0(Windows NT 6.1;
- WOW64; rv:33.0) 壁虎/20100101 Firefox/33.0"
- 接受:“text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8”
- 接受语言:"en-GB,en;q=0.5"接受编码:"gzip, deflate"
- 推荐人:“https://www.thedomain.com/folder1/Showdata.aspx?code=111”
- Cookie:“rememberme = True”连接:“keep-alive”
- 内容类型:“application/x-www-form-urlencoded”
- 内容长度:“15972”
从上传流请求 header
- 内容类型:“application/x-www-form-urlencoded”
- 内容长度:“15972”
最佳答案
最近,对于此类情况,我一直在使用通过导入 Microsoft XML
类型库获得的 MSXML2_TLB.pas
单元。
它有一个 XMLHTTP
类,它的作用与 XmlHttpRequest
的作用完全相同,就像您可能在 Web 开发中认识到的那样。
uses SysUtils, ActiveX, AxCtrls, MSXML2_TLB;
//be sure to call CoInitialize(nil); on application or thread startup
//procedure ...
var
reqData:string;
req:XMLHTTP;
str:TOleStream;
f:TFileStream;
begin
//Did you catch the request data? load/set/build it here:
//reqData:=
req:=CoXMLHTTP.Create;
req.open('POST','https://www.thedomain.com/folder1/AnotherFolder/Sendcsv.ashx',false,'','');
req.setRequestHeader('Host','www.thedomain.com');
// try first without this one: it may not be required:
//req.setRequestHeader('Referer','https://www.thedomain.com/folder1/Showdata.aspx?code=111');
// same here, may not affect response
//req.setRequestHeader('Cookie','rememberme=True');
req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
req.setRequestHeader('Content-Length',IntToStr(Length(reqData)));
req.send(reqData);
if req.status=200 then
begin
str:=TOleStream.Create(IUnknown(req.responseStream) as IStream);
try
f:=TFileStream.Create('thedata.csv',fmCreate);//or TMemoryStream?
try
f.CopyFrom(str,str.Size);
finally
f.Free;
end;
finally
str.Free;
end;
end
else
raise Exception.Create('CSV request failed: '+req.statusText);//parse req.responseText?
end;
关于javascript - 如何在网页上通过 ashx 以编程方式下载 csv 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26734305/