|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Как лучше всего соединяться с сервером?
К примеру есть сайт с сообщениями. К сожалению, у сайта нет апи для работы с сообщениями, поэтому, это будет парсер данных. Допустим, мне надо на делфи написать что-то вроде мессенджера. Для этого мне потребуется соединяться с сервером.
К примеру, мне нужно соединяться с сайтом каждую минуту для проверки сообщений. Как лучше это осуществлять? Через какой компонент? |
#2
|
|||
|
|||
В дополнение ко всему, я себе как-то давно написал юнит, в котором представил 2 функции - для get и post запросов
Код:
unit _SendRequest; interface uses IdURI, Classes, IdCookieManager, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, System.SysUtils, WinInet; function SendPostRequest(URL: String; Params: TStringList; cookie_dir: String; domain: String): String; function StreamRequest(URL: String; Stream: TStream): Boolean; function SendGetRequest(URL: String; cookie_dir: String): String; procedure IdCookieManagerSaveFile(IdCookieManager: TIdCookieManager; dir: string); function IdCookieManagerLoadFile(IdCookieManager: TIdCookieManager; domain, dir: string): TIdCookieManager; implementation uses Main; function SendPostRequest(URL: String; Params: TStringList; cookie_dir: String; domain: String): String; var IdHTTP: TIdHTTP; IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL; IdCookieManager: TIdCookieManager; urlRequest: String; begin urlRequest := URL; try IdHTTP := TIdHTTP.Create; except on E: Exception do begin Result := 'ERRORMESSAGE: ' + E.Message end; end; IdHTTP.ConnectTimeout := 5000; try IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'; IdHTTP.Request.AcceptLanguage := 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3'; IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create; IdCookieManager := TIdCookieManager.Create; IdHTTP.CookieManager := IdCookieManager; IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL; try Result := Trim(IdHTTP.Post(urlRequest, Params)); except on E: Exception do begin Result := 'ERRORMESSAGE: ' + E.Message; IdHTTP.Free; end; end; //Result := urlRequest; finally IdHTTP.Free; IdSSLIOHandlerSocketOpenSSL.Free; IdCookieManager.Free; end; end; function StreamRequest(URL: String; Stream: TStream): Boolean; var IdHTTP: TIdHTTP; IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL; IdCookieManager: TIdCookieManager; urlRequest: String; begin urlRequest := URL; try IdHTTP := TIdHTTP.Create; except on E: Exception do begin Result := False; end; end; IdHTTP.ConnectTimeout := 5000; try IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'; IdHTTP.Request.AcceptLanguage := 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7'; IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create; IdCookieManager := TIdCookieManager.Create; IdHTTP.CookieManager := IdCookieManager; IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL; try //ShowMessage(URL); IdHTTP.Get(urlRequest, Stream); Result := True; except on E: Exception do begin Result := False; IdHTTP.Free; end; end; //Result := urlRequest; finally IdHTTP.Free; IdSSLIOHandlerSocketOpenSSL.Free; IdCookieManager.Free; end; end; function SendGetRequest(URL: String; cookie_dir: String): String; var IdHTTP: TIdHTTP; IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL; IdCookieManager: TIdCookieManager; urlRequest: String; begin urlRequest := URL; try IdHTTP := TIdHTTP.Create; except on E: Exception do begin Result := 'ERRORMESSAGE: Cant init IdHTTP'; end; end; IdHTTP.ConnectTimeout := 5000; try IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'; IdHTTP.Request.AcceptLanguage := 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3'; IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP); IdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]; IdCookieManager := TIdCookieManager.Create; IdHTTP.CookieManager := IdCookieManager; IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL; try //ShowMessage(URL); Result := IdHTTP.Get(urlRequest); IdCookieManagerSaveFile(IdCookieManager, cookie_dir); //Result := True; except on E: Exception do begin Result := 'ERRORMESSAGE: ' + E.Message; IdHTTP.Free; end; end; //Result := urlRequest; finally IdHTTP.Free; IdSSLIOHandlerSocketOpenSSL.Free; IdCookieManager.Free; end; end; end. Типа, чтобы через 1 вызов облегчить обращение к собираемым данным. Я не знаю, правильный ли это подход или нет - нужен Ваш совет. К тому же, как я понял, мне требуется авторизация на основе одних и тех же кук, но я так понимаю, при idhttp.free куки сбрасываются, и при новом соединении генерируются по новой (например, тот же PHPSESSID). Как правильно поступать в таких случаях? |