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

Delphi WebBroker处理含百分号的JSON字符串报错的解决咨询

解决Delphi WebBroker读取含百分号%的POST JSON异常问题

问题原因

Delphi WebBroker的TWebRequest.Content属性默认会自动尝试解码URL编码格式的内容,当JSON中出现单独的%(而非标准的%XX编码格式)时,解码逻辑会判定为无效编码,抛出Error decoding URL style (%XX) encoded string异常。

解决方案

方案1:后端禁用自动解码

直接修改TWebRequest的ContentEncoding属性为空字符串,告知WebBroker不要对请求内容做自动解码处理:

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  RequestContent :string;
begin
  Request.ContentEncoding := ''; // 关闭自动解码
  RequestContent := Request.Content;
  // 后续处理JSON内容
end;

方案2:读取原始请求流

绕过TWebRequest.Content的自动解码逻辑,直接从底层请求流读取原始内容:

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  RequestContent: string;
  Buffer: array[0..4095] of Char;
  BytesRead: Integer;
begin
  RequestContent := '';
  repeat
    BytesRead := Request.ReadClient(Buffer, SizeOf(Buffer)-1);
    if BytesRead > 0 then
    begin
      Buffer[BytesRead] := #0;
      RequestContent := RequestContent + Buffer;
    end;
  until BytesRead = 0;
  // 后续处理原始JSON内容
end;

方案3:前端标准编码百分号

如果前端可控,发送JSON前将单独的%替换为URL编码的%25,这样WebBroker自动解码后会还原为%,符合编码规范:

// 前端处理示例
const jsonData = { user_name: "lined%" };
// 对百分号做标准URL编码
const encodedJson = JSON.stringify(jsonData).replace(/%/g, "%25");
fetch('/your-api-endpoint', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: encodedJson
});

方案选择建议

  • 若前端不可控,优先用方案1(代码简洁)或方案2(直接读取原始数据);
  • 若前后端都可控,方案3是最标准的做法,符合URL编码规范,避免后续类似编码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 07:24:23