Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Вопрос по пересылке данных с помощью wininet


Автор: Bibigon 4.11.2008, 20:13
Есть следующий пример кода JS, который хочу перевести на Delphi:

var xmlhttp = Server.CreateObject ("MSXML2.ServerXMLHTTP");

xmlhttp.setOption(3, 'option');

xmlhttp.open('POST', 'https://blabla.ru/page.asp', false); 
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
xmlhttp.send(data);

===========================================================
Дельфи :

var
  hOpen, hConnect, hRequest: hInternet;
begin
    

    hOpen := InternetOpen('test', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

    hConnect := InternetConnect(hOpen, pchar('blabla.ru'), 80 , '', '',INTERNET_SERVICE_HTTP, 0, 0);

    hRequest := HttpOpenRequest(hConnect, 'POST', pchar('page.asp'), HTTP_VERSION, '', nil, INTERNET_FLAG_SECURE, 0);

        HttpSendRequest(hRequest, 'Content-Type: application/x-www-form-urlencoded', 47,  PChar(data),  Length(data)) ;
....


Не могу понять как перевести xmlhttp.setOption(3, 'option'); 

Заранее спасибо. 

Автор: ecspertiza 5.11.2008, 15:35
вопрос в том что тебе конкретно надо сделать, setOption насколько я понимаю, задает какието параметры, может тебе эта строка и вовсе не понадобится, да и тем более, переводить код это ужас, уже давно есть готовые примеры, тебе вроде отправка данных нужна.
Код

  function SendPOSTData(Const szHost, szPath, szData: PChar) : string;
  var
    hOpenHandle, hConnectHandle, hResourceHandle: Pointer;
    Buff  : array [0..1024] of Char;
    Cbyte : DWORD;
    i:integer;
    Error : DWORD;
    Flag, BuffLen : DWORD;
  Begin


    hOpenHandle:=InternetOpen('Export', PRE_CONFIG_INTERNET_ACCESS, nil, nil, 0);
    If hOpenHandle<>nil then
    Begin
      hConnectHandle:=InternetConnect(hOpenHandle, szHost, INTERNET_DEFAULT_HTTPS_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
      If hConnectHandle<>nil then
      Begin
        hResourceHandle:=HttpOpenRequest(hConnectHandle, 'POST', szPath, HTTP_VERSION, nil, nil,   INTERNET_FLAG_RELOAD or                                                   INTERNET_FLAG_SECURE or INTERNET_FLAG_IGNORE_CERT_CN_INVALID or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID, 0);
        If hResourceHandle<>nil then
          Begin
              bufflen := SizeOf(Flag);
              InternetQueryOption (hResourceHandle, INTERNET_OPTION_SECURITY_FLAGS, @Flag, BuffLen);

              Flag := SECURITY_FLAG_IGNORE_UNKNOWN_CA;

              bufflen := SizeOf(Flag);

              InternetSetOption (hResourceHandle, INTERNET_OPTION_SECURITY_FLAGS,    @Flag, sizeof (Flag) );


              HttpSendRequest(hResourceHandle, 'Content-Type: application/x-www-form-urlencoded', 47, szData, lstrlen(szData));

              InternetReadFile(hResourceHandle, @Buff, Length(Buff), CByte);
                if (CByte <> 0) then
                for i:=0 to Length(Buff)-1 do
                  Result:= Result + Buff[i];
          End;
        InternetCloseHandle(hResourceHandle);
      End;
    InternetCloseHandle(hConnectHandle);
    End;
   InternetCloseHandle(hOpenHandle);
 

вот эту функцию я использовал для отправки файла по HTTPS тебе нада поменять INTERNET_DEFAULT_HTTPS_PORT на INTERNET_DEFAULT_HTTP_PORT с параметрами я думаю разберёшся

Автор: Bibigon 5.11.2008, 16:25
xmlhttp.setOption(3, 'option'); 

Это поле связано с сертификатом для SSL. Что писать в нем для  Delphi я и пытаюсь понять.

Автор: ecspertiza 6.11.2008, 09:47
так тебе надо данные передать по SSL?
Насколько я знаю протокол SSL  передается по таму же порту что и Https, значит пример остается верным т.к. использовался для передачи по Https.

а сертификаты задаются вот в этой строке.

hResourceHandle:=HttpOpenRequest(hConnectHandle, 'POST', szPath, HTTP_VERSION, nil, nil,   INTERNET_FLAG_RELOAD or                                                   INTERNET_FLAG_SECURE or INTERNET_FLAG_IGNORE_CERT_CN_INVALID or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID, 0);

конкретно:

NTERNET_FLAG_RELOAD or 
INTERNET_FLAG_SECURE or 
INTERNET_FLAG_IGNORE_CERT_CN_INVALID or 
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID

а поточнее узнать тебе поможет google, там про WinInet, до фига всего правда примеры в основном на C++.

Добавлено через 5 минут и 10 секунд
INTERNET_FLAG_CACHE_IF_NET_FAIL    Получает ресурс из кэша, если он недоступен в Internet.
INTERNET_FLAG_KEEP_CONNECTION    Флаг сохранения настроек авторизации на протяжении подключения.
INTERNET_FLAG_NEED_FILE    Кэширует файл или создаёт временный файл для получаемого ресурса.
INTERNET_FLAG_PRAGMA_NOCACHE    Считывает данные с нужного сервера, минуя кэш прокси-сервера.
INTERNET_FLAG_RELOAD    Считывает данные с сервера, а не из кэша системы.

вот описание некоторых флагов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)