我有一个Inno Setup Installer,需要在安装过程中进行API调用。这会将一些数据发布到远程API。
使用Pascal和WinHttpRequest
对象在[Code]部分中执行POST调用。
该API是ASP.Net WebAPI 2(C#)。
我可以完全控制该过程的所有部分,即Inno Setup脚本,“代码”部分和WebAPI。
问题
我可以同步进行POST调用,没有任何问题,但是如果我在true
方法上将async标志设置为WinHttpRequest.Open()
,那么.Send()
方法似乎根本不会执行。
procedure PostData(postural: String);
var
WinHttpReq: Variant;
ReqContent: String;
begin
try
WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
ReqContent := 'item=value';
WinHttpReq.Open('POST', postUrl, true);
WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
WinHttpReq.Send(ReqContent);
except
end;
end;
我在Visual Studio调试器中检查了断点,但从未调用过端点。
在此处和Google上进行搜索时,我仅发现了各种尝试以异步方式获取响应,但是找不到针对此问题的解决方案。我不需要响应,这是一劳永逸的API调用。
浓缩问题
为什么API无法接收该调用,我该如何解决?
谢谢。
最佳答案
为了完成异步请求,WinHttpRequest
实例必须保持“事件”状态。
为此,您必须至少确保:
WinHttpReq
保留直到请求完成。 IE。在您的特定情况下,您不能在请求完成之前离开PostData
。或者,您需要将WinHttpReq
设置为全局变量(不是PostData
过程的局部变量)。 var
WinHttpReq: Variant;
procedure PostData(postural: String);
var
ReqContent: String;
begin
try
WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
ReqContent := 'item=value';
WinHttpReq.Open('POST', postUrl, true);
WinHttpReq.SetRequestHeader(
'Content-Type', 'application/x-www-form-urlencoded');
WinHttpReq.Send(ReqContent);
except
end;
end;