Delphi 11如何创建本地HTTP监听器接收Xero返回数据?
Delphi 11 创建本地HTTP监听器接收Xero回调数据
在Delphi 11中,最便捷的方式是利用自带的Indy组件库里的TIdHTTPServer搭建本地HTTP监听器,无需额外安装第三方库,具体步骤如下:
1. 准备组件
打开Delphi 11窗体设计器,从组件面板的Indy Servers分类中拖放一个TIdHTTPServer到窗体(可命名为IdHTTPServer1)。
2. 配置服务器基本属性
- 设置
DefaultPort为你重定向URI中指定的端口(比如3000,必须和Xero应用配置的重定向URI端口一致) - 可在程序初始化时手动启动监听:
IdHTTPServer1.Active := True;,也可直接在设计器将Active设为True
3. 处理Xero回调请求
双击TIdHTTPServer生成OnCommandGet事件处理函数,在这里解析并处理Xero返回的参数:
procedure TMainForm.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var AuthCode: string; StateVal: string; begin // 提取Xero返回的授权码和状态参数 AuthCode := ARequestInfo.Params.Values['code']; StateVal := ARequestInfo.Params.Values['state']; // 执行业务逻辑:比如用授权码换取access token if AuthCode <> '' then begin // 将授权码存入全局变量或传递给处理函数 GlobalXeroAuthCode := AuthCode; // 操作UI需保证线程安全 TThread.Synchronize(nil, procedure begin ShowMessage('已获取授权码:' + AuthCode); // 处理完成后关闭服务器释放资源 IdHTTPServer1.Active := False; end); end; // 返回页面提示用户操作完成 AResponseInfo.ContentText := '<html><body><h1>授权成功</h1><p>可关闭此浏览器窗口</p></body></html>'; AResponseInfo.ContentType := 'text/html'; end;
4. 关键注意事项
- 端口占用检查:启动前可通过
TIdTCPClient尝试连接端口,避免因端口被占用导致启动失败 - 权限问题:使用1024以下端口需管理员权限运行程序,建议选用1024以上端口(如3000、8080)
- 线程安全:
OnCommandGet事件在Indy工作线程中执行,操作UI控件必须用TThread.Synchronize或TThread.Queue - 资源释放:处理完回调后及时关闭HTTP服务器,避免长期占用系统资源
替代方案:Windows HTTP API
若不想依赖Indy,可直接调用Windows WinHTTP API实现监听,核心是通过HttpInitialize、HttpCreateHttpHandle、HttpReceiveHttpRequest等函数完成请求处理,但代码复杂度更高,适合熟悉系统API的开发者。
内容的提问来源于stack exchange,提问作者Paul Coshott
相关产品推荐
相关产品推荐

