Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];

Вниз

Програмно сделать GET запрос веб серверу и получить ответ.   Найти похожие ветки 

 
@!!ex ©   (2009-05-19 19:06) [0]

Как проще всего сделать?


 
clickmaker ©   (2009-05-19 19:11) [1]

> проще всего

TIdHttp

или функции WinInet


 
@!!ex ©   (2009-05-19 19:13) [2]

Ага. Нашел пример на WinInet. а можно получить файл в буффера, а не на винчестер?


 
clickmaker ©   (2009-05-19 19:18) [3]

а как в примере сразу на винчестер?


 
@!!ex ©   (2009-05-19 19:29) [4]

var
 FileOnNet, LocalFileName: string
begin
 FileOnNet := "http://its_your_site.ru/library/DelphiWorld.zip";
 LocalFileName := "C:\DelphiWorld.zip";

 if GetInetFile(FileOnNet, LocalFileName) = True then
   ShowMessage("Download successful")
 else
   ShowMessage("Error in file download");
end;


 
clickmaker ©   (2009-05-19 19:34) [5]

> GetInetFile

а что это за функция?

собственно, апишная InternetReadFile и читает в буфер


 
@!!ex ©   (2009-05-19 20:22) [6]

Точно! Я не обратил внимание на другую страницу с кодом.
Там как раз GetInetFile и реализовано.


 
@!!ex ©   (2009-05-19 20:59) [7]

Написал функцию... она отрабатывает только ОДИН раз!
При повторных вызовах возвращается старое значение:
function GetTextFileFromHTTP(const fileURL: string): string;
const
 BufferSize = 1024;
var
 hSession, hURL: HInternet;
 Buffer: array[1..BufferSize] of char;
 s:string;
 BufferLen: DWORD;
 f: file;
 sAppName: string;
begin
 Result := "";
 sAppName := ExtractFileName(Application.ExeName);
 hSession := InternetOpen(PChar(sAppName),
 INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
 try
   hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
   try
     repeat
       InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
       s:=Buffer;
       SetLength(s,BufferLen);
       Result:=Result+s;
     until
       BufferLen = 0;
   finally
     InternetCloseHandle(hURL);
   end;
 finally
   InternetCloseHandle(hSession);
 end;
end;


 
Zeqfreed ©   (2009-05-19 21:05) [8]

Кэшируется вестимо.


 
@!!ex ©   (2009-05-19 21:05) [9]

Я так и понял... А как этого избежать?


 
@!!ex ©   (2009-05-19 21:07) [10]

Нашел такой пример:
Uses WinINet;  
и добавить к TButton следующий обработчик btnEmptyCache:  
Procedure TfrmMain.btnEmptyCacheClick( Sender : TObject );  
Var  
   lpEntryInfo : PInternetCacheEntryInfo;  
   hCacheDir   : LongWord;  
   dwEntrySize : LongWord;  
   dwLastError : LongWord;  
Begin  
   dwEntrySize := 0;  
   FindFirstUrlCacheEntry( NIL, TInternetCacheEntryInfo( NIL^ ), dwEntrySize );  
   GetMem( lpEntryInfo, dwEntrySize );  
   hCacheDir := FindFirstUrlCacheEntry( NIL, lpEntryInfo^, dwEntrySize );  
   If ( hCacheDir <> 0 ) Then  
       DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName );  
   FreeMem( lpEntryInfo );  
   Repeat  
       dwEntrySize := 0;  
       FindNextUrlCacheEntry( hCacheDir, TInternetCacheEntryInfo( NIL^ ), dwEntrySize );  
       dwLastError := GetLastError();  
       If ( GetLastError = ERROR_INSUFFICIENT_BUFFER ) Then Begin  
           GetMem( lpEntryInfo, dwEntrySize );  
           If ( FindNextUrlCacheEntry( hCacheDir, lpEntryInfo^, dwEntrySize ) ) Then  
               DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName );  
           FreeMem(lpEntryInfo);  
       End;  
   Until ( dwLastError = ERROR_NO_MORE_ITEMS );  
