WinHttp Delphi обертка
Посоветуйте, пожалуйста, есть ли в Delphi XE оболочка WinHTTP
В порядке предпочтения:
- Delphi из коробки
- сторонний файл с открытым исходным кодом с портированными процедурами ввода
- обертка xxx_TLB.pas
Решение:
Поскольку комментарии не позволяют форматировать код, я вставляю решение в вопросы:
const
winhttpdll = 'winhttp.dll';
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY = 0;
WINHTTP_FLAG_REFRESH = $00000100;
WINHTTP_FLAG_SECURE = $00800000;
WINHTTP_ADDREQ_FLAG_COALESCE = $40000000;
WINHTTP_QUERY_FLAG_NUMBER = $20000000;
function WinHttpOpen(pwszUserAgent: PWideChar; dwAccessType: DWORD;
pwszProxyName, pwszProxyBypass: PWideChar; dwFlags: DWORD): HINTERNET; stdcall; external winhttpdll;
function WinHttpConnect(hSession: HINTERNET; pswzServerName: PWideChar;
nServerPort: INTERNET_PORT; dwReserved: DWORD): HINTERNET; stdcall; external winhttpdll;
function WinHttpOpenRequest(hConnect: HINTERNET; pwszVerb: PWideChar;
pwszObjectName: PWideChar; pwszVersion: PWideChar; pwszReferer: PWideChar;
ppwszAcceptTypes: PLPWSTR; dwFlags: DWORD): HINTERNET; stdcall; external winhttpdll;
function WinHttpCloseHandle(hInternet: HINTERNET): BOOL; stdcall; external winhttpdll;
function WinHttpAddRequestHeaders(hRequest: HINTERNET; pwszHeaders: PWideChar; dwHeadersLength: DWORD;
dwModifiers: DWORD): BOOL; stdcall; external winhttpdll;
function WinHttpSendRequest(hRequest: HINTERNET; pwszHeaders: PWideChar;
dwHeadersLength: DWORD; lpOptional: Pointer; dwOptionalLength: DWORD; dwTotalLength: DWORD;
dwContext: DWORD): BOOL; stdcall; external winhttpdll;
function WinHttpReceiveResponse(hRequest: HINTERNET;
lpReserved: Pointer): BOOL; stdcall; external winhttpdll;
function WinHttpQueryHeaders(hRequest: HINTERNET; dwInfoLevel: DWORD; pwszName: PWideChar;
lpBuffer: Pointer; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; stdcall; external winhttpdll;
function WinHttpReadData(hRequest: HINTERNET; lpBuffer: Pointer;
dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL; stdcall; external winhttpdll;
function WinHttpQueryDataAvailable(hRequest: HINTERNET; var lpdwNumberOfBytesAvailable: DWORD): BOOL;
stdcall; external winhttpdll;
function WinHttpSetOption(hInternet: HINTERNET; dwOption: DWORD; lpBuffer: Pointer; dwBufferLength: DWORD): BOOL;
stdcall; external winhttpdll;
function WinHttpQueryOption(hInternet: HINTERNET; dwOption: DWORD; var lpBuffer: Pointer; var lpdwBufferLength: DWORD): BOOL;
stdcall; external winhttpdll;
function WinHttpWriteData(hRequest: HINTERNET; lpBuffer: Pointer; dwNumberOfBytesToWrite: DWORD;
var lpdwNumberOfBytesWritten: DWORD): BOOL; stdcall; external winhttpdll;
function WinHttpCheckPlatform(): BOOL; stdcall; external winhttpdll;
Есть еще пара недостающих:
WinHttpCrackUrl
WinHttpCreateUrl
WinHttpSetStatusCallback
WinHttpTimeFromSystemTime
WinHttpTimeToSystemTime
2 ответа
Если вы хотите реализовать клиентский доступ HTTP в своем приложении, вы можете рассмотреть несколько вариантов:
- Используйте предоставленные компоненты Indy;
- Используйте сторонние компоненты, такие как Synapse, ICS или вашу собственную оболочку на основе WinSock;
- Используйте WinINet;
- Используйте WinHTTP.
Для нашего ORM, для его уровня соединения HTTP/1.1, мы старались избегать внешних зависимостей и не нуждались во всех функциях и издержках Indy.
Сначала мы написали нашу собственную оболочку WinSock, а затем опробовали WinInet. При использовании в нашем тесте мы обнаружили, что WinINet был очень медленным.
Затем мы попробовали WinHTTP, новый API, предоставленный Microsoft, и обнаружили, что он работает очень быстро. Так же быстро, как прямой доступ к WinSock, без необходимости написания всего кода оболочки.
Итак, вот наша оболочка OpenSource WinHTTP, в модуле с именем SynCrtSock. Протестировано от Delphi 5 до XE.
Вы увидите, что мы использовали один и тот же универсальный класс для WinINet и WinHTTP. На самом деле обе библиотеки очень близки.
Смотрите эту статью для деталей. Есть заметка об автоматическом поиске прокси.
Редактировать: с выходом Delphi XE2 вы сможете кросс-компилировать в Mac OS X. В этом случае имеет смысл использовать "абстрактные" классы, такие как SynCrtSock
, В Windows он будет использовать WinHTTP, а в Mac OS X он будет вызывать API сокетов. Чтобы ваш код компилировался, вам нужно просто настроить тип класса, а не код.
- проект
- Библиотека типов импорта
- Microsoft WinHTTP Services, версия 5.1 (Версия 5.1)
C:\Windows\system32\winhttp.dll
И затем используйте это:
var
http: IWinHttpRequest;
szUrl: WideString;
begin
szUrl := 'http://stackru.com/questions/6725348/winhttp-delphi-wrapper';
http := CoWinHttpRequest.Create;
http.open('GET', szUrl, False);
http.send(EmptyParam);
if (http.status = 200) then
ShowMessage(http.responseText);
Так:
- это из коробки - используя инструменты из коробки
- это с открытым исходным кодом - вы можете изменить источник по своему усмотрению
- это TLB