【发布时间】:2025-12-19 20:20:08
【问题描述】:
给定一个 URL 字符串,我想获得到“最终”(非重定向)URL 的 HTTP 连接:
如果响应码是2xx,那么我可以简单地使用初始连接。
如果响应码是3xx,那么我需要打开一个新的连接再试一次。
对于任何其他响应代码(例如 4xx 或 5xx),我“放弃”并返回
null。
我的代码如下:
HttpURLConnection getConnection(String url) throws Exception
{
HttpURLConnection connection = (HttpURLConnection)new URL(url).openConnection();
while (true)
{
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("User-Agent","");
int responseCode = connection.getResponseCode();
switch (responseCode/100)
{
case 2:
return connection;
case 3:
switch (responseCode)
{
case 300:
connection = ???
break;
case 301:
case 302:
case 303:
case 305:
case 307:
connection = (HttpURLConnection)new URL(connection.getHeaderField("Location")).openConnection();
break;
case 304:
connection = ???
break;
default:
return null;
}
break;
default:
return null;
}
}
}
我的问题是:
我应该如何处理响应码 300 和 304?
我是否正确处理响应代码 301、302、303、305 和 307?
对上述方法的任何其他建设性的 cmet 也将不胜感激。
谢谢
【问题讨论】:
-
所有代码都在此处定义 w3.org/Protocols/rfc2616/rfc2616-sec10.html 并且解释得很好,但在您的情况下并非所有代码都有意义。问题是,你为什么要处理所有这些?
-
因为我在不同 URL 的响应代码中都收到了它们!!!
-
300 到 307 似乎是有道理的,但为什么不简单地尝试一下呢?我不知道您要连接什么以及要发送什么。例如,为什么您会返回 304?根据文档,它说:“如果客户端执行了有条件的 GET 请求并且允许访问”,那么您向服务器发送了什么?
-
收到304错误很奇怪。如果我没记错的话,它会与“if_modified_since”等其他标头配对使用,其目的是如果生成请求的客户端已经在其缓存中拥有更新版本的文档,则可以避免多个 http 请求。您应该检查是否在您的标头请求中设置了“if_modified_since”。如果您不需要处理缓存,则可以避免使用此标头,您将永远不会收到 304 代码
-
谢谢dendini。好吧,我承认我从未收到过 304,但我想为这个案子做好准备。执行“正常”的 URL GET 请求时不可行吗?
标签: java http httpurlconnection http-redirect http-response-codes