End;


 
@!!ex ©   (2009-05-19 21:09) [11]

одной строчки достаточно:
DeleteUrlCacheEntry( ГКД);


 
@!!ex ©   (2009-05-19 21:09) [12]

ГКД == URL


 
Zeqfreed ©   (2009-05-19 21:10) [13]

InternetOpenUrl + INTERNET_FLAG_PRAGMA_NOCACHE, INTERNET_FLAG_NO_CACHE_WRITE может быть проще? :)

Вообще по-моему использовать этот API экплореровский более геморно, чем послать две строчки по сокету.


 
DVM ©   (2009-05-19 21:31) [14]


> Zeqfreed ©   (19.05.09 21:10) [13]


> Вообще по-моему использовать этот API экплореровский более
> геморно, чем послать две строчки по сокету.

Полностью согласен. Мне вообще непонятно, зачем этот API наворотили сверху. Он не шибко упрощает, а скорее усложняет работу с HTTP.


 
@!!ex ©   (2009-05-19 21:39) [15]

Работа с сетью для меня темный лес, спросил совета, мне ответили. Нашел решение, сделал. :)
Может и лучше сделать на АПИ - но знаний нету...
А это вроде справляется с работой.


 
DVM ©   (2009-05-19 21:42) [16]


> @!!ex ©   (19.05.09 21:39) [15]

А через TIdHttp вообще то же самое чуть ли не одной строкой делается.


 
@!!ex ©   (2009-05-19 21:48) [17]

Ага. Вот только я не знаю где его брать в Explorer"e


 
DVM ©   (2009-05-19 21:50) [18]


> Ага. Вот только я не знаю где его брать в Explorer"e

Там Indy нету что ли? Не знал. Но это тоже не проблема, скачиваешь инди, папочку добавляешь в пути поиска, динамически создаешь его.


 
@!!ex ©   (2009-05-19 21:52) [19]

ИНди вроде ставится, но куда и как - я без понятия.
Было два варианта, попробовал и сделал тем, который проще получился.

Подскажите статей по реализации обмена сообщениями через UDP.


 
@!!ex ©   (2009-05-19 21:52) [20]

Интересует максимально быстрый способ. Поэтому всякие компоненты использовать не хочется...


 
DVM ©   (2009-05-19 22:02) [21]


> Подскажите статей по реализации обмена сообщениями через
> UDP.

Сообщения сообщениям рознь. Что за сообщения? Нужен ли контроль доставки пакета? Максимально быстро - это без какого либо контроля. На Winsock.


 
тимохов ©   (2009-05-19 22:11) [22]

пользуй wininet. у розыча на сайте есть пример, вполне рабочий.


 
Сергей М. ©   (2009-05-19 22:20) [23]


> максимально быстрый способ. Поэтому всякие компоненты использовать
> не хочется


Задержки, вносимые работой компонентных оболочек UDP-транспорта, ничтожно малы по сравнению со скоростью работы самого транспорта в реальных сетевых условиях.


 
turbouser ©   (2009-05-19 22:23) [24]


> @!!ex ©   (19.05.09 21:52) [19]


> Подскажите статей по реализации обмена сообщениями через
> UDP.

UDP не предназначен для этого.
Расстреливать на месте надо чатописателей, использующих UDP...


 
DVM ©   (2009-05-19 22:28) [25]


> turbouser ©   (19.05.09 22:23) [24]


> UDP не предназначен для этого.

C чего ты взял что ему для чата? А почему бы и нет собственно? Какая разница UDP или TCP. Гарантии доставки только нет.


 
@!!ex ©   (2009-05-19 22:33) [26]


> [21] DVM ©   (19.05.09 22:02)
> Максимально быстро - это без какого либо контроля. На Winsock.

Именно поэтому UDP, а не TCP. Потеря пакетов не критична, скорость приоритетна.


> [22] тимохов ©   (19.05.09 22:11)
> пользуй wininet. у розыча на сайте есть пример, вполне рабочий.

