gpt4 book ai didi

java - 使用 Java/HttpURLConnection 检索重定向的 URL

转载 作者:行者123 更新时间:2023-11-30 04:05:35 27 4
gpt4 key购买 nike

给定一个 URL(字符串引用),我尝试检索重定向的 URL,如下所示:

        HttpURLConnection con = (HttpURLConnection)new URL(ref).openConnection();
con.setInstanceFollowRedirects(false);
con.setRequestProperty("User-Agent","");
int responseType = con.getResponseCode()/100;
while (responseType == 1)
{
Thread.sleep(10);
responseType = con.getResponseCode()/100;
}
if (responseType == 3)
return con.getHeaderField("Location");
return con.getURL().toString();

我遇到了几个(概念和技术)问题:

概念问题:

  • 它在大多数情况下都有效,但我不太明白如何实现。
  • 打开连接后(实例化“con”时)将调用“con”实例的所有方法。
  • 那么它们如何影响实际结果?
  • 调用“setInstanceFollowRedirects”为何会影响“getHeaderField”的返回值?
  • 是否有必要反复调用“getResponseCode”直到返回值不是 1xx?
  • 底线,我的一般问题是:每次调用其中一个方法时,是否会通过连接发送另一个请求/响应?

技术问题:

  • 有时响应代码为 3xx,但“getHeaderField”不会返回“最终”URL。
  • 我尝试使用“getHeaderField”的返回值调用我的代码,直到响应代码为 2xx。
  • 但在响应代码为 3xx 的大多数其他情况下,“getHeaderField”确实会返回“最终”URL,如果我使用此 URL 调用代码,则会得到一个空字符串。

您能否建议如何解决上述两个问题,以便获得用于检索“最终”URL 的“100% 证明”代码?

请忽略响应代码​​为 4xx 或 5xx(或除 1xx/2xx/3xx 以外的任何其他代码)的情况。

谢谢

最佳答案

概念问题:

0.) 可以重用一个 URLConnectionHttpURLConnection 对象吗?

不,您不能重用这样的对象。您可以使用它一次获取一个 URL 的内容。您不能使用它来检索另一个 URL,也不能两次获取内容(在网络级别上)。

如果您想获取另一个 URL 或再次获取该 URL,则必须再次调用 URL 类的 openConnection() 方法来实例化一个新的连接对象。

1.) URLConnection何时实际连接?

方法名称 openConnection() 具有误导性。它仅实例化连接对象。它不会在网络级别执行任何操作。

网络级别的交互从这一行开始,它隐式连接连接(= 打开引擎盖下的 TCP 套接字并发送和接收数据):

int responseType = con.getResponseCode()/100;

.

或者,您可以使用 HttpURLConnection.connect() 显式连接连接。

2.) setInstanceFollowRedirects 是如何工作的?

setInstanceFollowRedirects(true) 导致一次又一次地“在幕后”获取 URL,直到出现非重定向响应。非重定向响应的响应代码由您调用 getResponseCode() 返回。

更新:
是的,如果您不想自己担心重定向,这允许编写简单的代码。您只需打开跟随重定向,然后就可以读取重定向到的位置的最终响应,就好像没有发生重定向一样。

关于java - 使用 Java/HttpURLConnection 检索重定向的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20805827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com