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, если только этот флаг не включен. Дополнительные накладные расходы на отключение и повторное подключение могут составлять дополнительное время.

Другие вопросы по тегам