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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:55:05