【发布时间】:2017-10-14 07:25:32
【问题描述】:
我的 Rails 应用程序会定期轮询合作伙伴的 ICS 文件,有时它会无缘无故地失败。当我这样做时:
curl https://www.airbnb.es/calendar/ical/234892374.ics?s=23412342323
(这里的参数#是伪造的)
我得到的输出与 ICS 文件的内容相匹配。只需在浏览器中打开它也可以正常工作。
当我使用时:
Net::HTTP.get(URI(a.ics_link))
我收到“503 服务暂时不可用”响应。我也对 OpenURI 进行了同样的尝试,结果相似。
为什么服务器会以不同的方式处理来自 curl 或浏览器的请求?
有没有办法让 Ruby 解决这个问题?
【问题讨论】:
-
这本身不是一个答案,但我认为在 ruby 中使用 Net::HTTP 处理 API 请求并不常见。我个人使用github.com/httprb/http,但在此页面上,您可以看到其他处理 HTTP 请求的 gem。
-
我在其余时间工作的实际源代码(这些 airbnb ics 文件似乎总是失败)使用 open-uri。我真的很困惑为什么你会从两个不同的 http 客户端得到不同的响应。
-
可能是您发出请求的服务器正在检查 curl 未传递的可选标头,例如引用者、cookie、用户代理。我假设它不需要授权。
-
查看这个答案curl acting very strange
-
我怀疑得到“503 服务暂时不可用”意味着您违反了他们的服务条款并暂时关闭。使用
curl和浏览器可能是一次性测试,但使用 Net::HTTP 和 OpenURI 对服务器的打击非常大,因为您不是一个好的网络公民。没有更多信息,我们无法为您提供更详细的答案。在互联网上搜索“robots.txt”并遵守其设置;从长远来看,这会对您有所帮助。
标签: ruby http curl net-http open-uri