nodejs-turkce-kaynak-yazilimodasi-com

Uzun bir aradan sonra inşallah bundan sonra düzenli bir yayın hayatına geçeceğim.Yazıya geçmeden birkaç değinmek istediğim  nokta var.(İsterseniz bu paragrafı atlayabilirsiniz ama kafanızda önyargı oluşmaması için okuyun derim.)Yazdığım yazılar genelde yabancı kaynaklardan derlediğim notlardır.Dolayısıyla bazı terimlerin Türkçe çevrilmesine karşıyım.Bazen bilmeden de olsa tam karşılığı olan kelimeleri de ağız alışkanlığımdan ingilizce kullandım.Hangi kaynaklarda derlediğimide her yazımın sonundaki Kaynaklar bölümünde belirttim.

Express ile bir web server oluşturduğun zaman yapacaklarının çoğu bir request nesnesi ile başlar ve response nesnesi ile sona erer.Bu iki nesne Node kökenlidir ve Express tarafından genişletilmiştir. Bu ikisi nesneye derinlemesine dalmadan , bir client bir serverdan nasıl istekde bulunur ve nasıl cevap döner biraz anlatalım.

URL Parçaları

Protocol
Protokol isteğin nasıl iletileceğini belirler. Biz sadece http ve https kullanacağız.Diğer yaygın protokoller file ve ftp’dir.

Host
Host ana sunucuyu tanımlar.Sunucu senin bilgisayarında olabilir (localhost) yada local ağda çalışıyor olabilir.

Port
Her sunucunun numaralı portları vardır.80 ve 443 gibi bazı portlar özeldir.Bir websitesine erişmek istediğinde port numarası gözardı edilir ama http için varsayılan port 80 , https içinde 443’tür.Genel kullanımda 80 ve 443 numaralı portları kullanılmaz, 1023’den büyük portlar kullanılır.Portları kullanacağımız zaman kolay hatırlanabilecek 3000,8080 gibi portlar kullanırız.

Path
URL’nin ilk parçasıdır.Ve uygulamandaki sayfaları veya diğer kaynakları aynı olmayacak şekilde tanımlamak için kullanılır.

