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

如何在Lazarus/Delphi程序中对接VoiceRSS API?调用时报错求助

解决TIdHTTP调用VoiceRSS API报错的问题

针对你遇到的问题,以下是具体的排查和解决方法:

可能的原因及解决步骤

  • User-Agent被拦截:多数API会校验请求的User-Agent标识,TIdHTTP默认的标识可能被服务器拒绝。解决方法是给请求设置浏览器风格的User-Agent。
  • 参数未URL编码:当src参数包含空格、逗号等特殊字符时,服务器无法正确解析,而浏览器会自动编码参数,但TIdHTTP不会,需要手动处理。
  • 未捕获详细错误信息:直接抛出的异常可能无法体现API返回的具体错误(如密钥无效、配额不足),需要捕获HTTP协议异常查看详情。
  • 协议问题:部分API已强制HTTPS,尝试将请求URL的http改为https,同时确保Indy的SSL组件(TIdSSLIOHandlerSocketOpenSSL)已正确配置。

修改后的代码

procedure TForm1.Button1Click(Sender: TObject);
var
  HTTP: TIdHTTP;
  AudioFilePath: string;
  AudioFileContent: TMemoryStream;
  APIKey, Language, Text: string;
  RequestURL: string;
begin
  AudioFilePath := 'speech.wav';
  APIKey := '1234567890QWERTY';
  Language := 'en-us';
  Text := 'Hello, world!';

  HTTP := TIdHTTP.Create(nil);
  AudioFileContent := TMemoryStream.Create;
  try
    // 模拟浏览器的User-Agent,避免被服务器拦截
    HTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36';
    // 对文本参数进行URL编码,处理特殊字符
    Text := HTTP.URL.URLEncode(Text);
    // 拼接规范的请求URL
    RequestURL := Format('http://api.voicerss.org/?key=%s&hl=%s&src=%s', [APIKey, Language, Text]);

    try
      HTTP.Get(RequestURL, AudioFileContent);
      // 确认获取到有效内容后再保存
      if AudioFileContent.Size > 0 then
      begin
        AudioFileContent.Position := 0;
        AudioFileContent.SaveToFile(AudioFilePath);
        ShowMessage('音频文件保存成功!');
      end
      else
        ShowMessage('未获取到有效音频内容');
    except
      on E: Exception do
      begin
        ShowMessage('请求出错:' + E.Message);
        // 查看API返回的具体错误信息
        if E is EIdHTTPProtocolException then
        begin
          ShowMessage('API返回错误:' + TIdHTTPProtocolException(E).ErrorMessage);
        end;
      end;
    end;
  finally
    AudioFileContent.Free;
    HTTP.Free;
  end;
end;

额外排查点

  1. 确认API密钥和浏览器中使用的完全一致,无拼写错误。
  2. 若改用HTTPS,需在窗体上添加TIdSSLIOHandlerSocketOpenSSL组件,并将HTTP.IOHandler指向该组件,同时确保OpenSSL的dll文件(libeay32.dll、ssleay32.dll或libcrypto-1_1.dll、libssl-1_1.dll)存在于程序目录中。

内容的提问来源于stack exchange,提问作者Blob Shblob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:10:27