在 Java 中有效检测损坏的 url
在 Java 中检测损坏的 url (HTTP 404) 最有效的方法是什么?我想循环执行此操作并花费尽可能少的时间。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在 Java 中检测损坏的 url (HTTP 404) 最有效的方法是什么?我想循环执行此操作并花费尽可能少的时间。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
您只能在请求 URL 后检测到 404:您将收到带有代码的标头(200 或 301 表示重定向,或 404 表示丢失文件),您可以进行检查。
所以你必须执行请求并等待可能的 404。
下面有一个相当好的评论不应该被跳过,所以我在这里重复它:
可能的优化(在现有网址的情况下):使用 HEAD 请求而不是 GET。
You can only detect a 404 after you've requested the URL: you'll get a header back with the code (200, or 301 for redirect, or 404 for missing file), and you can check that.
So you'll have to do the request and wait for a possible 404.
There's a rather good comment below that should not be skipped, so I'm repeating it here:
Possible optimization (in the case of existing URLs): use a HEAD request instead of a GET.
破坏 URL 的方式有很多种:
除了第一种之外,所有这些都可能需要相对较长的时间(平均可能超过一秒),并且由于您正在与另一台计算机通信,因此无法加快速度。
您唯一能做的就是使用 线程池。
There are many different ways in which an URL can be broken:
Except for the first, all of these can take a relatively long time (probably well over a second on average), and there is no way to speed it up since you're communicating with another computer.
The only thing you can do is to check many URLs in parallel using a thread pool.
您可以建立 URL 连接,通过捕获异常并检查 HTTP 状态代码来验证 URL 是否已损坏。如果未抛出异常且 HTTP 状态为 200 URL 则正常。
但要小心!有时 URL 已损坏,但应用程序会返回状态为 200 的人类可读错误页面。
例如,网站 www.somecompany.com 存在,但页面 www.somecompany.com/foo.html 不再存在。当您尝试到达那里时,您会收到消息“页面不存在”,但 HTTP 状态为 200。这可以通过仅解析页面内容来解决(有时)。
You can establish URL connection verify that URL is broken by catching exception and checking the HTTP status code. If exception is not thrown and HTTP status is 200 URL is OK.
But be carefull! Sometimes URL is broken but the application returns human readable error page with status 200.
For example site www.somecompany.com exists but page www.somecompany.com/foo.html does not exist any more. When you try to get there you get message "page does not exist" but the HTTP status is 200. This can be solved (sometimes) by parsing the page content only.
我编写了一个 Github 操作,可以通过在合并或更新之前测试所有链接来帮助持续集成。此 gitHub 操作读取给定某些扩展输入的所有脚本,并提取所有链接并一一测试它们。该操作也可在 GitHub 市场上用于 GitHub 托管项目:
https://github.com /marketplace/actions/urls-checker
这些脚本采用 python 编写,因此您只需进行很少的更改即可在本地使用它们: https://github.com/SuperKogito/URLs-checker
如果您发现这有用,请随意分叉并给存储库加注星标;)
I wrote a Github action that can help with continuous integration by testing all links before any merge or update. This gitHub action reads all the scripts given certain extensions input and extract all the links and test them one by one. The action is also available on GitHub marketplace to use in GitHub hosted projects:
https://github.com/marketplace/actions/urls-checker
The scripts are in python so you can actually with very little changes use them locally: https://github.com/SuperKogito/URLs-checker
Feel free to fork and star the repository if you find this useful ;)