官方THTTPClient.Post方法【低级、严重】bug — 需留意

我一直都在寻找各种业务功能的最简单写法,用减法的模式来开发软件。如果有比我的写法更简单的方法,请留言告知。

事情经过:

今日下午用THTTPClient.Post方法 提交的时候,服务端老是自动过滤掉,百思不得其解。花费近2小时调试 检查了很多遍程序 依然不行。于是就开始怀疑

THttpClient的问题,我切换成indy的IdHTTP 果然可以了,那问题出在哪里呢,于是开始 断点到 THTTPClient.Post 方法内部去看,发现了官方的一个非常

低级的Bug,这个bug从THttpClient被发明至今 一直都还存在!!!!已证明:delphi 10、10.1、10.1.2、10.2 都没修复!!!;我决定写篇博客

希望能帮助到网友们。

官方的方法声明:

    /// <summary>Post TStrings values adding multipart info</summary>
    function Post(const AURL: string; const ASource: TStrings; const AResponseContent: TStream = nil;
      const AEncoding: TEncoding = nil; const AHeaders: TNetHeaders = nil): IHTTPResponse; overload;

 

下面以实例来说明:

procedure TForm4.Button1Click(Sender: TObject);
var
  MyList: TStringList;
  MyHTTPClient: THTTPClient;
  MyJson: string;
begin
  MyList := TStringList.Create;
  MyHTTPClient := THTTPClient.Create;
  try
    MyList.Values['qdac'] := 'https://blog.qdac.cc';
    MyList.Values['age'] := '4';

    //注意第四个参数TEncoding.UTF8
    MyJson := MyHTTPClient.Post('https://blog.qdac.cc', MyList, nil, TEncoding.UTF8, nil).ContentAsString(TEncoding.UTF8);
    Memo1.Lines.Add(MyJson);
  finally
    MyList.Free;
    MyHTTPClient.Free;
  end;
end;

如上代码,我们断点到Post方法内部看看:

 

我们接下来看看 官方的EncodingNameToHttpEncodingName 这个方法做了什么:

答案是啥也没干,官方写程序的时候空了一行,睡着了,忘记写代码了!!

解决方法,如果用UTF-8的话,那么就让其默认去吧:

MyJson := MyHTTPClient.Post('https://blog.qdac.cc', MyList).ContentAsString(TEncoding.UTF8);

若不是UTF-8,或许有多重方法,我征集下,谁有方法 可以贴下面;我会更新到这篇博客上;

分享到: