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

Delphi中TIdHTTP POST长字符串出现异常换行问题求助

使用TIdHTTP发送multipart/form-data 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:03:39