Delphi 10.3 Rio中TRESTRequest.AddParameter的poDoNotEncode选项问题
Delphi 10.3 Rio中TRESTRequest.AddParameter的poDoNotEncode选项失效问题解决
问题重现
你尝试通过TRESTRequest发送包含/字符的j_token请求头,查阅资料得知可通过poDoNotEncode选项避免编码,但实际测试中:
- 无论使用
AddParameter、Params.AddHeader还是Params.AddItem,j_token的值始终被编码为ga%2Fga,poDoNotEncode未生效 - 传递
[poDoNotEncode]时出现运行时错误:无法将变体数组转换为整数 - 传递
TRESTRequestParameterOptions.poDoNotEncode时出现编译错误:标识符未声明
错误原因分析
- 缺少必要单元引用:
TRESTRequestParameterOptions枚举和poDoNotEncode常量定义在REST.Types单元中,未引用该单元会导致编译错误。 - 参数类型不匹配:
AddParameter的最后一个参数是集合类型TRESTRequestParameterOptions,直接传递单个枚举值poDoNotEncode会导致类型不匹配,无法正确设置选项。 - 代码语法疏漏:示例代码中
RESTClient := TRESTClient.Create('http://127.0.0.1:5000/')末尾缺少分号,会引发编译错误。
解决方案
步骤1:引用必要单元
在代码的uses段中添加REST.Types单元:
uses REST.Client, REST.Types; // 必须包含REST.Types以识别枚举类型
步骤2:使用正确的参数添加方式
以下两种写法均可正确生效:
写法一:直接通过AddParameter传递集合选项
var RESTRequest : TRESTRequest; RESTClient : TRESTClient; Response : TRESTResponse; begin RESTClient := TRESTClient.Create('http://127.0.0.1:5000/'); // 补充分号 RESTRequest := TRESTRequest.Create(nil); try RESTRequest.Client := RESTClient; RESTRequest.Method := rmPOST; // 用集合包裹poDoNotEncode,匹配参数类型要求 RESTRequest.AddParameter('j_token', 'ga/ga', pkHTTPHEADER, [poDoNotEncode]); RESTRequest.Execute; Response := RESTRequest.Response; ShowMessage(Response.Content); finally RESTClient.Free; RESTRequest.Free; end; end;
写法二:先添加参数再设置选项
适合需要修改多个参数选项的场景:
var RESTRequest : TRESTRequest; RESTClient : TRESTClient; Response : TRESTResponse; Param: TRESTRequestParameter; begin RESTClient := TRESTClient.Create('http://127.0.0.1:5000/'); RESTRequest := TRESTRequest.Create(nil); try RESTRequest.Client := RESTClient; RESTRequest.Method := rmPOST; // 先添加请求头参数 Param := RESTRequest.Params.AddHeader('j_token', 'ga/ga'); // 将poDoNotEncode追加到参数的选项集合中 Param.Options := Param.Options + [poDoNotEncode]; RESTRequest.Execute; Response := RESTRequest.Response; ShowMessage(Response.Content); finally RESTClient.Free; RESTRequest.Free; end; end;
验证说明
使用上述写法后,j_token请求头的值会保持为ga/ga而非编码后的ga%2Fga,可通过自研API或抓包工具验证请求头内容。
内容的提问来源于stack exchange,提问作者Damky
相关产品推荐
相关产品推荐

