Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2014, 11:08   #1
TUberwer
Форумчанин
 
Регистрация: 01.07.2013
Сообщений: 221
По умолчанию Synapse Post запрос возвращает пустой код ошибки

Всем доброго времени суток.

Мне нужно делать около 100-300 пост запросов.
Делаю их в цикле.
Когда делаю в основном потоке программы, то все работает.
Но если я делаю это в каком-то второстепенном потоке, который создается прямо во время программы, то сразу все работает, и запросы отправляются, но через случайное количество времени появляется ошибка при запросе,
когда я получаю код ошибки, то там пустота.(другие коды ошибок показывает, а именно в этом случае я даже не могу понять что за ошибка)
Код:
while numberrr < 100 do //цикл 
begin
     FSend.MimeType :='application/x-www-form-urlencoded';  // FSend - thttpsend
     TT.Clear;                                                                  // TT - TStringList
     TT.Add('authenticity_token='+auth_token);                    //добавляем нужные параметры
     TT.Add('tweet[text]=proverka');                                   //добавляем нужные параметры
     TT.Add('commit=Твитнуть');                                         //добавляем нужные параметры
     Post('https://сайт', TT);            //функция Post ниже.
     inc(numberrr);
     sleep(10000);
end;
и функция пост:
Код:
function tmythread.POST(AUrl: string; AParams: TStringList): string;
  var Stream: TStringStream;
      RedirectUrl: string;
      i: integer;
begin
  try
    Stream:=TStringStream.Create('');
    try
      FSend.Headers.Clear;                 //fsend - httpsend
      FSend.Document.Clear;
      if FReferer<>'' then FSend.Headers.Add('Referer: '+FReferer);
      for i := 0 to AParams.Count-1 do
      if i=0 then
        Stream.WriteString(AParams[i]) else
          Stream.WriteString('&'+AParams[i]);
      FSend.Document.LoadFromStream(Stream);
      if FSend.HTTPMethod('POST',AUrl) then                       // Вот именно на этой строчке появляется ошибка, 
   //точнее не ошибка появляется, а просто запрос не выполняется, и возвращает ошибку без кода. код - ""
      begin
        FSend.Document.SaveToStream(Stream);
        Result:=Stream.DataString;
        RedirectUrl:=GetRedirectUrl;             //GetRedirectUrl - функция для получение редиректа, тут не играет никакой роли
        if RedirectUrl<>'' then
          Result:=GET(RedirectUrl);                       //get - функция для гет запроса, но тут не играет никакой роли
      end else raise Exception.Create(GetError);
    finally
      Stream.Free;
    end;
  except
    on E: Exception do
      raise Exception.Create('TDHttp.POST('+AUrl+'): '+E.Message);
  end;
end;
Получается что через сколько-то запросов, запрос возвращает ошибку - "" (пустую).
Может кто-то сталкивался?
Повторюсь, что если делаю все в основном потоке, то все работает, вот код где все работает, хотя там немного по другому, код стоит на таймере в 10 секунд:
Код:
procedure Tbymorgun.Timer1Timer(Sender: TObject);
var
  PostData: string;
begin
  if auth_status = true then begin
 
    http.FSend.MimeType :='application/x-www-form-urlencoded';     
    T.Clear;
    T.Add('authenticity_token='+auth_token);
    T.Add('tweet[text]=test');
    T.Add('commit=Твитнуть');
 
    http.Post('https://сайт/', T);    //функция post такая же
     inc(numberrr);
  end else showmessage('Error');
end;
Даже если вы не знаете, можете хоть свои какие-то догадки сказать? не знаю что делать, сижу на этой ошибке долго уже(
Изображения
Тип файла: jpg Снимок5.jpg (26.3 Кб, 111 просмотров)

Последний раз редактировалось Stilet; 06.09.2014 в 10:36.
TUberwer вне форума Ответить с цитированием
Старый 06.09.2014, 05:00   #2
Paskal1
Пользователь
 
Аватар для Paskal1
 
Регистрация: 22.10.2010
Сообщений: 69
По умолчанию

Догадка
У тя таймер - постваь ему больше времени по ходу сервак тебе не успевает ответить
очень быстро таймер крутит.
Paskal1 вне форума Ответить с цитированием
Старый 06.09.2014, 10:40   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

М.м.м... Есть одна догадка...
У тебя в потоках используется без синхронизации один и тот же компонент: FSend.
Вызов одного потока задает компоненту задачу. А тут приходит вызов второго, который тоже задает ему же задачу. Компонент не может понять что ему делать.
Рекомендую обьявить внутри потока локальную переменку с типом этого компонента. Там же его создавать (экземпляр класса всмысле) и там же его очищать в конце процедуры. Тогда каждый поток у тебя будет иметь свою ниточку в интернет и не будет мешать другому.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При ошибки POST запроса ответ пустой Smagulov85 Работа с сетью в Delphi 14 30.07.2014 22:08
Возвращает пустой массив Mr_freeman JavaScript, Ajax 4 14.10.2013 13:41
Synapse. POST запрос. sxcine Работа с сетью в Delphi 2 22.06.2012 10:37
Post запрос через Synapse Lauri Общие вопросы Delphi 11 22.03.2011 12:18
Переделать код с Delphi на C#. Post запрос и т.д. Casper-SC Общие вопросы .NET 3 07.05.2010 02:26