Revision: 16739
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at August 14, 2009 02:07 by CVertex
Initial Code
public interface IUrlShorteningService
{
string Shorten(string longUrl);
}
public class UrlShorteningServiceException : Exception {
public UrlShorteningServiceException(string message)
: base(message) {
}
public UrlShorteningServiceException(string message, Exception innerException)
: base(message, innerException) {
}
}
public class BitlyServiceException : UrlShorteningServiceException {
public BitlyServiceException(int errorCode, string message)
: base(message) {
ErrorCode = errorCode;
}
public BitlyServiceException(int errorCode, string message, Exception innerException)
: base(message, innerException) {
ErrorCode = errorCode;
}
public int ErrorCode { get; private set; }
}
public class BitlyShorteningService : IUrlShorteningService {
private const string _version = "2.0.1";
private readonly string _apiKey;
private readonly string _login;
private bool _useCache = false;
private Func<string, string> _shortener;
private readonly JavaScriptSerializer _javaScriptSerializer;
//http://api.bit.ly/shorten?version=2.0.1&longUrl=http://cnn.com&login=bitlyapidemo&apiKey=R_0da49e0a9118ff35f52f629d2d71bf07
const string _baseShortenUrl = "http://api.bit.ly/shorten";
#region ctors
public BitlyShorteningService(string login, string apiKey, bool useCache) {
_login = login;
_apiKey = apiKey;
_javaScriptSerializer = new JavaScriptSerializer();
UseCache = useCache;
EnsureShortenerCore();
}
public BitlyShorteningService(string login, string apiKey):this(login,apiKey,false) { }
#endregion
#region Caching
public bool UseCache {
get {
return _useCache;
}
set {
if (value == _useCache) // no change
{
return;
}
// use cache has changed, so change the shortener
_useCache = value;
SetShortenerCore();
}
}
private void EnsureShortenerCore()
{
if (_shortener==null)
{
SetShortenerCore();
}
}
private void SetShortenerCore()
{
if (_useCache)
{
_shortener = new Func<string, string>(ShortenCore).Memoize();
} else
{
_shortener = ShortenCore;
}
}
#endregion
#region Bit.ly objects
class Response<T> {
public int errorCode;
public string errorMessage;
public Dictionary<string, T> results;
}
class Result {
public string hash;
public string userHash;
public string shortKeywordUrl;
public string shortUrl;
}
#endregion
#region Shortening
public string Shorten(string longUrl)
{
if (_shortener == null)
return "";
return _shortener(longUrl);
}
protected virtual string ShortenCore(string longUrl) {
if (longUrl == null) throw new ArgumentNullException("longUrl");
try {
var uri = new UrlBuilder(_baseShortenUrl);
uri.QueryString["login"] = _login;
uri.QueryString["apiKey"] = _apiKey;
uri.QueryString["version"] = _version;
uri.QueryString["longUrl"] = longUrl;
using (var web = new WebClient()) {
var resultString = web.DownloadString(uri.ToString());
var result = _javaScriptSerializer.Deserialize<Response<Result>>(resultString);
if (result.errorCode != 0) {
throw new BitlyServiceException(result.errorCode, result.errorMessage);
}
return result.results[longUrl].shortUrl;
}
} catch (Exception ex) {
throw new UrlShorteningServiceException(String.Format("Error shortening long URL {0} with bit.ly",longUrl), ex);
}
}
#endregion
}
Initial URL
Initial Description
Initial Title
URL Shortening Service Contract w/ Bitly Implementation
Initial Tags
url, http, c
Initial Language
C#