如何通过Clever Internet Suite获取响应正文
问题根因
乱码及无法正确提取响应正文是编码不匹配、组件默认响应解析逻辑干扰两个原因导致的,Fiddler可抓到完整内容说明请求链路正常,问题出在本地流解析环节。
解决步骤
- 第一步:调整clHttp组件基础配置,禁用默认的自动解析逻辑
配置以下两个属性,避免组件提前篡改响应流内容:// 禁用组件默认的响应解析逻辑,避免自动转码错误 clHttp.ParseResponse := False; // 排查阶段先关闭gzip压缩,确认原始内容正常后再按需开启解压逻辑 clHttp.AllowGzipEncoding := False; - 第二步:替换TStringStream为TMemoryStream,手动按响应编码转换字符串
TStringStream的DataString属性默认使用当前系统ANSI编码转换字节,与服务端返回的UTF-8/GB2312等编码不匹配是乱码的核心原因,修改代码如下:procedure ... var ResponseStream: TMemoryStream; ResponseBytes: TBytes; Charset, ResponseStr: string; begin ResponseStream := TMemoryStream.Create; try clHttp.Post(aUrl, clHttpRequest, ResponseStream); // 从响应头读取服务端指定的编码格式 Charset := clHttp.Response.Header.ContentType.Charset; // 若响应头未返回编码,可根据目标站点特性手动指定,常用值为'UTF-8'或'GB2312' if Charset = '' then Charset := 'UTF-8'; // 读取完整响应字节并按指定编码转字符串 SetLength(ResponseBytes, ResponseStream.Size); ResponseStream.Position := 0; ResponseStream.ReadBuffer(ResponseBytes[0], ResponseStream.Size); ResponseStr := TEncoding.GetEncoding(Charset).GetString(ResponseBytes); Memo.Lines.Add(ResponseStr); finally ResponseStream.Free; end; end; - 第三步:gzip压缩场景额外处理
如需开启gzip压缩提升传输效率,开启clHttp.AllowGzipEncoding := True后,需先判断clHttp.Response.Header.ContentEncoding为gzip时,先用clGzip组件解压响应字节流,再执行编码转换。
内容的提问来源于stack exchange,提问作者RAT-Daddy
相关产品推荐
相关产品推荐

