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

使用Delphi 11.3 OAuth2调用REST接口时遇Unsupported Media Type错误求助

解决Delphi 11.3中POST JSON时的"unsupported media type"错误

你的问题出在请求体的配置方式和冗余的Authorization头设置上,以下是具体修正方案:

问题分析

  1. 冗余的Authorization头:OAuth2Authenticator1会自动将Bearer令牌注入请求头,手动重复添加可能导致头信息冲突或格式异常。
  2. 请求体参数配置错误:给REQUESTBODY类型的参数设置Name属性是不必要的,这会干扰服务器对请求体的解析逻辑。
  3. TStringList加载JSON的潜在风险:TStringList的Text属性可能引入额外换行符或编码问题,破坏JSON结构的完整性。

修正后的代码

var 
  JSONContent: string;
  JSONStream: TStringStream;
begin
  // 直接读取JSON文件,避免TStringList的格式干扰
  JSONStream := TStringStream.Create('', TEncoding.UTF8);
  try
    JSONStream.LoadFromFile('c:\temp\json.txt');
    JSONContent := JSONStream.DataString;
  finally
    JSONStream.Free;
  end;

  // 获取TOKEN
  OAuth2Authenticator1.ClientID     := 'xxx';
  OAuth2Authenticator1.ClientSecret := 'yyy';
  OAuth2Authenticator1.Scope := 'zzz';
  OAuth2Authenticator1.AccessTokenEndpoint := 'mylink';
  OAuth2Authenticator1.AuthorizeWithClientCredentials;

  RESTRequest1.Method  := rmPOST;
  RESTClient1.BaseURL := 'mylink2';
  RESTRequest1.Resource := 'myfunction';
  
  // 清除原有参数,避免冲突
  RESTRequest1.Params.Clear;

  // 配置请求体
  with RESTRequest1.Params.AddItem do
  begin
    Value := JSONContent;
    ContentType := TRESTContentType.ctAPPLICATION_JSON;
    Kind := TRESTRequestParameterKind.pkREQUESTBODY;
    // 移除Name属性,REQUESTBODY无需设置名称
  end;

  // 无需手动添加Authorization头,OAuth2Authenticator会自动处理
  RESTRequest1.Execute;
end;

额外建议

  • 推荐使用TJSONObject验证JSON结构的合法性,避免无效JSON导致的服务器错误:
    var JSONObj: TJSONObject;
    begin
      JSONObj := TJSONObject.ParseJSONValue(JSONContent) as TJSONObject;
      try
        // 此处可添加JSON结构校验逻辑
      finally
        JSONObj.Free;
      end;
    end;
    
  • 确保JSON文件采用UTF-8编码,避免服务器解析时出现编码不兼容问题。

内容的提问来源于stack exchange,提问作者lorife

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:22:30