1

给出一个URL字符串,我希望得到一个HTTP连接的“最后”(非重定向)网址:打开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; 
     } 
    } 
} 

我的问题是在此:

  1. 我应该如何处理响应码300和304?

  2. 我是否正确处理响应代码301,302,303,305和307?

对上述方法的任何其他建设性评论也将被赞赏。

感谢

+0

所有的代码在这里http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html中定义,并且已经很好地解释了,但并不是所有的代码在你的情况下都有意义。问题是,你为什么想要处理它们呢? – dendini

+0

因为我收到他们全部在不同的URL的响应代码! –

+0

300到307似乎有意义,但为什么不简单地尝试它们?我不知道你连接到什么以及你发送了什么。例如,为什么你得到304返回?根据doc的说法:“如果客户端执行了条件GET请求并允许访问”,那么您发送给服务器的是什么? – dendini

回答