使用Delphi 11.3 OAuth2调用REST接口时遇Unsupported Media Type错误求助
解决Delphi 11.3中POST JSON时的"unsupported media type"错误
你的问题出在请求体的配置方式和冗余的Authorization头设置上,以下是具体修正方案:
问题分析
- 冗余的Authorization头:
OAuth2Authenticator1会自动将Bearer令牌注入请求头,手动重复添加可能导致头信息冲突或格式异常。 - 请求体参数配置错误:给REQUESTBODY类型的参数设置
Name属性是不必要的,这会干扰服务器对请求体的解析逻辑。 - 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
相关产品推荐
相关产品推荐

