短縮URLの最終宛先のURLを取得する必要があります。現在、私は次のことを行っていますが、これはうまくいくようです。
var request = WebRequest.Create(shortenedUri);
var response = request.GetResponse();
return response.ResponseUri;
しかし、誰かがより良い方法を提案できますか?
短縮URLの最終宛先のURLを取得する必要があります。現在、私は次のことを行っていますが、これはうまくいくようです。
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を指している必要があるLocationresponseHTTPヘッダーを読み取ることもできます。別の方法として、リクエストオブジェクトでAllowAutoRedirectプロパティをfalseに設定してから、LocationレスポンスHTTPヘッダーを読み取ることができます。このようにして、クライアントが実際のリソースにリダイレクトしたり、関心がないときに応答本文全体を取得したりすることはありません。
もちろん、これを行うための最良の方法は、オンラインサービスプロバイダーが、短いURLから実際のURLを直接提供できるAPIを提供している場合です。
You do need to make an HTTP request - but you don't need to follow the redirect, which WebRequest
will do by default. Here's a short example of making just one request:
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.");
}
}
}
Note that this means if the "lengthened" URL is itself a redirect, you won't get the "final" URI as you would in your original code. Likewise if the lengthened URL is invalid, you won't spot that - you'll just get the URL that you would have redirected to. Whether that's a good thing or not depends on your use case...