Я использую Indy 10.5.7Indy всегда возвращает ResponseCode 200 - даже для неисправного входа
Я недавно было показано, как использовать Indy для входа на веб-сайт с действительными учетными данными. Теперь я могу выполнять поиск и возвращать результаты, которые мне нужны.
Однако у меня все еще есть проблема. Я должен считать само собой разумеющимся, что я успешно зарегистрирован на основе перенаправления страницы, поскольку мне не удается получить код ответа, отличный от 200.
Что я имею в виду, я хотел бы обрабатывать ситуацию, когда пользователь вводит опечатку в имени пользователя или пароле и, по крайней мере, сообщить им, что что-то не так.
Ради этого вопроса, я поставил Инди следующим образом ...
var
client : TidHTTP;
cookieMan : TidCookieManager;
params : TStringList;
response : string;
begin
cookieMan := TidCookieManager.Create(nil);
client := TidHTTP.Create(nil);
params := TStringList.Create;
try
with client do
begin
ProtocolVersion := pv1_1;
HTTPOptions := [hoForceEncodeParams, hoKeepOrigProtocol];
AllowCookies := True;
cookieManager := cookieMan;
HandleRedirects := True;
//Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0';
//Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36';
Request.UserAgent := 'Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.7.3) Gecko/20040924 Epiphany/1.4.4 (Ubuntu)';
//OnRedirect := handleRedirect;
end;
params.Add('username=aFakeUser');
params.Add('password=aFakePass');
try
response := client.Post('http://assurance.redtractor.org.uk/rtassurance/services.eb', params);
mmoResponseCodes.Lines.Add('No exception, INDY OK ' + intToStr(client.ResponseCode)); // << ALWAYS returns 200
// do nothing with params ... just to try to raise any exception
// I need to be logged in to reach the next page, this is a search page ...
response := client.Post('http://assurance.redtractor.org.uk/rtassurance/services/cr_services/checking.eb', params);
mmoResponseCodes.Lines.Add('Still no exception, INDY OK ' + intToStr(client.ResponseCode)); // << ALWAYS returns 200
mmoResponse.Text := response;
except
on e: EIdHTTPProtocolException do
begin
// No exception raised, I expected e.ErrorCode = 401
mmoResponseCodes.Lines.Add('Post Indy Error ' + intToStr(e.ErrorCode) + ' >>> ' + e.Message);
end;
end;
finally
client.Free;
cookieMan.Free;
params.Free;
end;
end;
Я действительно не знаю, что я делаю неправильно. Я видел много сообщений от Remy, указывающих на то, чтобы перехватывать исключения и смотреть на e.ErrorCode, но я просто не могу создать исключение с моими намеренно поддельными учетными данными.
Могу ли я попросить вас указать мне в правильном направлении, пожалуйста, и указать, что я сделал неправильно?
Спасибо, я ценю ваш ответ. Ммм, боюсь, я показал свою слабость в веб-технологиях ... HTML ... HTTP ... до вашего поста, они были для меня одинаковыми. Я буду читать HTML для ошибок. – Johnny
Еще в первые дни Интернета HTTP (Hyper-Text Transport Protocol) первоначально был предназначен для переноса только HTML (Hyper-Text Markup Language), но с годами он превратился в нечто гораздо большее. HTML - это только один из многих форматов данных, которые HTTP поддерживает в современных интернет-системах. –
Еще раз спасибо, Реми, ваш ответ здесь ... http://stackoverflow.com/questions/30076775/how-to-clear-the-indy-tidhttp-basicauthentication-credentials помогли мне получить 401. Мне просто нужно играть и учиться сейчас. – Johnny