Как выполнить https запрос используя winsock или wininet в delphi?

Пользователь

от nicolette.stoltenberg , в категории: Другие , 2 года назад

Как выполнить https запрос используя winsock или wininet в delphi?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от velma , 2 года назад

@nicolette.stoltenberg 

Для выполнения HTTPS-запросов в Delphi можно использовать как WinSock, так и WinINet.


WinSock:

  1. Импортируйте модуль WinSock в ваш проект Delphi, вставив следующую директиву в начало вашего модуля:
1
uses WinSock;


  1. Создайте сокет, используя функцию socket:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
var
  Socket: TSocket;
  Addr: TSockAddrIn;
begin
  Socket := WinSock.socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
  if (Socket = INVALID_SOCKET) then
  begin
    // Обработка ошибки создания сокета
  end;
end;


  1. Задайте адрес сервера, к которому вы хотите подключиться:
1
2
3
Addr.sin_family := AF_INET;
Addr.sin_port := htons(443); // 443 - это порт HTTPS
Addr.sin_addr.S_addr := inet_addr('127.0.0.1'); // IP-адрес вашего сервера


  1. Установите соединение с сервером, используя функцию connect:
1
2
3
4
if (WinSock.connect(Socket, Addr, SizeOf(Addr)) = SOCKET_ERROR) then
begin
  // Обработка ошибки соединения
end;


  1. Отправьте запрос на сервер, используя функцию send:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
var
  Request: string;
begin
  Request := 'GET / HTTP/1.1'#13#10 +
             'Host: www.example.com'#13#10#13#10;
  if (WinSock.send(Socket, Request[1], Length(Request), 0) = SOCKET_ERROR) then
  begin
    // Обработка ошибки отправки запроса
  end;
end;


  1. Прочитайте ответ от сервера, используя функцию recv:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
var
  Buffer: array[0..1023] of AnsiChar;
  BytesReceived: Integer;
begin
  BytesReceived := WinSock.recv(Socket, Buffer, SizeOf(Buffer), 0);
  if (BytesReceived = SOCKET_ERROR) then
  begin
    // Обработка ошибки чтения ответа
  end;
end;


  1. Закройте сокет, используя функцию closesocket:
1
WinSock.closesocket(Socket);


WinINet:

  1. Импортируйте модуль WinINet в ваш проект Delphi, вставив следующую директиву в начало вашего модуля:
1
uses WinINet;


  1. Создайте сессию, используя функцию InternetOpen:
1
2
3
4
5
6
7
8
9
var
  hSession: HINTERNET;
begin
  hSession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hSession = nil) then
  begin
    // Обработка ошибки создания сессии
  end;
end;


  1. Откройте соединение с сервером, используя функцию InternetConnect:
1
2
3
4
var
  hConnect: HINTERNET;
begin
  hConnect := InternetConnect(hSession, 'www.example.com', 443, nil, nil, INTERNET_SERVICE_HTTP, 0,


Пользователь

от fidel , 7 месяцев назад

@nicolette.stoltenberg 

0); if (hConnect = nil) then begin // Обработка ошибки создания соединения end; end;


Откройте запрос к серверу, используя функцию HttpOpenRequest:


1 2 3 4 5


var hRequest: HINTERNET; begin hRequest := HttpOpenRequest(hConnect, 'GET', '/', 'HTTP/1.1', nil, nil, INTERNET_FLAG_SECURE, 0); if (hRequest = nil) then begin // Обработка ошибки создания запроса end; end;


Отправьте запрос на сервер, используя функцию HttpSendRequest:


1 2 3 4


if not HttpSendRequest(hRequest, nil, 0, nil, 0) then begin // Обработка ошибки отправки запроса end;


Прочитайте ответ от сервера, используя функцию InternetReadFile:


1 2 3 4 5 6 7 8 9 10 11 12


var Buffer: array[0..1023] of Byte; BytesRead: DWORD; begin BytesRead := 0; repeat InternetReadFile(hRequest, @Buffer, SizeOf(Buffer), BytesRead); // Обработка полученных данных until BytesRead = 0; end;


Закройте запрос, соединение и сессию, используя функции InternetCloseHandle:


1 2 3 4 5


InternetCloseHandle(hRequest); InternetCloseHandle(hConnect); InternetCloseHandle(hSession);


Таким образом, вы можете выполнить HTTPS-запросы как с использованием WinSock, так и с использованием WinINet в Delphi.