这是我项目代码的一部分。
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 = 200
和Code = 503
,我该如何处理这个问题,以便我总是得到Code = 200
我也尝试使用wget "www.amazon.com"
,它会得到相同的结果。
我的想法:在Code = 503
的情况下重新请求,但问题是它可能进入循环并且可能永远不会返回Code = 200
或在多次迭代后返回,这会在客户端请求中产生延迟。 / p>
如何解决?
答案 0 :(得分:2)
作为开发人员,我们无法控制我们尝试与之交谈的第三方系统的响应。通过您提供的示例,似乎亚马逊故意拒绝您访问,因为他们怀疑您是机器人或刮刀。每当得到 503 时,您都可以通过查看响应正文来证明这一点。
作为开发人员,您可以做的是适应连接到某个系统时可能发生的每种情况。
对于HTTP,当您遇到 5xx 错误代码时,通常需要重试您的请求。为防止自己陷入循环,请实施指数退避,并限制代码重试的次数。
HTTP 4xx 错误代码通常表示您的请求有问题。您不想在此重试,只需查看您的请求可能出现的问题。
对于您的特定情况,由于亚马逊认为您是自动访问者,请尝试模仿普通的网络浏览器。从User-agent
标题,Cookie等开始