如何以编程方式延长缩短的网址

时间:2012-11-20 13:20:12

标签: c# http url-shortener

我需要获取缩短网址的最终目的地的网址。目前我正在做以下工作似乎有效:

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

但是,有人可以提出更好的方法吗?

2 个答案:

答案 0 :(得分:4)

如果这个缩短的网址是由某个在线服务提供商生成的,则只有该服务提供商存储短网址和实际网址之间的映射。因此,您需要通过向其发送HTTP请求来查询此提供程序,就像您一样。另外,不要忘记通过将IDisposable资源包装在using语句中来正确处理它们:

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

如果服务提供商支持HEAD动词,您也可以使用此动词并读取必须指向实际URL的位置响应HTTP标头。作为替代方法,您可以在请求对象上将AllowAutoRedirect属性设置为false,然后读取位置响应HTTP标头。这样,当您对它不感兴趣时​​,客户端将不会重定向到实际资源并获取整个响应正文。

当然,最好的方法是,如果您的在线服务提供商提供的API允许您直接从短网址中提供实际网址。

答案 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。同样,如果加长的URL无效,您将不会发现 - 您只需获取您将重定向到的URL。这是否是好事取决于您的用例...