我需要获取缩短网址的最终目的地的网址。目前,我正在执行以下似乎可行的操作:
var request = WebRequest.Create(shortenedUri);
var response = request.GetResponse();
return response.ResponseUri;
但是有人可以提出更好的方法吗?
我需要获取缩短网址的最终目的地的网址。目前,我正在执行以下似乎可行的操作:
var request = WebRequest.Create(shortenedUri);
var response = request.GetResponse();
return response.ResponseUri;
但是有人可以提出更好的方法吗?
如果这个缩短的 url 是由某个在线服务提供商生成的,那么只有这个服务提供商会存储短 url 和实际 url 之间的映射。所以你需要通过向它发送一个 HTTP 请求来查询这个提供者,就像你做的那样。也不要忘记通过将 IDisposable 资源包装在using
语句中来正确处理它们:
var request = WebRequest.Create(shortenedUri);
using (var response = request.GetResponse())
{
return response.ResponseUri;
}
如果服务提供商支持 HEAD 动词,您也可以使用该动词并读取必须指向实际 url 的 Location 响应 HTTP 标头。作为替代方案,您可以在请求对象上将AllowAutoRedirect属性设置为 false,然后读取 Location 响应 HTTP 标头。这样,当您对它不感兴趣时,客户端将不会重定向到实际资源并获取整个响应正文。
当然,最好的方法是如果您的在线服务提供商提供一个 API,允许您直接从短网址中为您提供实际网址。
您确实需要发出 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.");
}
}
}
请注意,这意味着如果“加长”URL本身就是一个重定向,那么您将不会像在原始代码中那样获得“最终”URI。同样,如果加长的 URL 无效,您将不会发现 - 您只会得到您将重定向到的 URL。这是否是一件好事取决于您的用例......