REST, REpresentational State Transfer (Temsili Durum Aktarımı) anlamına gelir. REST, w3c standartlarına dayalı bir mimaridir ve HTTP protokolünü kullanır. REST kurallarını sağlayan sistemler RESTful olarak adlandırılır. REST, her bileşenin bir kaynak olduğu ve kaynağın HTTP standart yöntemlerini kullanarak ortak bir arabirim tarafından erişildiği kaynaklar etrafında döner. REST ilk olarak Roy Fielding tarafından 2000 yılında tanıtılmıştır.
Bir REST sunucusu basitçe kaynaklara erişim sağlar ve REST istemcisi HTTP protokolünü kullanarak kaynaklara erişir ve değiştirir. Burada her kaynak URI / Global ID’lerle tanımlanır. REST metin, JSON XML gibi bir kaynağı temsil etmek için çeşitli gösterimler kullanır. Bu arada en popüler kaynak JSON’dır.
HTTP yöntemleri
Dört HTTP yöntemi aşağıdaki REST tabanlı mimaride yaygın olarak kullanılmaktadır.
- GET – Bu, bir kaynağa salt okunur erişim sağlamak için kullanılır.
- PUT – Bu, yeni bir kaynak oluşturmak için kullanılır.
- DELETE – Bu bir kaynağı kaldırmak için kullanılır.
- POST – Mevcut bir kaynağı güncellemek veya yeni bir kaynak oluşturmak için kullanılır.
RESTful Web Servisleri
Bir web servisi, uygulamalar veya sistemler arasında veri alışverişinde kullanılan açık protokol ve standartların bir toplamıdır. Çeşitli programlama dillerinde yazılmış ve çeşitli platformlarda çalışan yazılım uygulamaları, web hizmetleri, tek bir bilgisayarda işlemler arası iletişime benzer şekilde İnternet gibi bilgisayar ağları üzerinden veri alışverişi yapmak için kullanılabilir. Bu birlikte işlerlik (örneğin Java ve Python arasındaki iletişim veya Windows ve Linux uygulamaları), açık standartların kullanımından kaynaklanmaktadır.
REST Mimarisi tabanlı web hizmetleri RESTful web hizmetleri olarak bilinir. Bu web servisleri, REST mimarisi kavramını uygulamak için HTTP yöntemlerini kullanmaktadır. RESTful bir web servisi genelde bir URI, Uniform Resource Identifier (JSON ve HTTP Metotları seti gibi kaynak gösterimi sağlayan bir hizmet) tanımlar.
Bir RESTful Örneği
JSON formatında “users.json” adında aşağıdaki verileri içeren bir dosyamız olsun. Bu dosyayı bir veritabanı gibi düşünelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "user1" : { "name" : "mahesh", "password" : "password1", "profession" : "teacher", "id": 1 }, "user2" : { "name" : "suresh", "password" : "password2", "profession" : "librarian", "id": 2 }, "user3" : { "name" : "ramesh", "password" : "password3", "profession" : "clerk", "id": 3 } } |
Bu verilere uygun olarak aşağıdaki RESTful API’leri yaratabiliriz.
URI | HTTP Metot | POST body | Result |
---|---|---|---|
listUsers | GET | empty | Show list of all the users. |
addUser | POST | JSON String | Add details of new user. |
deleteUser | DELETE | JSON String | Delete an existing user. |
:id | GET | empty | Show details of a user. |
Aşağıdaki örneklerde Form veya AJAX kullanmadan direkt verileri bir değişken gibi alınacaktır. Önceki bölümlerde anlatılan Express – Request nesnesi üzerinden verileri işleyebiliriz ve daha güzel bir görünüm tasarlayabilirsiniz.
listUsers (Kullanıcı Listeleme)
Kullanıcıları dosyadan okuyup istemciye göndermek için aşağıdaki gibi bir kod yazabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
var express = require('express'); var app = express(); var fs = require("fs"); app.get('/listUsers', function (req, res) { fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) { console.log( data ); res.end( data ); }); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("Dinleniyor: http://%s:%s", host, port) }) |
Programı yorumlandıktan sonra tarayıcımızı açıp “http://127.0.0.1:8081/listUsers” yazarak tanımlanmış API’ye erişerek deneyelim. Bu örnekte herhangi bir REST istemcisini kullanan yerel makineye HTTP Metot: GET istemi gönderilmiştir.
addUser (Kullanıcı Ekleme)
Bu örnekte veri bir HTML Form üzerinden alınmayacaktır. Sanki veri HTML Form’dan alınmış JSON formatına çevrilmiş ve bir değişken içine aktarılmış gibi düşünelim. Aşağıdaki örnekte bu değişken ismi “user” dır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
var express = require('express'); var app = express(); var fs = require("fs"); var user = { "user4" : { "name" : "mohit", "password" : "password4", "profession" : "teacher", "id": 4 } } app.post('/addUser', function (req, res) { // Oncelikle mevcut kullanicilari oku fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) { data = JSON.parse( data ); data["user4"] = user["user4"]; console.log( data ); res.end( JSON.stringify(data)); }); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("Dinleniyor: http://%s:%s", host, port) }) |
Bu örnekte http://127.0.0.1:8081/addUser adresine POST metodu ile tanımlanan API üzerinden erişilmiştir. Sonuç dosyaya değil, bir JSON çıktısı olarak istemciye gönderilmiştir. Burada, JSON.stringify metodu veriyi JSON formatına çevirmekte kullanılmıştır.
:id (Show Detail – Ayrıntı Göster)
Bu örnekte, bir kullancı ID’si üzerinden GET metodu ile veriler istenecektir. Örneğin “http://127.0.0.1:8081/2” gibi bir istemde 2 nolu ID’ye sahip kullanıcın bilgileri gönderilecektir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var express = require('express'); var app = express(); var fs = require("fs"); app.get('/:id', function (req, res) { //Mevcut kullanicilari oku fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) { var users = JSON.parse( data ); var user = users["user" + req.params.id]; //sadece bir kullanici console.log( user ); res.end( JSON.stringify(user)); }); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("Dinleniyor: http://%s:%s", host, port) }) |
deleteUser (Kullancı Sil)
Bu örnekte bir kullanıcı listeden silinip sadece kalan kullanıcılar JSON formatında istemciye gönderilecektir. Silme işleminde yukarıdaki gibi URL üzerinden ID bilgisi alınabilir. Ama bu örnekte id değişkene 2 sabit değeri verilecektir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
var express = require('express'); var app = express(); var fs = require("fs"); var id = 2; //silinecek kayit app.delete('/deleteUser', function (req, res) { // Mevcut kullanicilar fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) { data = JSON.parse( data ); delete data["user" + 2]; console.log( data ); res.end( JSON.stringify(data)); }); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("Dinleniyor: http://%s:%s", host, port) }) |
Bu örneklerde basit bir şekilde 4 işlem anlatılmıştır. Aslında bu örneği alıp veritabanına bağlayıp HTML FORM’ları hazırlayıp daha görsel ve işlevsel bir uygulama geliştirebilirsiniz. Buradaki amaç REST API’leri nasıl çalıştığını göstermekti.