You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:10:38