Url Nasıl Kısaltılır

Bugün aynı indiryada Google URL Shortener‘da olduğu gibi Url kısaltan bir web uygulaması yazacağız. Tabi bunu tamamen benim fikir ve hayal gücüme göre yapacağız. İzlediğim yola alternatif fikri olanlar lütfen paylaşmaktan çekinmesin.

Öncelikle kısaltılacak Url’in tutulacağı “Urls” tablosunu aşağıdaki gibi oluşturalım. Database’imizin adı da ShortUrl olsun. Arama işlemi ShortUrl’e göre yapıldığı için Primary Index ShortUrl’dir.

tblUrl

Solution’a bir DAL projesi eklenip, var olan Database üzerinden CodeFirst ile ilgili Poco ve DbContext nesneleri aşağıdaki gibi yaratılır.

namespace DAL
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    public partial class Urls
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        [StringLength(1000)]
        public string Url { get; set; }

        [Key]
        [StringLength(10)]
        public string ShortUrl { get; set; }
    }
}

namespace DAL
{
    using System;
    using System.Data.Entity;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Linq;

    public partial class UrlContext : DbContext
    {
        public UrlContext()
            : base("name=UrlContext")
        {
        }

        public virtual DbSet<Urls> Urls { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Urls>()
                .Property(e => e.Url)
                .IsUnicode(false);

            modelBuilder.Entity<Urls>()
                .Property(e => e.ShortUrl)
                .IsUnicode(false);
        }
    }
}

Şimdi sıra geldi bir Mvc projesi yaratıp girilicek uzun url’i kısaltıp database’e kaydetmeye.

Öncelikle HomeController.cs’e aşağıdaki action yazılır:

 public ActionResult Shorter()
        {
            return View();
        }

RouteConfig.cs aşağıdaki gibi değiştirilir: Amaç sayfaya url girilmeden ilk gelindiğinde default olarak “Shorter” view’ına gelinmesidir.

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}",
                defaults: new { controller = "Home", action = "Shorter" }
            );

Shorter

Shorter.cshtml: “shortenerInputText” input alanına kısaltılması istenen uzun “Url” girilir. “URL Kısalt” buttonuna basılınca “shorUrl()” function’ı ilgili kısaltılacak Url’i alıp “/Home/ShortUrl” action’ına post eder.

@{
	Layout = null;
}

<!DOCTYPE html>

<html>
<head>
	<meta name="viewport" content="width=device-width" />
	<title>Shorter</title>
	<link href="~/Content/main.css" rel="stylesheet" />
	<script src="~/Scripts/jquery-2.1.4.min.js"></script>
	<script>
		function shortUrl() {
			var longUrl = $('#shortenerInputText').val();
			$.post('/Home/ShortUrl', { Url: longUrl }, function (data) {
				$('#result').html("http://localhost:7461/" + data);
				//$('#shortID').show();
			});
		}
	</script>

</head>
<body>
	<div class="IXTYPID-r-e IXTYPID-i-c">
		<div class="IXTYPID-t-a IXTYPID-a-a" aria-hidden="true" style="display: none;"><div class="IXTYPID-c-g"></div></div> <div class="IXTYPID-r-d" id="shortener"> <div class="IXTYPID-r-f"><img src="~/Image/me.png" width="34" height="39" /></div> <div class="IXTYPID-r-c" id="internal_message"></div> <div><b>Kısaltmak istenen Url'i buraya kopyalayınız:</b></div> <div class="IXTYPID-r-a" id="shortener_container"> <input class="IXTYPID-x-a IXTYPID-b-a IXTYPID-d-b IXTYPID-r-b" type="text" id="shortenerInputText" tabindex="1"> <div class="IXTYPID-d-a IXTYPID-w-a IXTYPID-b-a IXTYPID-r-g" tabindex="1" id="shortenerSubmitButton" aria-labelledby="gwt-uid-11" role="button"><span class="IXTYPID-b-a IXTYPID-w-f"></span> <span class="IXTYPID-b-a IXTYPID-w-h" onclick="shortUrl()">URL Kısalt</span></div> <div class="IXTYPID-v-a g-recaptcha" data-sitekey="6LchOvkSAAAAABtPQPc0LH1A6rqU5WR9CXFssNJV"><div><div style="width: 304px; height: 78px;"><iframe frameborder="0" hspace="0" marginheight="0" marginwidth="0" scrolling="no" style="" tabindex="0" vspace="0" width="304" title="recaptcha widget'ı" role="presentation" height="78" id="I0_1438082275995" name="I0_1438082275995" src="https://www.google.com/recaptcha/api2/anchor?k=6LchOvkSAAAAABtPQPc0LH1A6rqU5WR9CXFssNJV&amp;co=aHR0cHM6Ly9nb28uZ2w.&amp;hl=tr&amp;v=r20150722114659&amp;size=normal&amp;usegapi=1&amp;jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.en.jqFfHqiz5j8.O%2Fm%3D__features__%2Fam%3DQQ%2Frt%3Dj%2Fd%3D1%2Ft%3Dzcms%2Frs%3DAGLTcCP7hMFJ5KmE915Yi8mDQmZIen1WYg#id=I0_1438082275995&amp;parent=https%3A%2F%2Fgoo.gl&amp;pfname=&amp;rpctoken=60400975"></iframe></div><textarea id="g-recaptcha-response" name="g-recaptcha-response" class="g-recaptcha-response" style="width: 250px; height: 40px; border: 1px solid #c1c1c1; margin: 10px 25px; padding: 0px; resize: none;  display: none; "></textarea></div></div></div> <div>Tüm url kısaltmaları borakasmer.com'dan erişilebilir..</div> </div>
		<h2><b><span id="result" style="color:crimson;padding-left: 0.7cm"></span></b></h2>
	</div>
