如何在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;
额外排查点
- 确认API密钥和浏览器中使用的完全一致,无拼写错误。
- 若改用HTTPS,需在窗体上添加
TIdSSLIOHandlerSocketOpenSSL组件,并将HTTP.IOHandler指向该组件,同时确保OpenSSL的dll文件(libeay32.dll、ssleay32.dll或libcrypto-1_1.dll、libssl-1_1.dll)存在于程序目录中。
内容的提问来源于stack exchange,提问作者Blob Shblob
相关产品推荐
相关产品推荐

