Добрый день делаю POST выдает ошибку HTTP/1.1 405 Method Not Allowed и ругаеться на строчку IdHTTP.pas Code: raise EIdHTTPProtocolException.CreateError(AResponseCode, FHTTP.ResponseText, LTempResponse.DataString); но главно что POST запрос выполняеться и я получаю результат. еслии я ее удоляю то вместо слова привет приходит %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82 подскажите как сделать чтоб игнорировать данную ошибку IdHTTP1.HandleRedirects:=true P/S Простите за русский...
Если используется старая версия Indy(7), то там есть с этим баг при редиректах, дело в том что редирект всегда должен быть GET'ом, а при POST запросе в Indy собственно после редиректа метод не изменяется и получается что редирект происходит с GET'ом. Если не ошибаюсь, то могу скинуть заплатки.
In the file IdHttp.pas for procedure call BuildAndSendRequest, I changed // write the headers for i := 0 to Request.RawHeaders.Count - 1 do if Length(Request.RawHeaders.Strings)>0 then FHTTP.WriteLn(Request.RawHeaders.Strings); to // write the headers for i := 0 to Request.RawHeaders.Count - 1 do if Length(Request.RawHeaders.Strings)>0 then if (AnsiStartsText('Content-Length') and (Request.Method = hmConnect) then FHTTP.WriteLn('Content-Length: 0') else FHTTP.WriteLn(Request.RawHeaders.Strings);
а чем то что я посоветовал не выход? если не понимаешь совсем по англ, то перевожу Code: В файле IdHttp.pas в процедуре которая называется BuildAndSendRequest, я изменил вот это // пишет заголовки for i := 0 to Request.RawHeaders.Count - 1 do if Length(Request.RawHeaders.Strings[i])>0 then FHTTP.WriteLn(Request.RawHeaders.Strings[i]); на Code: // пишет заголовки for i := 0 to Request.RawHeaders.Count - 1 do if Length(Request.RawHeaders.Strings[i])>0 then if (AnsiStartsText('Content-Length') and (Request.Method = hmConnect) then FHTTP.WriteLn('Content-Length: 0') else FHTTP.WriteLn(Request.RawHeaders.Strings[i]);
Извиняюсь за поднятие темы, но у меня точно такая же проблема на Delphi XE. HTTP.RedirectMaximum := 1; тоже помогло, но не думаю, что это правильное решение проблемы.
Решение: Code: procedure TForm1.HTTPRedirect(Sender: TObject; var dest: string; var NumRedirect: Integer; var Handled: Boolean; var VMethod: string); begin VMethod:='GET'; end;
Я такой аналог сделал: (были проблемы то-ли с 301 то-ли 302) Code: type TIdHTTPRedirectHelper = class helper for TIdHTTP function GetWithRedirect(URL: string; MaxRedirectCount: Integer = 10): string; end; implementation function TIdHTTPRedirectHelper.GetWithRedirect(URL: string; MaxRedirectCount: Integer): string; var I: Integer; begin for I := 0 to MaxRedirectCount -1 do begin try Result := Get(URL); except on E : EIDHttpProtocolException do if (E.ErrorCode = 301) or (E.ErrorCode = 302) then begin URL := Response.Location; Continue; end else raise; end; Exit; end; URL := Response.Location; end; тока замениш на ПОСТ. пример использования: Code: var Http: TIdHTTP; begin Http := TIdHTTP.Create(nil); try Http.GetWithRedirect('my.com') finally Http.Free; end; end;