网页在不同的请求中返回不同的状态代码

时间:2017-02-25 06:13:58

标签: http erlang wget http-status-code-503 httpc

这是我项目代码的一部分。

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或在多次迭代后返回,这会在客户端请求中产生延迟。 / p>

如何解决?

1 个答案:

答案 0 :(得分:2)

作为开发人员,我们无法控制我们尝试与之交谈的第三方系统的响应。通过您提供的示例,似乎亚马逊故意拒绝您访问,因为他们怀疑您是机器人或刮刀。每当得到 503 时,您都可以通过查看响应正文来证明这一点。

作为开发人员,您可以做的是适应连接到某个系统时可能发生的每种情况。

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

HTTP 4xx 错误代码通常表示您的请求有问题。您不想在此重试,只需查看您的请求可能出现的问题。

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