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

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时出现编译错误:标识符未声明

错误原因分析

  1. 缺少必要单元引用:TRESTRequestParameterOptions枚举和poDoNotEncode常量定义在REST.Types单元中,未引用该单元会导致编译错误。
  2. 参数类型不匹配:AddParameter的最后一个参数是集合类型TRESTRequestParameterOptions,直接传递单个枚举值poDoNotEncode会导致类型不匹配,无法正确设置选项。
  3. 代码语法疏漏:示例代码中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:10:36