</body>
</html>

Öncelikle [A-Z] ve [0-9]  arasından random seçilecek 8 karakter nasıl oluşturulur onu inceleyelim.

Aşağıda GetRandomUrl() methodu belirtilen karakterler arasında Linq sayesinde “Enumerable.Repeat()” kullanarak random 8 karakter seçmektedir.

public string GetRandomUrl()
        {
            var chars = "abcdefghijklmnopqrstuvwxyz0123456789";
            var random = new Random();
            var result = new string(
                Enumerable.Repeat(chars, 8)
                          .Select(s => s[random.Next(s.Length)])
                          .ToArray());
            return result;
        }

“ShortUrl()” methodu aşağıda görüldüğü gibi “GetRandomUrl()” methodu ile shortUrl üretilir. Eğer önceden böyle bir url üretilmiş ise “While()” döngüsü içinde unique bir url çekilene kadar işlem tekrarlanır. Daha sonra short url ve uzun olan gerçek url Database’e kaydedilir.

public string ShortUrl(string Url)
        {
            if (Url.Trim() != "")
            {
                string shortUrl = GetRandomUrl();
                using (UrlContext dbContext = new UrlContext())
                {
                    while (dbContext.Urls.Any(ur => ur.ShortUrl == shortUrl))
                    {
                        shortUrl = GetRandomUrl();
                    }
                    
                    Urls data = new Urls();
                    data.ShortUrl = shortUrl;
                    data.Url = Url;
                    dbContext.Urls.Add(data);
                    dbContext.SaveChanges();
                    return shortUrl;

                }
            }
            return "";        
        }

screen

Şimdi sıra geldi girilen kısa Url’i istenen gerçek url’e yönlendirmesine:

Öncelikle RouteConfig.cs’e aşağıdaki “RedirectLink” yolu eklenir.

routes.MapRoute(
               name: "RedirectLink",
               url: "RedirectLink",
               defaults: new { controller = "Home", action = "RedirectLink" }
           );

Web.config dosyasına aşağıdaki “customErrors” tagı eklenir. Amaç örneğin “http://localhost:7461/xb84w3r8” şeklinde sayfaya gelindiğinde böyle bir route’a uyan kural olmadığı için hata sayfasına düşmesidir. Böylece RedirectLink action’ında gelen shortUrl’i “Request[“aspxerrorpath”]” parametresinden çekilerek alınır. Daha sonra bu shortUtl’e ait gerçek Url’i, Database’den çekilerek(301) permanent Redirect edilir ve sayfaya yönlendirilir. (301) redirect ile kalıcı bir aktarma yapılarak arama botlarının sayfa sayımında, gerçekte yönlendirilen sayfanın sayması sağlanır. Örnek olarak “http://localhost:7461/xb84w3r8” değil de gerçekte yönlendirilen “http://borakasmer.com” arama botlarınca sayfa gösterimi sayılmış olunur.

Web.config:

<customErrors mode="On" >
      <error statusCode="404" redirect="~/Home/RedirectLink" />
    </customErrors>

HomeController/RedirectLink:

 public void RedirectLink()
        {
            using (UrlContext dbContext = new UrlContext())
            {
                string url = Request["aspxerrorpath"]?.Replace("/", "");
                string longUrl = dbContext.Urls.Where(u => u.ShortUrl == url).Select(s => s.Url).FirstOrDefault().ToString();
                Response.RedirectPermanent(longUrl, true);
            }
        }

Böylece geldik bir makalenin daha sonuna yeni bir makalede görüşmek üzere hoşçakalın.

Yazıyı beğendiyeseniz sosyal medyada paylaşabilirsiniz.

Yazar Hakkında

Avatar
Bora Kasmer

Yazılım Geliştirme Takım Lideri , Medyanet

cialis generic kamagra gel cheap cialis uk levitra uk cialis generic kamagra gel kamagra 100mg cheap cialis uk cheap levitra uk cheap cialis kamagra 100mg cialis tadalafil kamagra oral jelly cialis buy viagra generic levitra uk kamagra gel cialis generic cheap levitra cheap viagra uk

Yorumlar

  1. Avatar
    Emreman

    05/10/2015

    Hocam süpersiniz. Projemde kullanacagim bunu. Sagolun.

Yorum Yazın

.com

Bülten Üyeliği

Güncel eğitim ve etkinliklerden ilk haberdar olmak için ücretsiz abone olun.

Login

Login olmak için kullanıcı adınızı ve şifrenizi giriniz.

Şifremi Unuttum

×

Hızlı İletişim

Her konuda bana yazabilirsiniz. En kısa zamanda cevap vereceğim.

×