'Bad Request'在Ruby中下载一些文件?

时间:2011-07-17 16:39:45

标签: ruby http

我最近有一段时间休息,并认为这是一个很好的练习,看看我能够多快地整理一个工作程序,为我自动检索'.torrent'文件。我知道有现成的解决方案,但这更像是一项编程工作。

一切都很好,它运行,检查网站上的新种子,并试图下载它们。但这就是我遇到问题的地方;我尝试下载.torrent文件的其中一个网站在我尝试下载时给了我一个包含此文件而不是torrent文件的文件;

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.2.3 (CentOS) Server at forums.mvgroup.org Port 80</address>
</body></html>

我的第一个想法可能是链接断了,所以我在浏览器中成功下载了文件,所以这不是一个破损的链接..我的下一个想法是,我可能没有正确下载文件.. {{ 3}}是我使用的示例,This是在我的程序中进行下载的实际代码。

我有一种潜在的怀疑,这将成为那些脑死亡的简单陷阱之一,但我有一点时间搞清楚了。有谁知道我为什么得到400,或者如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

断开的链接应返回404 Not Found错误。因为您可以使用浏览器检索文件,所以我发现还有两个可能的问题:您缺少处理浏览器自动处理的代码中的重定向,或者您缺少所需的会话ID或cookie或某些状态值。同样,浏览器将处理这些,但除非您将代码写入,否则您的代码将不会处理,或者利用正确的宝石。

您在http://snippets.dzone.com/posts/show/2469链接到的示例代码是基本的,但没有连线跟踪重定向,这是我怀疑您需要的。我瞥了一眼你的代码,它也没有处理它们。 docs for Net::HTTP中的“关注重定向”示例代码显示了如何执行此操作。

我建议使用Ruby的Open::URI,而不是自己编写代码以自行检索URL,因为它会自动处理重定向以及超时重试。对于那些正常的“获取URL”工作,它易于使用并且是一匹好工作。

如果您想拥有处理重定向,Cookie和会话ID的gem,请查看Mechanize。对于通用任务来说,它是一个非常好的宝石,尽管它实际上是为浏览网站而设计的。

对于更强大的任务,CurbTyphoeus很好,因为它们可以处理多个请求,但您需要编写更多代码来管理文件和导航网站。对于文件下载,他们没问题。

答案 1 :(得分:0)

您需要在两者之间使用日志记录代理,这样您就可以看到哪些字节通过网络传输。

如果您使用Eclipse,它可以使用http代理。我相信它是Eclipse Java EE下载的一部分。