Delphi中TIdHTTP POST长字符串出现异常换行问题求助
我用Delphi的TIdHTTP组件向Web服务发送multipart/form-data格式的POST请求并获取JSON响应,但发送的字符串在返回结果中出现了不应有的=\r\n换行符,而用Insomnia工具测试时字符串传输正常。
Delphi客户端代码
procedure TForm1.btnExecutarClick(Sender: TObject);var Data: TIdMultipartFormDataStream; resposta: TMemoryStream; vMensag : String; begin Memo1.Lines.Clear; try SSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2, sslvSSLv2, sslvSSLv23, sslvSSLv3]; HTTP.IOHandler := SSL; HTTP.HTTPOptions := HTTP.HTTPOptions + [hoNoProtocolErrorException, hoWantProtocolErrorContent, hoForceEncodeParams]; Data := TIdMultipartFormDataStream.Create; resposta := TMemoryStream.Create; vMensag:= 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam eget ' + 'ligula eu lectus lobortis condimentum. Aliquam nonummy auctor massa. ' + 'Pellentesque habitant morbi tristique senectus et netus et malesuada ' + 'fames ac turpis egestas. Nulla at risus. Quisque purus magna, auctor et, '+ 'sagittis ac, posuere eu, lectus. Nam mattis, felis ut adipiscing.'; Data.AddFormField('mensagem', vMensag); try HTTP.Request.Clear; HTTP.Request.Accept := 'multipart/form-data'; HTTP.Request.Charset := 'utf-8'; HTTP.Request.CacheControl := 'no-cache'; HTTP.Response.CharSet:= 'utf-8'; HTTP.Response.ContentType:= 'application/json'; HTTP.HandleRedirects := True; HTTP.Post('http://localhost/teste/server.php', Data, resposta); Memo1.Lines.BeginUpdate; try resposta.Position := 0; ReadStringsAsCharset(resposta, Memo1.Lines, HTTP.Response.Charset); Memo1.Lines.Add(Format('Response Code: %d', [HTTP.ResponseCode])); Memo1.Lines.Add(Format('Response Text: %s', [HTTP.ResponseText])); Memo1.Lines.Add(FStrList.Text); finally Memo1.Lines.EndUpdate; end; finally end; finally resposta.Free; Data.Free; end; end;
异常响应结果
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam eget
li=\r\ngula eu lectus lobortis condimentum. Aliquam nonummy auctor
massa. Pel=\r\nlentesque habitant morbi tristique senectus et netus et
malesuada fame=\r\ns ac turpis egestas. Nulla at risus. Quisque purus
magna, auctor et, s=\r\nagittis ac, posuere eu, lectus. Nam mattis,
felis ut adipiscing.
PHP服务端代码
<?php $usermens = ""; if (isset($_POST['mensagem'])) { $usermens= $_POST['mensagem']; } $dados = array('mensagem' => $usermens); header('Content-Type: application/json; charset=utf-8'); echo json_encode($dados); ?>
解决方案
问题根源是TIdMultipartFormDataStream默认会对长文本采用quoted-printable编码,这种编码会将超过一定长度的行拆分为多行,并在行尾添加=\r\n标记,导致服务端返回的字符串出现异常换行。
1. 禁用quoted-printable编码
修改添加表单字段的代码,显式指定编码方式为8bit,避免自动编码:
with Data.AddFormField('mensagem', vMensag) do begin ContentTransferEncoding := '8bit'; Charset := 'utf-8'; end;
或者直接在AddFormField中指定参数:
Data.AddFormField('mensagem', vMensag, 'utf-8', '', '', ctTextPlain);
2. 优化其他不必要的配置
- 将
HTTP.Request.Accept改为application/json,因为你实际期望接收JSON格式的响应,而非multipart/form-data - 移除
hoForceEncodeParams选项,该选项仅针对URL参数编码,不影响multipart/form-data的内容传输 - 不需要手动设置
HTTP.Response.ContentType,TIdHTTP会自动识别服务端返回的Content-Type
内容的提问来源于stack exchange,提问作者Rondinelle Brazolino

