如何在Delphi中调用Dynamics 365 OData接口获取用户列表并配置TRESTRequest
如何用Delphi的TRESTRequest调用Dynamics 365 OData获取用户列表
嘿,既然你已经搞定了认证拿到access token,那剩下的配置其实就很顺了,我来一步步给你拆解怎么弄:
核心组件准备
首先你需要三个Delphi REST组件:TRESTClient、TRESTRequest、TRESTResponse——可以在设计时拖到窗体上,也可以在代码里动态创建,看你习惯。
配置步骤
1. 配置TRESTClient
把它的BaseURL设为D365 OData的根地址,注意去掉URL里多余的空格:
RESTClient1.BaseURL := 'https://mytenantcode.crmserver.dynamics.com/api/data/v8.2/'; RESTClient1.ContentType := 'application/json'; // 指定返回JSON格式
2. 配置TRESTRequest
这是核心部分,要设置请求方法、资源路径,最重要的是带上认证头:
- 设置请求方法为
rmGET Resource设为你要查询的实体和OData参数(注意把URL里的&换成&,代码里不需要HTML转义):RESTRequest1.Resource := 'systemusers?$select=systemuserid,lastname,firstname,title&$top=3';- 关联Client和Response:
RESTRequest1.Client := RESTClient1; RESTRequest1.Response := RESTResponse1;
3. 添加认证头和必要请求头
一定要把拿到的access token放到Authorization头里,格式是Bearer + 空格 + token,同时加上Accept头确保返回JSON:
RESTRequest1.Params.Clear; RESTRequest1.Params.AddHeader('Authorization', 'Bearer ' + YourAccessToken); RESTRequest1.Params.AddHeader('Accept', 'application/json');
完整代码示例(设计时组件版)
procedure TForm1.btnGetUsersClick(Sender: TObject); var LAccessToken: string; LJsonObj: TJSONObject; LValueArr: TJSONArray; LUserObj: TJSONObject; begin // 假设你已经通过认证流程获取到了有效的access token LAccessToken := '你的实际access_token内容'; // 配置RESTClient RESTClient1.BaseURL := 'https://mytenantcode.crmserver.dynamics.com/api/data/v8.2/'; RESTClient1.ContentType := 'application/json'; // 配置RESTRequest RESTRequest1.Method := rmGET; RESTRequest1.Resource := 'systemusers?$select=systemuserid,lastname,firstname,title&$top=3'; RESTRequest1.Client := RESTClient1; RESTRequest1.Response := RESTResponse1; // 添加请求头 RESTRequest1.Params.Clear; RESTRequest1.Params.AddHeader('Authorization', 'Bearer ' + LAccessToken); RESTRequest1.Params.AddHeader('Accept', 'application/json'); try // 执行请求 RESTRequest1.Execute; // 先把原始响应内容显示出来(方便调试) Memo1.Lines.Clear; Memo1.Lines.Add('原始响应:'); Memo1.Lines.Add(RESTResponse1.Content); Memo1.Lines.Add('------------------------'); // 解析JSON响应,提取用户信息 LJsonObj := TJSONObject.ParseJSONValue(RESTResponse1.Content) as TJSONObject; if Assigned(LJsonObj) then try LValueArr := LJsonObj.GetValue<TJSONArray>('value'); if Assigned(LValueArr) then begin Memo1.Lines.Add('解析后的用户列表:'); for var I := 0 to LValueArr.Count - 1 do begin LUserObj := LValueArr.Items[I] as TJSONObject; Memo1.Lines.Add(Format('ID: %s | 姓名: %s %s | 职位: %s', [ LUserObj.GetValue<string>('systemuserid'), LUserObj.GetValue<string>('firstname'), LUserObj.GetValue<string>('lastname'), LUserObj.GetValue<string>('title') ])); end; end; finally LJsonObj.Free; end; except on E: Exception do ShowMessage('请求失败: ' + E.Message); end; end;
常见坑和注意点
- Token有效性:如果遇到401 Unauthorized错误,先检查token是否过期,或者是否拥有访问
systemusers实体的权限 - URL格式:一定要去掉URL里的多余空格,比如你原来的
https:// mytenantcode . crmserver .dynamics.com要改成无空格的版本 - OData版本:如果你的D365用的不是v8.2,要换成对应的版本号(比如v9.1)
- 响应格式:一定要设置
Accept: application/json,否则D365可能返回XML格式,解析会出错
内容的提问来源于stack exchange,提问作者SiBrit
相关产品推荐
相关产品推荐

