2012-11-20 32 views
1

我需要获取缩短网址的最终目的地的网址。目前我正在做以下似乎工作:如何以编程方式延长缩短的网址

 var request = WebRequest.Create(shortenedUri); 
     var response = request.GetResponse(); 
     return response.ResponseUri; 

但任何人都可以提出一个更好的方法?

+5

你在寻找什么样的“更好”? (顺便说一下,你应该处理响应 - 使用'using'语句。) –

+0

缩写为tinyurl或bt.ly?对于这些,您需要提出某种形式的请求,以查看他们将您重定向到的位置。 –

+1

你目前的方法有什么问题? –

回答

2

您确实需要发出HTTP请求 - 但您不需要遵循重定向,默认情况下会执行WebRequest。下面是制作的简短的例子只是一个要求:

using System; 
using System.Net; 

class Test 
{ 
    static void Main() 
    { 
     string url = "http://tinyurl.com/so-hints"; 
     Console.WriteLine(LengthenUrl(url)); 
    } 

    static string LengthenUrl(string url) 
    { 
     var request = WebRequest.CreateHttp(url); 
     request.AllowAutoRedirect = false; 
     using (var response = request.GetResponse()) 
     { 
      var status = ((HttpWebResponse) response).StatusCode; 
      if (status == HttpStatusCode.Moved || 
       status == HttpStatusCode.MovedPermanently) 
      { 
       return response.Headers["Location"]; 
      } 
      // TODO: Work out a better exception 
      throw new Exception("No redirect required."); 
     } 
    } 
} 

注意,这意味着如果“加长”的网址是本身重定向,你不会得到“最后的” URI,你会在你的原始代码。同样,如果加长的网址无效,您也不会发现这一点 - 您只需获取您将重定向到的网址即可。不管这是件好事还是取决于你的使用情况...

3

如果这个缩短的网址是由一些在线服务提供商生成的,那么只有这个服务提供商存储短网址和实际网址之间的映射关系。所以你需要通过发送一个HTTP请求来查询这个提供者,就像你一样。如果服务提供商支持HEAD动词,你也可以使用这个动词和阅读必须指向位置响应HTTP标头

var request = WebRequest.Create(shortenedUri); 
using (var response = request.GetResponse()) 
{ 
    return response.ResponseUri; 
} 

:也不要忘了适当的包装他们using陈述处置IDisposable的资源实际的网址。作为替代,您可以将请求对象上的AllowAutoRedirect属性设置为false,然后读取位置响应HTTP标头。这样,当你不感兴趣时​​,客户端将不会被重定向到实际资源并获得整个响应主体。

当然,如果您的在线服务提供商提供的API可以让您直接从简短的网址为您提供实际的网址,那么最好的办法就是这样做。

+0

这可以缩写为'using(var response = WebRequest.Create(shortenedURL).GetResponse()){return response.ResponseUri; }' – JMK

+4

更短并不意味着“更容易阅读” – hometoast

+0

哈哈非常真实! +1 – JMK