Delphi TRESTRequest调用Freshdesk API授权失败求助
Delphi 11 TRESTRequest Freshdesk API 授权失败(Postman可正常工作)
你遇到的invalid_credentials错误通常是因为Delphi请求中的Basic Auth格式不符合Freshdesk要求,或者请求头设置有误。以下是具体的排查和修复方案:
核心原因分析
Freshdesk的Basic Auth要求是:将API密钥后跟冒号(API_KEY:)进行Base64编码,而非单纯编码API密钥。Postman在输入API密钥作为用户名、空密码时,会自动帮你添加冒号并完成编码,这是Delphi和Postman请求的关键差异点。
另外,你的代码中给Authorization头设置了ContentType := ctAPPLICATION_JSON,这是错误的——该属性仅用于请求体参数,HTTP头不需要此设置,可能导致头信息解析异常。
修复步骤
1. 重新生成正确的Base64编码字符串
将你的API密钥末尾添加冒号(例如your_api_key:),然后对这个完整字符串进行Base64编码。比如:
- 原始内容:
my_freshdesk_api_key: - Base64编码后:
bXlfZnJlc2hkc2tfYXBpX2tleTo=
2. 修正Delphi代码
移除Authorization头的ContentType设置,并确保请求头格式正确:
procedure TForm1.Button2Click(Sender: TObject); begin RESTClient1.BaseURL := 'https://bentley.freshdesk.com/api/v2/'; RESTRequest1.Method := TRESTRequestMethod.rmGET; RESTRequest1.Resource := 'solutions/categories'; RESTRequest1.Params.Clear; // 添加正确的Authorization头 with RESTRequest1.Params.AddItem do begin Name := 'Authorization'; // 确保edtApiKey的内容是`API_KEY:`的Base64编码,可加Trim避免多余空格 Value := 'Basic ' + Trim(edtApiKey.Text); Kind := pkHTTPHEADER; end; // 添加Accept头,明确要求JSON响应(可选但推荐) with RESTRequest1.Params.AddItem do begin Name := 'Accept'; Value := 'application/json'; Kind := pkHTTPHEADER; end; try RESTRequest1.Execute; // 此处可添加响应处理逻辑,例如解析RESTResponse1的内容 except on E: Exception do ShowMessage('请求失败: ' + E.Message); end; end;
额外排查建议
- 抓包对比请求头:用Fiddler等工具捕获Delphi和Postman发送的请求,对比Authorization头是否完全一致,确认没有多余字符或格式差异。
- 验证编码有效性:将生成的Base64字符串解码,检查是否还原为
API_KEY:的格式,确保编码过程无错误。 - 检查输入框内容:确保edtApiKey中没有意外的换行、空格或制表符,可在代码中用
Trim()处理输入内容。
内容的提问来源于stack exchange,提问作者Mark Lyder
相关产品推荐
相关产品推荐

