我一直都在寻找各种业务功能的最简单写法,用减法的模式来开发软件。如果有比我的写法更简单的方法,请留言告知。
事情经过:
今日下午用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);