Как активировать/принудительно активировать базовую аутентификацию на THTTPClient

Я не могу найти возможность активировать базовую аутентификацию на THTTPClient.

Моя основная «проблема» заключается в том, что первый ответ на запрос с HTTP/1.1 401 Unauthorized вызывает событие аутентификации. Я хочу сделать это с первой «попытки».

Вот мой код:

uses
  System.Net.HTTPClient, System.Net.URLClient, System.NetEncoding;

procedure DoRequest(const url, username, password, filename: string);
var
  http: THTTPClient;
  ss: TStringStream;
  base64: TBase64Encoding;
begin
  http := THTTPClient.Create;
  ss := TStringStream.Create('', TEncoding.UTF8);
  base64 := TBase64Encoding.Create(0);
  try
    // option #1 - build in credential storage
    http.CredentialsStorage.AddCredential(
      TCredentialsStorage.TCredential.Create(
        TAuthTargetType.Server, '', url, username, password
    ));
    // option #2 - custom "Authorization"
    http.CustomHeaders['Authorization'] := 'Basic ' + base64.Encode(username + ':' + password);

    http.ProxySettings.Create('127.0.0.1', 8888); // for fiddler
    http.Get(url, ss);
    ss.SaveToFile(filename);
  finally
    base64.Free;
    ss.Free;
    http.Free;
  end;
end;

Вариант №2 включает авторизацию в первый запрос. Вариант №1 - нет. basic auth

Как я могу это сделать?

Обновление - PreemptiveAuthentication не существует в Сиэтле PreemptiveAuthentication

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Delphi 11 и более поздних версиях использование THTTPClient.CredentialsStorage должно работать, вам просто нужно установить для THTTPClient.PreemptiveAuthentication значение true:

Property controls preemptive authentication. When set to True, then basic authentication will be provided before the server gives an unauthorized response.

Однако PreemptiveAuthentication не существует в Delphi 10.x, включая Сиэтл, поэтому вам придется придерживаться своего решения CustomHeaders, пока вы не сможете перейти на современную версию Delphi.

Возможно ли, что его нет в Сиэтле? Это свойство THTTPClient, не так ли?

complete_stranger 16.05.2022 20:46

да, в Delphi 10 такого нет, но в Delphi 11

complete_stranger 16.05.2022 20:52

Другие вопросы по теме