【发布时间】:2011-02-02 07:43:11
【问题描述】:
我想通过 POST 提交一些在 Inno 安装过程中从用户那里收集到的信息到我们的服务器。
明显的解决方案是包含一个 .exe 文件,安装程序会将其提取到临时位置并使用参数启动。但是,我想知道 - 有没有更简单/更好的方法?
【问题讨论】:
-
在我们的项目方法中使用自定义 .exe 效果很好。
标签: http inno-setup http-post
我想通过 POST 提交一些在 Inno 安装过程中从用户那里收集到的信息到我们的服务器。
明显的解决方案是包含一个 .exe 文件,安装程序会将其提取到临时位置并使用参数启动。但是,我想知道 - 有没有更简单/更好的方法?
【问题讨论】:
标签: http inno-setup http-post
根据使用WinHTTP library 的jsobo 建议,我提供了这个非常 简单的代码来解决问题。假设您想在实际安装开始之前发送序列号进行验证。在Code 部分,输入:
procedure CurStepChanged(CurStep: TSetupStep);
var
WinHttpReq: Variant;
begin
if CurStep = ssInstall then
begin
if AutoCheckRadioButton.Checked = True then
begin
WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
WinHttpReq.Open('POST', '<your_web_server>', false);
WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
WinHttpReq.Send('<your_data>');
{ WinHttpReq.ResponseText will hold the server response }
end;
end;
end;
Open 方法将 HTTP 方法、URL 以及是否执行异步请求作为参数,似乎我们需要添加 SetRequestHeader 才能将 Content-Type 标头设置为 application/x-www-form-urlencoded。
WinHttpReq.Status会保存响应码,所以要检查服务器是否返回成功:
if WinHttpReq.Status <> 200 then
begin
MsgBox('ERROR', mbError, MB_OK);
end
else
begin
MsgBox('SUCCESS', mbInformation, MB_OK);
end;
https://docs.microsoft.com/en-us/windows/win32/winhttp/winhttprequest 列出了WinHttpRequest 对象的所有方法和属性。
此外,为了避免运行时错误(如果主机无法访问,可能会发生),最好用try/except 代码包围代码。
【讨论】:
您总是可以让您的安装程序使用curl 制作http帖子...
您可以直接在 innosetup 中编写一个 pascal 脚本来使用 winhttp library 进行调用
或者您也可以编写一个 vbscript 并使用 cscript 引擎执行它,以通过 winhttp 库执行相同的 http 调用。
这应该为您指出至少 3 个不同的选项来满足您的需求。
我认为将 exe 放在那里最不容易出错,但使用带有 pascal 脚本(由 innosetup 使用)的 winhttp 库将是最简单的。
【讨论】:
我还没有尝试过,但是 ISXKB 有一个使用 HTTP POST 的卸载调查条目: http://www.vincenzo.net/isxkb/index.php?title=Uninstall_Survey
【讨论】: