Запрос HTTP POST в Inno Setup Script

Я хотел бы предоставить некоторую информацию, собранную пользователем во время установки установки Inno на наш сервер через POST.

Очевидным решением будет включение файла .exe, который будет извлекаться во временное местоположение и запуск с параметрами. Тем не менее, мне интересно - есть ли более простой/лучший способ?

Ответ 1

Основываясь на рекомендации jsobo по использованию библиотеки WinHttp, я пришел с этим очень простым кодом, который делает трюк. Скажем, вы хотите отправить серийный номер для проверки непосредственно перед началом фактической установки. В разделе кода поставьте:

procedure CurStepChanged(CurStep: TSetupStep);
var
  WinHttpReq: Variant;
begin
  if CurStep = ssInstall then
  begin
    if AutoCheckRadioButton.Checked = True then
    begin
      WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
      WinHttpReq.Open('POST', '<your_web_server>', false);
      WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      WinHttpReq.Send('<your_data>');
      // WinHttpReq.ResponseText will hold the server response
    end;
  end;
end;

Метод Open принимает в качестве аргумента метод HTTP, URL-адрес и должен ли выполнять запрос асинхронного запроса, и нам кажется, что нам нужно добавить SetRequestHeader, чтобы установить заголовок Content-Type на application/x-www-form-urlencoded.

WinHttpReq.Status будет содержать код ответа, поэтому для проверки успешного ответа сервера:

if WinHttpReq.Status <> 200 then
begin
  MsgBox('ERROR', mbError, MB_OK);
end
else
begin
  MsgBox('SUCCESS', mbInformation, MB_OK);
end;

http://msdn.microsoft.com/en-us/library/aa384106.aspx перечисляет все методы и свойства объекта WinHttpRequest.

Кроме того, чтобы избежать ошибок во время выполнения (может случиться, если хост недостижим), рекомендуется окружить код кодом try/except.

Ответ 2

Вы всегда можете использовать ваш установщик curl  сделать сообщение http...

Вы можете написать pascal script прямо в innosetup, чтобы выполнить вызов, используя winhttp library

Или вы можете просто написать vbscript и выполнить это с помощью механизма cscript для выполнения того же HTTP-вызова через библиотеку winhttp.

Это должно указывать вам, по крайней мере, на 3 разных варианта, чтобы делать то, что вам нужно.

Я думаю, что включение exe в него было бы наименее подверженным ошибкам, но использование библиотеки winhttp с помощью pascal script (используемого innosetup) было бы самым простым.