【问题标题】:How do I get the destination URL of a shortened URL?如何获取缩短 URL 的目标 URL?
【发布时间】:2014-12-01 09:51:33
【问题描述】:

我有一个API (https://www.readability.com/developers/api/parser#idm386426118064) 来提取 webapges 的内容,但是在传递缩短的 url 或重定向到其他的 url 时,它会出错。

我正在开发 windows phone 8.1 (xaml) 应用程序。有没有办法在 c# 中获取目标 URL 或任何解决方法?

例如网址 - http://www.bing.com/r/2/BB7Q4J4?a=1&m=EN-IN

【问题讨论】:

  • Async 下面提出的解决方案是您可能需要的,有关详细信息,请查看@artm 提供的链接(仅限同步版本,可能无法直接用于 WP)。

标签: c# windows-phone-8 web-crawler http-redirect


【解决方案1】:

您可以在HttpClient 跟随它之前截取Location 标头值,如下所示:

using (var handler = new HttpClientHandler())
{
    handler.AllowAutoRedirect = false;
    using (var client = new HttpClient(handler))
    {
        var response = await client.GetAsync("shortUrl");
        var longUrl = response.Headers.Location.ToString();
    }
}

此解决方案始终是最有效的,因为它只发出一个请求。

但是,短 url 可能会引用另一个短 url,从而导致此方法失败。

另一种解决方案是允许HttpClient 跟随Location 标头值并观察目标:

using (var client = new HttpClient())
{
    var response = client.GetAsync("shortUrl").Result;
    var longUrl = response.RequestMessage.RequestUri;
}

这种方法比第一种方法更简洁、更可靠。

缺点是这段代码会发出两个请求而不是一个。

【讨论】:

    【解决方案2】:

    您可以从 GetResponse() 中获取 ResponseUri:

    string redirectedURL = WebRequest.Create("http://www.bing.com/r/2/BB7Q4J4?a=1&m=EN-IN")
                                     .GetResponse()
                                     .ResponseUri
                                     .ToString();
    

    顺便说一句,这篇文章很有趣。

    【讨论】:

      【解决方案3】:

      您需要检查从 URL 返回的标头。

      如果您收到 HTTP 返回代码 301 或 302,那么您会收到通知,该页面正在将您重定向到另一个 URL。

      有关 HTTP 返回码的更多详细信息,请参阅http://www.w3.org/Protocols/HTTP/HTRESP.html

      【讨论】:

        猜你喜欢
        • 2011-07-28
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        • 2017-05-11
        • 2020-05-07
        • 1970-01-01
        • 1970-01-01
        • 2011-11-01
        相关资源
        最近更新 更多