WinHttp Delphi обертка - PullRequest
       24

WinHttp Delphi обертка

9 голосов
/ 17 июля 2011

Сообщите, если в Delphi XE

есть оболочка WinHTTP

В порядке предпочтения:

  1. Delphi «из коробки»
  2. сторонний файл с открытым исходным кодом и портированными процедурами ввода
  3. Оболочка 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 ]

11 голосов
/ 17 июля 2011

Если вы хотите реализовать клиентский доступ 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 сокетов.Чтобы ваш код компилировался, вам нужно просто настроить тип класса, а не код.

6 голосов
/ 17 июля 2011
  • Проект
  • Библиотека типов импорта
  • Microsoft WinHTTP Services, версия 5.1 (версия 5.1) C:\Windows\system32\winhttp.dll

И затем используйте ее:

var
   http: IWinHttpRequest;
   szUrl: WideString;
begin
   szUrl := '/5184391/winhttp-delphi-obertka';

   http := CoWinHttpRequest.Create;
   http.open('GET', szUrl, False);
   http.send(EmptyParam);

   if (http.status = 200) then
       ShowMessage(http.responseText);

Итак:

  • это все из коробки - используя готовые инструменты
  • это с открытым исходным кодом - вы свободныизменить источник так, как вам нравится
  • это TLB
...