Querystring
Querystring name/value yani ad/değer çifti olacak şekilde seçime bağlı bir alandır.Querystringler bir soru işareti(?) ile başlar ve name/value şeklinde araya & simgesi konularak istenildiği kadar eklenebilir.İsimlerde ,değerlerde URL encoded olmalıdır.(Örnek: http://www.yazilimodasi.com/?s=hacker)

Örnekteki querystring bölümü “?s=hacker” kısmıdır.s=hacker name/value çiftidir.

Fragment
Fragment(yada hash), sunucuya geçmez.Yani bu kısım sunucuya gitmez.O browser tarafında kullanılır.Single-page uygulamlarda yada Ajax ağırlıklı uygulamalarda kontrol için fragment kullanılır.Bir örnek vermek gerekirse <a id=”chapter06”> etiketi ile işaretlenmiş bir yere yani browserdaki sayfanın belli bir kısmına gitmek için kullanılır.

HTTP Request Metodları

HTTP protokolü istemcinin sunucu ile iletişime geçmesi için bir dizi HTTP eylemlerine sahiptir.Bunların başlıcaları çok yaygın kullanılan GET ve POST metodlarıdır.

Browser’a bir URL girdiğin zaman browser sunucuya bir HTTP GET isteği gönderir.Sunucuya gönderilen önemli bilgiler URL’nin path ve querystring kısmıdır.Path ve querystring kısmı uygulamanın nasıl bir cevap vereceğini belirlemek için kullanılır.

Bir websitesi için sayfaların çoğu GET isteklerine yanıt verecektir.POST istekleride genelde sunucuya geri bilgi göndermek için kullanılır. Browser sunucunla iletişime geçeceği zaman sadece GET ve POST metdolarını kullanacaklardır.(Eğer AJAX kullanılmıyorsa.)

Request Header Bilgileri

Bir sayfayı ziyaret ettinde sunucuya giden tek şey URL değildir.Bir websitesini ziyaret ettiğin zaman browserın birçok görmedin bilgiler gönderir.Mesela browser sunucuya sayfayı almak için dil tercihi söyler.(Örneğin İspanyada Chrome indirdin diyelim.Sen bir web sayfasını ziyaret ettiğinde browserın sayfanın eğer varsa İspanyolca versiyonunu isteyecek.)Ayrıca “user agent”(browserın,işletim sistemin ve donanımın hakkına bazı bilgiler) bilgilerini gönderir.Tüm bu bilgileri request header olarak gönderir.Eğer browserının gönderdiği tüm bilgileri görmek istersen basit bir Express route oluşturup bu bilgileri görebilirsin.

Code 1

Response Header Bilgileri

Browserın sunucuya gönderdiği gizli bilgiler gibi sunucuda browsera bir takım gizli bilgiler gönderir.Bunlarada response header deriz.Bu bilgiler içerisinde metadata ve sunucu bilgileri yatar.Belki çoğumuzun aşina olduğu Content-Type bilgisi.Bu bize yani browsera iletilmesi gereken içeriğin türünü (HTML,Javascript,Css yada bir resim) söyler.Content-Type ek olarak , headerlar cevabın sıkıştırılıp sıkıştırılmayacağı ve kodlamanın türünü yani encoding türünü belirtir.Ayrıca response headerlarında kaynağın ne kadar sürede önbelleklenebileceği hakkında bilgiler verir.Bu websitenizi optimize etmek için önemli bir bilgidir.Bu konuyu daha sonraki bir yazımda ele alacağım.Response headerlar sunucu hakkında da bazı bilgilerde barındırır.Tabi güvenlik önlemi alınmış sunucularda bu bilgi yanıltıcı olabilir.Misal Express ile yapmış olduğunuz bir projede X-Powered-By header bilgisi ‘Express’ olarak gözükecektir.Ama bunu aşağıdaki gibi basit bir komutla disable edebiliriz:

Eğer response headerlarını görmek istersen browserın ‘developer tool’ seçeneğini seçerek onları göreblirsin.Chrome için nasıl görebileceğinizi aşağıda madde madde açıkladım:

  1. Browserında ziyaret ettiğin sayfa açıkken F12’ye bas.
  2. Network sekmesine tıkla
  3. Ziyaret ettiğin sayfanı yeniden yükle
  4. Karşına gelen listeden HTML olanı seç.(İlk sıradaki olacaktır.)
  5. Headers sekmesine tıkla; orada tüm response headerları göreceksin

MIME

Content-Type headerı kritik öneme sahip.Neden diye sorarsanız content-type headerı olmadan içeriğin nasıl oluşturulacağını tahmin edemez.Content-Type header bir type, subtype ve seçişme bağlı parametrelerden oluşan internet medya türüdür.Örneğin text/html;charset=UTF-8; buradaki type text , subtype html ve parametrede charset=UTF-8‘dir.Buradan türlere bakabilirsiniz.Genelde ”content type”,”Internet media type” yada “MIME type” şeklinde farklı adlarda duyabilirsin.

Request Nesnesi

Request nesnesi Node’un çekirdek nesnesidir. http.IncomingMessage ‘ın bir örneğidir.Express ek olarak bazı işlevsellikler eklemiştir.Bu başlıkta request nesnesinin kullanışlı özellikleri ve metodlarının çoğuna değineceğim.(Aşağıdaki tüm metodlar req.headers ve req.url hariç Express tarafından eklenmiştir.)

req.params
Bir dizi route parametreleri içerir.Bu methodu ileriki bir yazımda daha detaylı anlatacağım.

req.param(name)
Route parametrelerini geri döndürür.

req.query
“name/value” şeklindeki querystring parametreleri içeren bir nesnedir.(GET parametreleri olarakta adlandırılır.)

req.body
POST parametreleri içeren bir nesnedir. POST parametreleri olarakda adlandırılan nesne querystring parametreleri gibi URL’ye değil REQUEST’in gövdesine geçirilir.

req.route
Geçerli route hakkında bilgi verir.Route debug işlemi için oldukça kullanışlıdır.

req.cookies/req.signedCookies
Clientten gönderilen cookie bilgilerini içerir.

req.headers
Clientten alınan request header bilgileridir.

req.accepts([types])
Verilen tür veya türlerin istemci tarafından kabul edilip edilmeyeceğini belirlemeye yardımcı olan metoddur.(Seçime bağlı olarak applicaton/json gibi tekbir MIME türü olabilir.)Eğr tür belirtilmezse varsayılan tür olarak HTML kabul edilir.

req.ip
İstemcinin IP adresi.

req.path
Request pathi dersem anlaşılmayabilir isteğin yani ziyaret ettiğimiz bir setide örneğin www.yazilimodasi.com/about buradaki /about kısmını veren metoddur.

req.host
Adındanda anlaşılacağı üzere hostname’i verir.Ama bu bilgi yanıltıcı olabilir.

req.xhr
Eğer request yani istek bir AJAX ile yapılmışsa true değer döndüren bir özellik.

req.protocol
Bir request yapımında kullanılan protokol.(Kullanım amacımıza göre http veya https şeklinde değişebilir.)

req.secure
Eğer bağlantı güvenli ise yani istemci ile sunucu arasındaki bağlantıdan bahsediyor true değer döndürür.Yani aslında req.protocol===’https’ yapıyor diyebiliriz.

req.url/req.originalUrl
Bu özellik path ve querystring değerini döndürür.(yani döndürdüğü değer içerisinde protokol,host ve port değeri yoktur.)req.url internal routing işlemi için tekrar tekrar yazılabilir.Fakat req.originalUrl orjinal request ve querystring’in kalması için tasarlanmıştır.

req.acceptedLanguages
İstemcinin tercihine göre dilleri döndüren metoddur.Biraz daha açıklamak gerekirse istemci ile sunucu arasındaki iletişimin sağlandığı konuşma dil.(Türkçe ,ingilizce,İspanyolca gibi)

Response Nesnesi

Request nesnesi Node’un çekirdek nesnesidir.http. http.ServerResponse‘un bir örneğidir.Express ile ek işlevsellikler eklenmiştir.Şimdide request nesnesinde olduğu gibi response nesnesindeki kullanışlı özellik ve metodlardan bahsedelim:(Aşağıdaki nesne ve özelliklerin tamamı Express tarafından eklenmiştir.)

res.status(code)
HTTP durum kodunu ayarlar.Varsayılan olarak 200(OK) kabul edilir.404(Not found) yada 500(Server Error) gibi durumları return etmen için bu metodu kullanmak zorundasın.yönlendirmeler için (durum kodları: 301,302,303 ve 307)

res.set(name,value)
Response headerı ayarlar.Bu normalde manuel olarak yapılacak birşey değildir.

res.cookie(name,value,[options]),res.clearCookie(name,[options])
Clientde yani istemcide depolanan cookieleri temizler veya ayarlar.

res.redirect([status],url)
Browserı yönlendirir.Varsayılan yönlendirme kodu 302’dir.Bir sayfayı kalıcı olarak taşımadığın sürece yönlendirme çok kullanılmamalıdır.Kalıcı bir sayfa taşınması durumunda status kodu olarak 301 kullanmalısın.

res.send(body),res.send(status,body)
İstemciye opsiyonel status kodu ile bir cevap gönderir.Express varsayılan ‘content-type’ olarakta text/html belirlemiştir.Eğer bu içerik türünü text/plain olarak değiştirmek istiyorsan res.send metodunu çağırmadan önce res.set(‘Content-Type’,’text/plain’) metodunu kullanmak zorundasın.Eğer içerik türü olarak json göndereceksen bu metod yerine res.json kullanmanızı öneririm.

res.json(json),res.json(status,json)
Opsiyonel status kodu ile istemciye JSON gönderir.

res.jsonp(json),res.jsonp(status,json)
Opsiyonel status kodu ile istemciye JSONP gönderir.JSON ile JSONP arasındaki farkı bilmiyorsan bknz

res.type(type)
Content-Type headerını ayarlamanı sağlayan metoddur.Aslında res.set(‘Content-Type’,type) metoduna eşittir.

res.format(object)
Bu metod kabul edilen request headerına bağlı olarak farklı bir içerik göndermene izin verir. API’lerde oldukça işimize yarayacak bir metoddur.Bu metodu daha sonraki yazılarımda daha detaylı deyineceğim.Şimdi basit bir kaç örnek vermek gerekirse: res.format({‘text/plain’: ‘hi there’, ‘text/html’: ‘<b>hi there</b>’}).

res.attachment([filename]),res.download(path,[filename],[callback])
Her iki metodda Content-Disposition olarak adlandırılan response headerı ayarlar.Bu tarayıcıya, onları tarayıcıda oynatmak yerine indirmesi için istekte bulunacaktır.res.dowload ile indirilecek dosyayı yolunu belirleyebilirsin.

res.sendFile(path,[options],[callback])
Bu metod istemciye bir içerik göndermek ve path ile belirtilen dosyayın okunmasını sağlar.Bu metoda pek ihtiyaç duymayız, çünkü herkese açık bir dizin belirleyerek istemciye göstermek istediğimiz dosya ve dizinleri oraya koyabiliriz.Bazı durumlara bağlı olarak aynı URL’den farklı bir kaynak sunmak istiyorsak işte o zaman bu metod kullanışlı olacaktır.

res.links(links)
Response header linklerini ayarlar.Bu uygulamarın çoğunda az kullanılan özel bir headerdır.

res.locals, res.render(view,[locals],callback)
res.locals render edilen viewler için varsayılan içerikleri içeren bir nesnedir. res.render yapılandırılmış bir template motorunu kullanarak bir view i render eder. res.render status kodu varsayılan olarak 200’dür.farklı bir status kodu belirlemek için res.status kullanılabilir.

Kaynaklar: Yukarıdaki yazı Ethan Brown’un “Web Development with Node and Express” kitabından derlenmiştir. 

Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Share on TumblrEmail this to someone