А насколько это быстро по скорости?


> [23] Сергей М. ©   (19.05.09 22:20)
> Задержки, вносимые работой компонентных оболочек UDP-транспорта,
> ничтожно малы по сравнению со скоростью работы самого транспорта
> в реальных сетевых условиях.

Понятно...

> [24] turbouser ©   (19.05.09 22:23)


> [25] DVM ©   (19.05.09 22:28)

Ганатия доставки в моем случае ЗЛО.
Потеря половины пакетов меньшее зло, чем задержка из-за потерянного пакета и в результате доставка устаревшего пакета.


 
DVM ©   (2009-05-19 22:36) [27]


> @!!ex ©   (19.05.09 22:33) [26]


> Ганатия доставки в моем случае ЗЛО.

Обмен информацией в сетевой игре это что ли?


 
тимохов ©   (2009-05-19 22:37) [28]

2Автор, тебе же сказали - любой компонент вносит сотые доли процента в общую скорость - все остальное сетевая передача.

wininet - это библиотека, используемая в IE.


 
@!!ex ©   (2009-05-19 22:40) [29]

> [27] DVM ©   (19.05.09 22:36)

Да. Собственно первая часть вопроса нужна была чтобы получить список доступных игровых серверов, который лежит на сервере в виде текстового файла.

Информация игровая обновляется 5 раз в секунду. Соответственно уходит 5 пакетов в секунду.
Если половина сдохнет, будет задержка в отображении. Что не есть страшно в моем случае.
Это от клиента к серверу.

В другую сторону(от сервера к клиенту) потеря страшнее, поэтому данные уходят и через пол секунды независимо от результата дублируются. Вероятность достваки в два раза выше, а дубль никакой роли не играет.


 
@!!ex ©   (2009-05-19 22:41) [30]

> [28] тимохов ©   (19.05.09 22:37)

а дайте ссылку на сайт _Rouse?


> [21] DVM ©   (19.05.09 22:02)
> На Winsock

А можно пример?


 
DVM ©   (2009-05-19 22:50) [31]


> @!!ex ©   (19.05.09 22:41) [30]


> А можно пример?

Примера у меня нет, может тебе почитать о сокетах для начала чего, чтоб понятнее стало. Вот например, Григорьева:

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1060


 
@!!ex ©   (2009-05-19 23:36) [32]

> [31] DVM ©   (19.05.09 22:50)

Спасибо! Читаю! Очень интересно и понятно написанО!


 
тимохов ©   (2009-05-19 23:46) [33]

2Автор. Не страдай фигней и не делай своего клиента HTTP. Поверь, нормального ты не сделаешь. Ты знаешь сколько проксей может быть на твоем пути к серверу? Ты знаешь все методы авторизации? Ты знаешь, сколько методов передачи данных от сервера к тебе? Ты знаешь, чем отличается http 1.1. от 1.0? Ты читал спецификацию 2616 (http://www.ietf.org/rfc/rfc2616.txt - почитай и ужаснись сколько нужно сделать, чтобы сделать качественно клиента для Http)?

Поверь там очень много тонкостей. Есть сервера, которые отдают данные чанками (кусками), есть которые передают длину. И тебе придется это все изучать и реализовывать (если ты хочешь более менее универсальное средство).

Бери пример Розыча (то ли первый,то ли второй пример отсдедова http://rouse.drkb.ru/network.php#proxyload) и в путь. WinINet прекрасно знает все прокси и т.д. Я долго выбирал HTTP клиента. И ИНДИ смотрел, и ICS, и сам пытался писать. В итоге WinINet показал себя лучше всего.


 
DVM ©   (2009-05-19 23:52) [34]


> тимохов ©   (19.05.09 23:46) [33]


Это конечно все верно, но дело в том, что для работы с конкретным (а не абстрактным) сервером как правило не нужна полноценная реализация.


 
тимохов ©   (2009-05-20 00:02) [35]


> DVM ©   (19.05.09 23:52) [34]
> > тимохов ©   (19.05.09 23:46) [33]
> Это конечно все верно, но дело в том, что для работы с конкретным
> (а не абстрактным) сервером как правило не нужна полноценная
> реализация.


А хрен его, извините, знает, как нужно делать.

Мне фрилансер делал проект. Так мой апач отдавал данные с указанием content-length, а евоный апач (использовался при тестировании) отдавал чанками (кусками). Смотрел через wireshark (снифер такой). Опять же есть серьезные вопросы разрыва соединения при использовании прокси и авторизации.

Можно, конечно, самому писать. Но я так и не нашел внятного описания, как должны себя вести прокси.


 
@!!ex ©   (2009-05-20 00:04) [36]

> [33] тимохов ©   (19.05.09 23:46)

МНЕ НЕ НУЖЕН HTTP!
Первую часть вопроса я уже сделал через WinInit и не вижу причин переделывать, т.к. все работает.

Сейчас стоит вторая задача - связать два моих приложения через UDP.


 
тимохов ©   (2009-05-20 00:21) [37]

2Автор.
Извини, не дочитал твой пост :) Бывает.

Ну собсно ты сделал, как я тебе говорил - через wininet.
Про UDP, да Антона надо читать. Там хорошо написано.


 
antonn ©   (2009-05-20 01:10) [38]

Антонов много, всех не перечитаете %)


 
Дмитрий С ©   (2009-05-20 05:36) [39]

