X-Requested-With ile AJAX’ı anlamak

Ufak bir ipucu paylaşayım istedim.

Eğer DRY prensibini benimsediyseniz mutlaka karşınıza gelmiştir: aynı sayfayı Ajax’la ve Ajax’sız çağırma ihtiyacı…

Bu durumda genelde senaryo şudur, AJAX’la çağırdığınızda sayfanın başında sonunda yer alan “header” ve “footer” kısmını göstermek istemezsiniz.

Ya da bir POST işlemi yapıyorsanız (insert / update / delete işlemleri) AJAX’la geldiğinde bir mesajı yazdırmak yeterli olurken AJAX’la gelinmediğinde işlem sonucunun gösterildiği bir sayfaya yönlendirmek gerekir. Krolar aynı sayfaya post edebilir ama ona değinmiyorum bile…

Daha advanced programcılar çıktı formatını değiştirebilir, örneğin AJAX’la gelindiğinde JSON, gelinmediğinde string gönderebilir mesela.

Bu durumla baş etmek için bir GET parametresi göndermek en klasik çözüm. Ancak her AJAX ihtiyacında tekrar bu GET parametresini göndermek hem angarya hem de boşu boşuna URL’yi uzatıyor.

Çözüm

Eğer javascript framework’ü kullanıyorsanız popüler framework’lerin hemen hepsi Ajax’la data gönderirken X-Requested-With diye bir header da gönderiyor. Bu header’ı kontrol ederek işlerinizi kolaylaştırabilir, kendi framework’ünüz varsa standardize edebilirsiniz.

Not: Javascript framework’ü kullanmıyorsanız da kullanmaya başlayın bi zahmet! Yok illa kullanmam diyosanız da XMLHttpRequest objesinin setRequestHeader diye bir metodu var, onu kullanarak javascript kütüphanenize ekleyebilirsiniz.

PHP’den kontrol etmek için $_SERVER[‘HTTP_X_REQUESTED_WITH’] değişkeni XMLHttpRequest değerine eşit mi diye bakmak gerekiyor.

1 Yorum

  1. GET parametresinden daha mantıklı olduğu kesin. Aslında AJAX ile haşır neşir olan controller’ı ayırmak daha mantıklı değil mi. Facebook’u incelediğimde (tüm sistem neredeyse AJAX üzerinde kurulu) ajax-controller.php adında bir dosya ile karşılaştım. Ve bazı ajax istemlerinin hep bu dosya üzerinden yürüdüğünü gördüm. FB’nin yolundan mı gitsek acaba?

    Reply
  2. Mantığı düşünüyordum bu tarzda bir şey aklıma geliyordu fakat tam ne olduğunu çözememiştim. Teşekkürler kesinlikle işe yarar.

    Ayrıca @sakirsensoy ben şu şekilde yapıyorum:
    doAjax.php adında bir dosya oluşturup switch case ile işleme alıyorum. atıyorum GET p, x1’e eşite require(‘ajaxLoaders/x1.php’);

    Reply
  3. Mesajın üzerinden neredeyse 1,5 yıl geçmiş. Görünce çok şaşırdım :)

    Aynen bende sizin doAjax.php gibi s_ajax.php tarzı bir yapı kullanıyorum. Bu arada Ozan beyin X-Requested-With header kontrol yöntemini hiç kullanmadım. Belkide gerek duymadım :)

    Reply

Leave a Comment.