2017-02-25 71 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请求,将返回不同的状态代码。

URL情况下,上述我得到两个响应,Code = 200Code = 503,我该如何处理这个问题,让我总是Code = 200

我也尝试过使用wget "www.amazon.com",它给了相同的结果。

我的想法:重新请求在Code = 503情况,但问题这一点,可能会进入循环,并可能永远不会返回Code = 200或经过多次迭代,从而产生在客户端请求的延迟恢复。

如何解决?

回答

2

作为开发人员,我们无法控制我们试图与之交谈的第三方系统的响应。在你提供的例子中,亚马逊似乎是故意拒绝你访问,因为他们怀疑你是机器人还是刮板。只要您收到,就可以通过查看响应主体来证明这一点。

作为一名开发人员,您可以做什么,以适应连接到特定系统时可能发生的每种可能情况。

对于HTTP,当您遇到5xx错误代码时,通常您需要重试您的请求。为了防止自己陷入循环,实施指数退避,限制您允许代码重试的次数。

HTTP 4xx错误代码通常表示您的请求有问题。你不想在这里重试,只要看看你的请求有什么问题。

对于您的特殊情况,由于亚马逊认为您是自动访问者,请尝试模仿正常的网络浏览器。开始于User-agent标题,cookies等

相关问题