Перейти к содержанию
Fire Monkey от А до Я
  • 0

Двойной запрос NetHTTPClient


Rusland

Вопрос

Пытаюсь авторизоваться на локальном сервере:

type
  TResponser = record
    Response: string;
    Code: integer;
  end;
...

procedure TFrmLogin.OnAuthEvent(const Sender: TObject;
  AnAuthTarget: TAuthTargetType; const ARealm, AURL: string; var AUserName,
  APassword: string; var AbortAuth: Boolean;
  var Persistence: TAuthPersistenceType);
var
  MyCredential: TCredentialsStorage.TCredential;
begin
  MyCredential := TNetHTTPClient(Sender).CredentialsStorage.FindAccurateCredential(AnAuthTarget, '');
  AUserName := MyCredential.UserName;
  APassword := MyCredential.Password;
end;

procedure TFrmLogin.OnValidateServerCertificate(
  const Sender: TObject; const ARequest: TURLRequest;
  const Certificate: TCertificate; var Accepted: Boolean);
begin
  Accepted:=true;
end;


function TFormLogin.LoginToServer(login,pass:String):TResponser;
var
  aResponse: IHTTPResponse;
  aResponser: TResponser;
  sStream: TStringStream;
  aHttpClient: TNetHTTPClient;
begin
  try
    aHTTPClient := TNetHTTPClient.Create(nil);
    aHTTPClient.OnAuthEvent:=OnAuthEvent;
    aHTTPClient.OnValidateServerCertificate:=OnValidateServerCertificate;
    aHTTPClient.CredentialsStorage.AddCredential
      (TCredentialsStorage.TCredential.Create(TAuthTargetType.Server,'',
      sURL, login, pass));
    aHTTPClient.AllowCookies  :=true;
    aHTTPClient.AcceptLanguage:='ru-RU;q=0.8,en-US;q=0.5,en;q=0.3';
    aHTTPClient.ContentType   :='text/json';
    aHTTPClient.AcceptCharset :='utf-8';
    aHTTPClient.Accept        :='text/json,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';

    try
      sStream := TStringStream.Create();
      try
        aResponse := aHttpClient.Get(sURL, sStream); 
        aResponser.Response:=sStream.DataString;
        aResponser.Code:=aResponse.StatusCode; // тут получаю код 200
        Result:=aResponser;
      except end;
    finally
      sStream.Free;
    end;
  finally
    aHttpClient.Free;
  end;
end;

 

После get cразу получаю код 200 (от ответного кода я решаю авторизован я или нет). Однако на сервер реально приходит 2 запроса: первый без basic authorization (и на него дается в ответ код 401), второй с basic authorization (на него уже в ответ код 200).

Почему проходит два запроса, когда в программе я вижу только один? 

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Возможно сервер посылает редирект (код ответа 3хх). Отключите следование редиректу в NetHTTPClient и увидите все запросы и ответы. 

Ссылка на комментарий
  • 0
36 минут назад, Евгений Корепов сказал:

Возможно сервер посылает редирект (код ответа 3хх).

Ответ сервером дается 401 - сервер и должен его выдать, потому что пришел запрос без авторизации. А вот второй запрос приходит нормально с авторизацией.

36 минут назад, Евгений Корепов сказал:

Отключите следование редиректу в NetHTTPClient и увидите все запросы и ответы. 

Сделал aHTTPClient.HandleRedirects:=false; Все равно в программе вижу сразу ответ код 200.

Что-то этот компонент делает странное в своих недрах...

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
3 часа назад, Rusland сказал:

Да, я уже попробовал ставить False - безрезультатно ^^^

Вообще работать должно так - идет обращение на сервер, сервер отлупливает и сообщает давай авторизацию, TNetHTTPClient обрабатывает овет в OnAuthEvent и посылает второй запрос с авторизацией. Хотя могу и ошибаться, всегда использую THTTPClient, с TNetHTTPClient не баловался.

Ссылка на комментарий
  • 0
1 минуту назад, Евгений Корепов сказал:

Вообще работать должно так - идет обращение на сервер, сервер отлупливает и сообщает давай авторизацию, TNetHTTPClient обрабатывает овет в OnAuthEvent и посылает второй запрос с авторизацией.

Если это так, то фактически так и получается.

2 минуты назад, Евгений Корепов сказал:

Хотя могу и ошибаться, всегда использую THTTPClient, с TNetHTTPClient не баловался.

Я почему-то думал что это один и тот же компонент. В чем различия?

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...