문제

델파이 Tidhttp 구성 요소에서 GET 프로시저가 특정 URL을 가져올 수 없지만 다른 URL에서는 작동하는 문제가 발생했습니다.예:이 코드는 빈 response.datastring을 반환합니다.Response.datastring은 이 error_url에서만 비어 있지만 다른 URL에서는 response.datastring에 값이 있습니다.이 문제를 해결하려면 해당 error_url의 콘텐츠를 가져와야 합니다.

procedure TForm1.Button1Click(Sender: TObject);
var
  Response : TStringStream;
  error_url: string;
begin
  error_url := 'http://www.chefscatalog.com/international/home.aspx'; //error url
  Response := TStringStream.Create;
  try
    IdHTTP1.Get(error_url, Response);
    Memo1.Text := Response.DataString;
  finally
    FreeAndNil(Response);
  end;
end;

그런데 여기서 idHTTP1 리디렉션 속성이 true로 설정되어 있으므로 리디렉션이 문제가 되지 않습니다.

내가 만난 예외는 다음과 같습니다.1.HTTP/1.1 302 발견 2.'ZLib 오류(-3)' 메시지가 포함된 EDecompressionError

이 링크에서 이 프로젝트의 소스 코드(indytest.zip)를 다운로드할 수 있습니다. http://www.yourfilelink.com/get.php?fid=534933

제발 도와주세요.미리 감사드립니다 :)

도움이 되었습니까?

해결책

그 이유는 귀하가 방문하려는 웹사이트가 쿠키를 찾고 있고 쿠키가 설정되지 않은 경우 쿠키를 설정하려고 시도한 다음 302 리디렉션을 다시 수행하기 때문입니다.

쿠키 관리자를 연결하지 않았기 때문에 사이트가 쿠키를 계속 확인하고 설정한 다음 리디렉션하므로 302 리디렉션 루프가 발생하게 됩니다.

쿠키를 처리하면 단일 302만으로 제대로 작동합니다.


그러나 어떤 이유로 Indy가 이 사이트에서 전송되는 쿠키를 무시하고 있는 것 같습니다.내가 맞으면 몇 가지 테스트 코드를 작성했습니다. http://www.google.com 나는 얻다

New cookie: PREF
New cookie: NID
Redirecting (1) to: http://www.google.co.nz/
New cookie: PREF
New cookie: NID

이것은 Google이 보내는 헤더입니다.

Set-Cookie: PREF=ID=3c7e441914b902ae:TM=1268686477:LM=1268686477:S=Z-Gwqx52jK0V1rYR; expires=Wed, 14-Mar-2012 20:54:37 GMT; path=/; domain=.google.com
Set-Cookie: NID=32=vsOZvkr4AOZ7320d_OBPf2zR2jau4E6pupbOe_ZaaX4DNjahTzSV-mSA55naTk-5cXQcn7SNEp7uSxbE_cFrL9ZftGApTGZMPGKzcz3_NZE_2MYpWG5PGbwWFw9t2d_R; expires=Tue, 14-Sep-2010 20:54:37 GMT; path=/; domain=.google.com; HttpOnly

그러나 다른 사이트의 경우 디버그 출력에 이 내용이 표시됩니다.

Redirecting (1) to: http://www.chefscatalog.com/error.aspx?impsid=0
Redirecting (2) to: http://www.chefscatalog.com/error.aspx?impsid=0

15번 시도까지..사이트에서 어떤 헤더를 다시 보내는지 살펴보면

Set-Cookie: ASP.NET_SessionId=4o0bpi45evee0d45qos1uy55; path=/; HttpOnly
Set-Cookie: ChefsSite=CartID=00000000-0000-0000-0000-000000000000&cst=f4t8YpBpAAkNiRUd9BEf2luKAA%3d%3d&act=c0f2VBCSbv30F4kasnvWS5OfJQ%3d%3d&CookiesEnabled=False; expires=Wed, 14-Apr-2010 20:54:22 GMT; path=/

사이트에 Set-Cookie 끝에 도메인이 누락되어 있다는 것을 알았습니다. 이는 이상하지만 RFC의 필수 항목은 아니라고 생각합니다.idCookieManager의 AddCookie/2 메소드를 보면 해당 매개변수에 호스트가 필요하므로 도메인을 제공하지 않는 Set-Cookies에서는 작동하지 않을 수도 있습니다.

몇 개의 추가 사이트에서 이것을 테스트했으며 Set-Cookie에 domain=.google.com이 포함되어 있으면 모두 잘 작동합니다.

idHttp.OnRedirect를 살펴보면 흥미롭습니다.

idHttp.Response.RawHeaders.Text

작동하지 않는 사이트에서는 Set-Cookies가 표시되지 않지만 작동하는 사이트에서는 Set-Cookies가 표시됩니다.

그러나 idhttp useragent를 다음과 같이 설정하면

    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1

(다른 답변에서)

그럼 쿠키는 잘 받는 것 같네요

    New cookie: ASP.NET_SessionId
    New cookie: ChefsSite
    Redirecting (1) to: http://www.chefscatalog.com/international/home.aspx
    New cookie: ChefsSite

기이한.

다른 팁

OnreDirect 이벤트를 확인하십시오. 어떤 이유로 든 오류 페이지로 리디렉션됩니다.

http://www.chefscatalog.com/error.aspx?impsid=0

결과적으로 RelipectMaximum (15)을 배출 할 때까지 동일한 오류 페이지로 다시 리디렉션됩니다.

업데이트:

오류 페이지로 리디렉션되면 Wizzard는 왜 동일한 오류 페이지로 계속해서 다시 리디렉션되는지 아래를 설명합니다. 쿠키.

처음에 리디렉션되는 이유는 아마도 사이트가 귀하의 사용자 에이전트 문자열 (요청 속성). 기본적으로 "Mozilla/3.0 (호환; 인디 라이브러리)"입니다. 사용하는 현재 문자열로 변경하십시오 Firefox, 또는 기타 인식 된 브라우저.

"Mozilla/5.0 (x11; u; linux i686; en-us; rv : 1.9.2.1) Gecko/20100122 Firefox/3.6.1"으로 시도했는데 잘 작동하는 것 같습니다.

자세한 내용은 인디 KB PDF.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top