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
相关产品推荐
相关产品推荐

