2017-02-25 7 views
0

이것은 내 프로젝트 코드의 일부입니다. 웹 페이지가 다른 요청으로 다른 상태 코드를 반환합니다.

URL="http://www.amazon.com", 
HTTPOpts = [{autoredirect, false}], 
case httpc:request(get, {URL, [{"User-Agent", "Mozilla"}]}, HTTPOpts, []) of 
{ok, {{_, Code, _}, Headers, Body}} when Code == 200 -> 

    %%code for process code=200 %% 

    {ok, {{_, Code, _}, Headers, _}} when Code < 310 , Code >= 300 -> 

    %% redirection 

    {ok, {{_, Code, _}, Headers, _}} when Code ==503 -> 

    %%service unavailable 

문제

내가 http 요청을 수행 할 때, 그것은 다른 상태 코드를 반환합니다. 나는 항상 나는 또한 wget "www.amazon.com"를 사용하여 시도 Code = 200

수 있도록 URL의 경우

내가 할 방법이 명 응답, Code = 200Code = 503을 받고 있어요 위는, 이것을 처리, 그것은 동일한 결과를 제공합니다.

제 아이디어 : Code = 503의 경우 다시 요청하십시오.하지만이 문제는 루프가 될 수 있으며 Code = 200을 회신 할 수 없거나 몇 차례 반복 한 후 클라이언트 요청에 지연이 발생할 수 있습니다.

해결 방법은 무엇인가요?

답변

2

개발자는 대화를 시도하는 제 3 자 시스템의 응답을 제어 할 수 없습니다. 귀하가 제공 한 예를 보면, 아마존이 당신을 봇이나 긁는 도구로 의심하기 때문에 의도적으로 접근을 거부 한 것처럼 보입니다. 을 얻을 때마다 응답 본문을보고이를 증명할 수 있습니다.

개발자가 할 수있는 것은 특정 시스템에 연결할 때 발생할 수있는 모든 상황에 적응하는 것입니다.

HTTP의 경우 5xx 오류 코드가 발생하면 일반적으로 요청을 다시 시도해야합니다. 루프에 걸리는 것을 막으려면 코드 재 시도 허용 한도에 따라 지수 적 백 오프를 구현하십시오.

HTTP 4xx 오류 코드는 일반적으로 요청에 문제가 있음을 의미합니다. 여기에서 다시 시도하고 싶지는 않지만 요청에 잘못 될 수있는 것을 살펴보십시오.

특별한 경우, 아마존은 자동 방문자라고 생각하므로 정상적인 웹 브라우저를 모방하려고 시도하십시오. User-agent 헤더, 쿠키 등으로 시작하십시오.