Delphi TIdHTTP POST очень медленный против GET
Delphi 2009
Недавно я переключился с нескольких запросов GET на один POST, который, на мой взгляд, был бы более эффективным, но он оказался намного медленнее. Прошло от 1-2 секунд до 8-10 секунд, и я не могу понять, почему.
пример
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdHTTP;
type
TForm4 = class(TForm)
d: TIdHTTP;
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
var m: tmemorystream;
data: tstringlist;
i: integer;
begin
memo1.Clear;
m:=tmemorystream.Create;
data:=tstringlist.Create;
data.Add(format('test1');
data.Add(format('test2');
d.Post('http://www.someurl.com/test.php', data, m);
m.Position:=0;
data.LoadFromStream(m);
memo1.Lines.Add('Received:');
for i := 0 to data.count - 1 do
memo1.Lines.Add(data[i]);
m.Free;
data.Free;
end;
end.
и на сервере
<?php
echo "1\n";
?>
2 ответа
Я сделал простой тест, используя разные URL:
d.Post('http://whatismyip.org', data, m); // Using DNS name
или же
d.Post('http://54.242.203.46', data, m); // Using IP
Сообщение заняло ~1 сек, поэтому я думаю, что ваша проблема может быть не связана с Indy. Мои предложения:
- Проверьте разрешение DNS на ПК. Попробуйте использовать IP-адрес, чтобы увидеть, есть ли разница;
- Попробуйте отправить запрос POST на тот же сайт, используя внешние инструменты (curl, vbscript и т. Д.) И измерьте время;
- Используйте инструменты мониторинга сети (Wireshark, MS Network Monitor и т. Д.), Чтобы узнать, сколько времени требуется серверу для ответа на ваш запрос POST или сколько времени клиент проводит между разрешающим адресом и фактическим запросом Post.
Эти шаги могут сузить, где проблема.
Если ничего из этого не помогло - попробуйте обновить Indy до последней версии.
Убедитесь, что hoKeepOriginalProtocol
флаг включен в TIdHTTP.HTTPOptions
имущество. По умолчанию, TIdHTTP.Post()
принудительно закрывает соединение каждый раз, когда оно вызывается, независимо от использования HTTP keep-alives, если только этот флаг не включен. Дополнительные накладные расходы на отключение и повторное подключение могут составлять дополнительное время.