如何在Inno Setup中完整保存WinHttp.WinHttpRequest.5.1的响应内容?
Inno Setup调用Web API获取完整响应内容的解决方法
优先方案:使用ResponseBody获取原始字节并保存
ResponseText出现截断的核心原因是它会对响应字节做文本编码解析,若API返回的字节流与WinHttpRequest默认编码不兼容,就可能丢失末尾字符。直接使用ResponseBody获取原始字节数组,能完全保留响应内容,和C#调用结果一致。
以下是完整的Inno Setup脚本示例:
procedure SaveApiResponseToFile(const ApiUrl, TargetFilePath: string); var WinHttp: Variant; RawResponse: Variant; FileStream: TFileStream; ByteIndex: Integer; begin // 创建WinHttpRequest对象 WinHttp := CreateOleObject('WinHttp.WinHttpRequest.5.1'); // 发起同步GET请求 WinHttp.Open('GET', ApiUrl, False); WinHttp.Send; // 检查请求状态 if WinHttp.Status = 200 then begin // 获取原始响应字节数组 RawResponse := WinHttp.ResponseBody; // 创建文件流并写入字节 FileStream := TFileStream.Create(TargetFilePath, fmCreate); try for ByteIndex := VarArrayLowBound(RawResponse, 1) to VarArrayHighBound(RawResponse, 1) do begin FileStream.WriteBuffer(RawResponse[ByteIndex], 1); end; finally FileStream.Free; end; end else begin MsgBox('API请求失败,状态码: ' + IntToStr(WinHttp.Status), mbError, MB_OK); end; end; // 在安装流程中调用示例 procedure CurStepChanged(CurStep: TSetupStep); begin if CurStep = ssInstall then begin SaveApiResponseToFile('https://your-api-url/endpoint', ExpandConstant('{tmp}\MyFileName.txt')); end; end;
关于异步读取ResponseText的说明
WinHttpRequest支持异步模式(将Open方法第三个参数设为True),并通过OnResponseDataAvailable事件接收响应内容,但实现复杂且没必要——因为上述ResponseBody方案已经彻底解决了截断问题,且代码更简洁可靠。如果非要尝试异步,需要绑定事件处理函数并处理多线程逻辑,反而增加出错概率。
内容的提问来源于stack exchange,提问作者Christian Cascone
相关产品推荐
相关产品推荐

