1 1 1 1 1 1 1 1 1 1 Рейтинг 0.00 (0 Голоса(ов)

Скачивание файла в Delphi с использованием WinInet (http/https)

Писал под свои нужды, может кому пригодится.

Функция возвращает запись, содержащую ответ сервера, включая код и заголовок ответа.

Код Delphi:
  1. ...
  2. type tPageOpenMethod = (tpomGet,tpomPost);
  3. type tPageStatus = record
  4. code: ansistring;
  5. err: word;
  6. header: AnsiString;
  7. end;
  8. type tRequestData = record
  9. Connection: AnsiString;
  10. UserAgent: AnsiString;
  11. Referer: AnsiString;
  12. Origin: AnsiString;
  13. ContentType: AnsiString;
  14. Accept: AnsiString;
  15. AcceptLanguage: AnsiString;
  16. AcceptEncoding: AnsiString;
  17. Cookie: AnsiString;
  18. CustomHeaders: tStringList;
  19. Body: AnsiString;
  20. end;
  21. ...
  22. function WiOpenURL(Method:tPageOpenMethod; RequestData:tRequestData; URL_Base, URL_Page:WideString): tPageStatus;
  23. var
  24. hInet, hCon, hReq: HINTERNET;
  25. Status, StatusSize, Index: DWORD;
  26. bytes, b, posi: Cardinal;
  27. ResponseString: AnsiString;
  28. dwFlag: Cardinal;
  29. URL_base_c: WideString;
  30. tPS: tPageStatus;
  31. fMethod: PChar;
  32. fFlag: Cardinal;
  33. Header: WideString;
  34. UA: AnsiString;
  35. Response: array [0..2047] of WideChar;
  36. ResponseL: longword;
  37. EndPos: longword;
  38. i: longword;
  39. begin
  40. ResponseL:=SizeOf(Response);
  41. Response:='';
  42. if (Method=tpomGet) then
  43. fMethod:='GET'
  44. else
  45. fMethod:='POST';
  46. fFlag:= INTERNET_FLAG_RELOAD
  47. or INTERNET_FLAG_SECURE
  48. or INTERNET_FLAG_IGNORE_CERT_CN_INVALID
  49. or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID;
  50. if (RequestData.Connection='keep-alive') then
  51. fFlag:=fFlag or INTERNET_FLAG_KEEP_CONNECTION;
  52. if (AnsiPos('://',URL_Base)>0) then
  53. URL_base_c:=Copy(URL_Base,AnsiPos('://',URL_Base)+3,length(URL_Base))
  54. else
  55. URL_base_c:=URL_Base;
  56. if (RequestData.UserAgent<>'') then
  57. UA:=RequestData.UserAgent
  58. else
  59. UA:='Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36';
  60. Header:='Host: '+URL_base_c+sLineBreak;
  61. Header:=Header+'User-Agent: '+UA+sLineBreak;
  62. if (RequestData.Origin<>'') then
  63. Header:=Header+'Origin: '+RequestData.Origin+sLineBreak;
  64. if (RequestData.ContentType<>'') then
  65. Header:=Header+'Content-Type: '+RequestData.ContentType+sLineBreak;
  66. if (RequestData.Accept<>'') then
  67. Header:=Header+'Accept: '+RequestData.Accept+sLineBreak;
  68. if (RequestData.AcceptLanguage<>'') then
  69. Header:=Header+'Accept-Language: '+RequestData.AcceptLanguage+sLineBreak;
  70. if (RequestData.AcceptEncoding<>'') then
  71. Header:=Header+'Accept-Encoding: '+RequestData.AcceptEncoding+sLineBreak;
  72. if (RequestData.Connection='keep-alive') then
  73. Header:=Header+'Connection: keep-alive'+sLineBreak;
  74. if (RequestData.Referer<>'') then
  75. Header:=Header+'Referer: '+RequestData.Referer+sLineBreak;
  76. if (RequestData.Cookie<>'') then
  77. Header:=Header+'Cookie: '+RequestData.Cookie+sLineBreak;
  78. if (Method=tpomPOST) then
  79. Header:=Header+'Content-Length: '+IntToStr(length(RequestData.Body))+sLineBreak;
  80. Header:=Header+sLineBreak;
  81. // Инициализируем
  82. hInet := InternetOpenA(PAnsiChar(UA),
  83. INTERNET_OPEN_TYPE_PRECONFIG, // Прокси в зависимости от утсановок системы
  84. nil,
  85. nil,
  86. 0);
  87. if not Assigned(hInet) then
  88. begin
  89. FormSlezka.ToLog('Ошибка при выполнении функции InternetOpen' + sLineBreak + SysErrorMessage(GetLastError),clRed);
  90. exit;
  91. end;
  92. try
  93. hCon := InternetConnect(hInet, PWideChar(URL_base_c), INTERNET_DEFAULT_HTTPS_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
  94. if not Assigned(hCon) then
  95. begin
  96. FormSlezka.ToLog('Ошибка при выполнении функции InternetConnect' + sLineBreak + SysErrorMessage(GetLastError),clRed);
  97. exit;
  98. end;
  99. try
  100. hReq := HttpOpenRequest(hCon, fMethod, PChar(URL_Page), 'HTTP/1.1', nil, nil,
  101. fFlag, 0);
  102. HttpAddRequestHeaders(hReq,PWideChar(Header),length(Header),HTTP_ADDREQ_FLAG_ADD);
  103. if not Assigned(hReq) then
  104. begin
  105. FormSlezka.ToLog('Ошибка при выполнении функции HttpOpenRequest' + sLineBreak + SysErrorMessage(GetLastError),clRed);
  106. exit;
  107. end;
  108. try
  109. if (Method=tpomGet) then
  110. HttpSendRequest(hReq,'', 0, nil, 0)
  111. else
  112. HttpSendRequest(hReq,'', 0, PAnsiChar(RequestData.Body), length(RequestData.Body)+1);
  113. StatusSize := SizeOf(Status);
  114. Index := 0;
  115. HttpQueryInfo(hReq, HTTP_QUERY_FLAG_NUMBER or HTTP_QUERY_STATUS_CODE, @Status, StatusSize, Index);
  116. tPS.err:=Status;
  117. HttpQueryInfo(hReq, HTTP_QUERY_RAW_HEADERS_CRLF, @Response, ResponseL, Index);
  118. posi := 1;
  119. b := 1;
  120. ResponseString := '';
  121. while b > 0 do
  122. begin
  123. if not InternetQueryDataAvailable( hReq, bytes, 0, 0 ) then
  124. begin
  125. FormSlezka.ToLog('Ошибка при выполнении функции InternetQueryDataAvailable' + sLineBreak
  126. + SysErrorMessage(GetLastError),clRed);
  127. exit;
  128. end;
  129. SetLength( ResponseString, Length(ResponseString) + bytes );
  130. InternetReadFile( hReq, @ResponseString[Posi], bytes, b );
  131. Inc(Posi, b);
  132. end;
  133. finally
  134. InternetCloseHandle(hReq);
  135. end;
  136. finally
  137. InternetCloseHandle(hCon);
  138. end;
  139. finally
  140. InternetCloseHandle(hInet);
  141. end;
  142. //========== конец получения кода страницы ==========
  143. EndPos:=AnsiPos(#13+#10+#13+#10,Response);
  144. tPS.header:='';
  145. for i := 0 to EndPos do
  146. tPS.header:=tPS.header+Response[i];
  147. tPS.code:=ResponseString;
  148. Result:=tPS;
  149. end;

Оставьте свой комментарий

Оставить комментарий как гость

0
  • Комментариев нет
Tinydeal WW