unit uHTTP;

interface
uses ActiveX, ComObj;

type
 IXMLHTTPRequest = interface(IDispatch)
   ["{ED8C108D-4349-11D2-91A4-00C04F7969E8}"]
   procedure open(const bstrMethod: WideString; const bstrUrl: WideString; varAsync: OleVariant;
                  bstrUser: OleVariant; bstrPassword: OleVariant); safecall;
   procedure setRequestHeader(const bstrHeader: WideString; const bstrValue: WideString); safecall;
   function getResponseHeader(const bstrHeader: WideString): WideString; safecall;
   function getAllResponseHeaders: WideString; safecall;
   procedure send(varBody: OleVariant); safecall;
   procedure abort; safecall;
   function Get_status: Integer; safecall;
   function Get_statusText: WideString; safecall;
   function Get_responseXML: IDispatch; safecall;
   function Get_responseText: WideString; safecall;
   function Get_responseBody: OleVariant; safecall;
   function Get_responseStream: OleVariant; safecall;
   function Get_readyState: Integer; safecall;
   procedure Set_onreadystatechange(const Param1: IDispatch); safecall;
   property status: Integer read Get_status;
   property statusText: WideString read Get_statusText;
   property responseXML: IDispatch read Get_responseXML;
   property responseText: WideString read Get_responseText;
   property responseBody: OleVariant read Get_responseBody;
   property responseStream: OleVariant read Get_responseStream;
   property readyState: Integer read Get_readyState;
   property onreadystatechange: IDispatch write Set_onreadystatechange;
 end;

 function CreateIXMLHTTPRequest:IXMLHTTPRequest;

implementation

 function CreateIXMLHTTPRequest:IXMLHTTPRequest;
 begin
   Result := CreateOleObject("Msxml2.XMLHTTP") as IXMLHTTPRequest;
 end;
end.


 
test ©   (2009-05-20 08:44) [40]

Дмитрий С ©   (20.05.09 05:36) [39]
И опять же проще через Indy там оно реализовано в понятном юзабельном виде.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.008 c
15-1242737676
Игорь
2009-05-19 16:54
2009.07.26
Протестируйте программу пожалуйста


15-1243370399
Petr V. Abramov
2009-05-27 00:39
2009.07.26
Насчет конференции («Начинающим»)


15-1243262312
@!!ex
2009-05-25 18:38
2009.07.26
Как добавить информацию о версии в С++?


6-1205276109
kail
2008-03-12 01:55
2009.07.26
Нужно синхронизировать БД


3-1224859229
gameus
2008-10-24 18:40
2009.07.26
выгрузить xml из хранимки в файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский