Rest Api Nedir ?
Rest api platform bağımsız yazılımların haberleşmesi için kullanılan servislerden birisidir. Biraz daha açacak olursak php kullanarak yazdığımız bir yazılımın java kullanılarak yapılmış bir mobil uygulama veya swift kullanılarak yazılmış bir ios uygulaması ile haberleşmesini sağlayan yapıdır.
Rest Api Nedir ?
Rest api json veriler ile çalışan bir apidir. Neden json diye soracak olursanız; json üst seviye programlama dillerinde kolayca işlenebildiği için json ile işlemler gerçekleştirilir.
Json olarak veri yani request apiye gönderilir api gelen veriyi alır işler ve geriye bir response yani cevap döndürür. Bu cevapta requesti yapan yazılım tarafından tekrar alınır.
json bilmeyen arkadaşların öncelikle json.org sitesinden json ile ilgili bilgi edinmelerini öneririm.
Rest Api Özellikleri
- Platform bağımsızdır.
- Sunucu ve istemcinin aralarında anlaşabildiği bir json protokolü mevcuttur.
- HTTP methodlarından Get, Post, Put, Delete işlemlerini gerçekleştirebilir.
- Request – Response mantığıyla çalışır.
- Önbellekleme yapılabilir.
- Soaptaki gibi katı kurallar yoktur. Kuralları apiyi yazan kişi belirler.
Yukarıdaki görsele bakacak olursak client yani istemci sunucuya bir istek gönderiyor.
gelen isteği api alıyor ve arkaplanda sorguyla alakalı işlemleri gerçekleştirip geriye bir cevap döndürüyor.
Örnek verecek olursak: Kullanıcılarımızın olduğu bir veri tabanımız ve kullanıcı id sine göre bize kullanıcı bilgilerini veren bir rest apimiz olduğunu varsayalım.
Aşağıdaki şekilde bir get request ile kullanıcı bilgilerini görüntüleyebiliriz.
1
2
3
4
5
6
7
8
9
|
GET /kullanicilar/{kullaniciID}
// çıktı
{
"kullanıcıID": 1,
"adSoyad": "Vehbi Akdoğan",
"site" : "mobilhanem.com"
}
|
veya post methodu ile yeni bir kullanıcı eklemek isteyelim.
1
2
3
4
5
6
7
8
9
10
11
|
POST /kullanicilar/
// gönderdiğimiz veri
{
"adSoyad": "Vehbi Akdoğan",
"site" : "mobilhanem.com"
}
// cevap
{
"status":1
}
|
Ekleme işleminin gerçekleşme durumuna göre apinin bize cevap vermesi gerekir.
Bu dersimizde rest api hakkında bilgi edindik. Bir sonraki dersimizde ise rest api hazırlamaya başlayacağız. Apimizi test ederken chrome eklentisi olan Postman kullanacağız. Bir sonraki dersimizde postman eklentisini kurmuş olarak dersimizi okumaya başlamanızı öneririm.
Öncelikle yazacağımız rest apiyi kullanacak insanların gönderdikleri sorgulardan aldıkları cevap türlerini header içerisinde için HTTP mesajları eklememiz gerekmektedir. HTTP mesajlarının listesine buradan bakabilirsiniz.
Rest apinin temel mantığı tek bir base url kullanarak çoklu işlev gerçekleştirmektir. Biraz daha detaylı anlatacak olursam; örneğin bizim base urlimiz /users/ olsun bu linke:
- POST methodu ile sorgu istek atarsak üye ekleme,
- PUT methodu ile sorgu atarsak güncelleme,
- GET methodu ile sorgu atarsak listeleme,
- DELETE methodu ile istek atarsak silme işlemi gerçekleştirsin.
Rest apiyi hazırlarken örnek alacağımız proje basit bir üyelik uygulaması olacak. Apiyi tamamladığımızda yazdığımız aşağıdaki işlemleri gerçekleştirebiliyor olacak.
- Üye Kayıt
- Üye Giriş
- Üye Bilgileri Güncelleme
- Üye Bilgileri Çekme
- Üyelik Silme
Apiyi hazırladıktan sonra android tarafında da bir uygulama hazırlayıp yazdığımız rest apiyi test edeceğiz.
Sitemizde henüz OOP dersleri yayınlamadığımız için yazacağımız rest apiyi salt php kodları ile hazırlayacağız. İstek olması durumunda OOP yani nesne yönelimli olarakta apimizi yazabiliriz.
Öncelikle veri tabanımızı hazırlayalım.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
--
-- Veritabanı: `restapi`
--
-- --------------------------------------------------------
--
-- Tablo için tablo yapısı `uyeler`
--
CREATE TABLE IF NOT EXISTS `uyeler` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`kullaniciAdi` varchar(25) NOT NULL,
`adSoyad` varchar(100) NOT NULL,
`sifre` varchar(255) NOT NULL,
`posta` varchar(20) NOT NULL,
`telefon` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
|
Apiye üye kayıt ekranından başlayarak yapmaya başlayalım.
Öncelikle apimize ait bir klasör oluşturup (örneğin mobilhanem/uyelik) temel ayarlarımızı yapalım.
1- Veri Tabanı Bağlantısı
db.php adında bir dosya oluşturup veri tabanı bağlantımızı yapalım. Rest apimiz boyunca ben veri tabanı işlemleri için PDO kütüphanesini kullanacağım.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php
$host = "localhost";
$user = "root";
$pass = "";
$db = "restapi";
try {
$db = new PDO("mysql:host=$host;dbname=$db", $user, $pass);
$db->query("SET CHARACTER SET utf8");
}catch(PDOException $e) {
die( $e->getMessage());
}
?>
|
Veri tabanı bağlantımızda hata olup olmadığını anlamak için tarayıcı üzerinden localhost/mobilhanem/db.php çalıştıralım. Boş bir sayfa çıkarsa bağlantımız sağlanmış demektir.
2- Kullanacağımız Fonksiyonlar
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
<?php
// HTTP durum kodlarını getiren fonksiyonumuz.
function HttpStatus($code) {
$status = array(
100 => 'Continue',
101 => 'Switching Protocols',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => '(Unused)',
307 => 'Temporary Redirect',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported');
// gönderilen kod listede yok ise 500 durum kodu gönderilsin.
return $status[$code] ? $status[$code] : $status[500];
}
// Header ayarlama fonksiyonu
function SetHeader($code){
header("HTTP/1.1 ".$code." ".HttpStatus($code));
header("Content-Type: application/json; charset=utf-8");
}
// kullanıcı adının uyumluluğunu kontrol eden fonksiyonumuz.
function kullaniciAdi($s) {
$tr = array('ş','Ş','ı','İ','ğ','Ğ','ü','Ü','ö','Ö','Ç','ç');
$eng = array('s','s','i','i','g','g','u','u','o','o','c','c');
$s = str_replace($tr,$eng,$s);
$s = strtolower($s);
$s = preg_replace('/&.+?;/', '', $s);
$s = preg_replace('/[^%a-z0-9 _-]/', '', $s);
$s = preg_replace('/s+/', '-', $s);
$s = preg_replace('|-+|', '-', $s);
$s = trim($s, '-');
return $s;
}
?>
|
Hangi fonksiyonu ne için kullandığımızı üzerine açıklama olarak yazdık.
3- .htaccess Dosyası İle Url Yapısı
Biz gelen bütün istekleri index.php de karşılayacağız. bu yüzden apiye hangi url girilirse girilsin bu urli index.php ye yönlendirip urlin sonundaki değerleri de get methodu ile index.php den alacağız.
Kodlarımızı eklemeden önce örnek verecek olursak:
Kullanıcının göreceği ve kullanacağı url:
=> localhost/mobilhanem/users/{5}Arkaplanada çalışan kimsenin göremediği url:
=> index.php?islem=user_id=5normal şartlarda 1. urlin çalışması için uyelik/5 yolunda klasör yapımız ve içinde 5 i alabileceğimiz bir yapı olması gerekiyordu.
ama biz url yapımızı editleyerek yukarıdaki gibi yapacağız.
Başlangıçtaki .htaccess kodlarımız:
1
2
3
4
|
#gelen tüm istekleri index.php den karşılayalım.
RewriteEngine on
RewriteRule ^users/$ index.php [QSA,L]
RewriteRule ^users/([0-9+])/$ index.php?user_id=$1 [QSA,L]
|
index.php sayfamızda apinin methodları ile ilgili kısımları ekleyelim. Hangi linkte ne komutu işletileceği ile alakalı koşularımızı ekleyelim.
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
|
<?php
include "db.php";
include "function.php";
$islem = isset($_GET["islem"]) ? addslashes(trim($_GET["islem"])) : null;
$jsonArray = array(); // array değişkenimiz bunu en alta json objesine çevireceğiz.
$jsonArray["hata"] = FALSE; // Başlangıçta hata yok olarak kabul edelim.
$_code = 200; // HTTP Ok olarak durumu kabul edelim.
$_method = $_SERVER["REQUEST_METHOD"]; // client tarafından bize gelen method
// aldığımız işlem değişkenine göre işlemler yapalım.
if($_method == "POST") {
// üye ekleme kısmı burada olacak. CREATE İşlemi
}else if($_method == "PUT") {
// üye güncelle kısmı burada olacak. PUT işlemi
}else if($_method == "DELETE") {
// üye silme işlemi burada olacak. DELETE işlemi
}else if($_method == "GET") {
// üye bilgisi listeleme burada olacak. GET işlemi
}else {
// hatalı bir parametre girilmesi durumunda burası çalışacak.
$jsonArray["hata"] = TRUE; // bir hata olduğu bildirilsin.
$jsonArray["hataMesaj"] = "Girilen İşlem Bulunmuyor."; // Hatanın neden kaynaklı olduğu belirtilsin.
}
SetHeader($_code);
$jsonArray[$_code] = HttpStatus($_code);
echo json_encode($jsonArray);
?>
|
Apimizin 1.adımı olan üye ekleme işlemini yaparsak, üye ekleme bir CREATE işlemi olduğu için POST methodu kullanmalıyız.
4- Rest Api ile Http Post Methodu Kullanımı
Get methodu nedir bilmeyenler get ve post methodunu anlattığımız dersimize ve get ve post methodu ile ilgili yaptığımız örneklere bakabilirler. Rest apide de get ve post methodunun kullanımında bir farklılık yoktur.
Şimdi üye eklemek için gerekli php kodumuzu yazalım ve geriye eklenme durumunu gösteren bir json çıktısı verelim.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
if($_SERVER['REQUEST_METHOD'] == "POST") {
// verilerimizi post yöntemi ile alalım.
$kullaniciAdi = addslashes($_POST["kullaniciAdi"]);
$adSoyad = addslashes($_POST["adSoyad"]);
$sifre = addslashes($_POST["sifre"]);
$posta = addslashes($_POST["posta"]);
$telefon = addslashes($_POST["telefon"]);
// Kontrollerimizi yapalım.
// gelen kullanıcı adı veya e-posta veri tabanında kayıtlı mı kontrol edelim.
$uyeler = $db->query("SELECT * from uyeler WHERE kullaniciAdi='$kullaniciAdi' OR posta='$posta'");
if(empty($kullaniciAdi) || empty($adSoyad) || empty($sifre) || empty($posta) || empty($telefon)) {
$_code = 400;
$jsonArray["hata"] = TRUE; // bir hata olduğu bildirilsin.
$jsonArray["hataMesaj"] = "Boş Alan Bırakmayınız."; // Hatanın neden kaynaklı olduğu belirtilsin.
}
else if(!filter_var($posta,FILTER_VALIDATE_EMAIL)) {
$_code = 400;
$jsonArray["hata"] = TRUE; // bir hata olduğu bildirilsin.
$jsonArray["hataMesaj"] = "Geçersiz E-Posta Adresi"; // Hatanın neden kaynaklı olduğu belirtilsin.
}else if($kullaniciAdi != kullaniciAdi($kullaniciAdi)){ // kullaniciAdi fonksiyonunu db.php dosyası içerisinden bakabilirsiniz.
$_code = 400;
$jsonArray["hata"] = TRUE; // bir hata olduğu bildirilsin.
$jsonArray["hataMesaj"] = "Geçersiz Kullanıcı Adı"; // Hatanın neden kaynaklı olduğu belirtilsin.
}else if($uyeler->rowCount() !=0) {
$_code = 400;
$jsonArray["hata"] = TRUE; // bir hata olduğu bildirilsin.
$jsonArray["hataMesaj"] = "Kullanıcı Adı Veya E-Posta Alınmış.";
}else {
$ex = $db->prepare("INSERT INTO uyeler set
kullaniciAdi= :kadi,
adSoyad= :ads,
sifre= :pass,
posta= :mail,
telefon= :tlf");
$ekle = $ex->execute(array(
"kadi" => $kullaniciAdi,
"ads" => $adSoyad,
"pass" => $sifre,
"mail" => $posta,
"tlf" => $telefon
));
if($ekle) {
$_code = 201;
$jsonArray["mesaj"] = "Ekleme Başarılı.";
}else {
$_code = 400;
$jsonArray["hata"] = TRUE; // bir hata olduğu bildirilsin.
$jsonArray["hataMesaj"] = "Sistem Hatası.";
}
}
}
|
Şimdi Postman aracılığı ile test edelim.
1. Kullanacağımız method. (Üye ekleme için POST)
2. Api URL. (Çalıştığınız api url yazın)
3. Değişkenleri gönderme şekli. Biz form elemanı olarak gönderdiğimiz için 2. seçeneği seçiyoruz.
4. Apiye gönderilecek değişkenler.
5. Header status kodu.
6. Apiye bilgiler gönderildikten sonra apinin bize vermiş olduğu cevap, output.
5- Rest Api ile Http PUT Methodu Kullanımı
Http put methodu get ve post methoduna göre biraz farklı çalışır. normalde istemci tarafından bize bir json veri gelir bizde bu json veriyi alıp diziye çevirmemiz gerekir. Json veriyi aşağıdaki şekilde alabiliriz.
1
2
3
4
|
<?php
echo file_get_contents("php://input");
?>
|
yukarıdaki kod ekrana json bir çıktı üretecektir. Şimdi aldığımız json veriyi json_decode fonksiyonu ile diziye çevirelim. json_decode fonksiyonu ile ister bir objeye istersekte arraye çevirebiliriz.
örneğin:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
$json = '
{
"ad_soyad": "vehbiakdgan",
"site": "mobilhanem.com"
}
';
var_dump(json_decode($json)); // obje olarak çevirir
var_dump(json_decode($json,true)); // dizi olarak çevirir
?>
|
istediğiniz yöntemi kullanabilirsiniz. Ben dersi analtırken object üzerinden anlatacağım.
Put methodu kullanırken nasıl veri alabileceğimizi ve nasıl çevireceğimizi öğrendiğimize göre artık üye bilgilerini güncelleme işlemi yapabiliriz.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
else if($_SERVER['REQUEST_METHOD'] == "PUT") {
$gelen_veri = json_decode(file_get_contents("php://input")); // veriyi alıp diziye atadık.
// basitçe bi kontrol yaptık veriler varmı yokmu diye
if( isset($gelen_veri->kullanici_adi) &&
isset($gelen_veri->ad_soyad) &&
isset($gelen_veri->posta) &&
isset($gelen_veri->user_id) &&
isset($gelen_veri->telefon)
) {
if($db->query("select * from uyeler where id='$gelen_veri->user_id'")->rowCount() == 0 ) {
// Üye yok ise hata veriyoruz.
$_code = 400;
$jsonArray["hata"] = TRUE;
$jsonArray["hataMesaj"] = "Belirtilen id de üye bulunamadı.";
}else if(!filter_var($gelen_veri->posta,FILTER_VALIDATE_EMAIL)) {
// E-mail geçersiz ise hata veriyoruz.
$_code = 400;
$jsonArray["hata"] = TRUE;
$jsonArray["hataMesaj"] = "Geçersiz E-mail adresi.";
}
else {
// veriler var ise güncelleme yapıyoruz.
$q = $db->prepare("UPDATE uyeler SET kullaniciAdi= :kadi, adSoyad= :ad_soyad, posta= :posta, telefon= :telefon WHERE id= :user_id ");
$update = $q->execute(array(
"kadi" => $gelen_veri->kullanici_adi,
"ad_soyad" => $gelen_veri->ad_soyad,
"posta" => $gelen_veri->posta,
"telefon" => $gelen_veri->telefon,
"user_id" => $gelen_veri->user_id
));
// güncelleme başarılı ise bilgi veriyoruz.
if($update) {
$_code = 200;
$jsonArray["mesaj"] = "Güncelleme Başarılı";
}
else {
// güncelleme başarısız ise bilgi veriyoruz.
$_code = 400;
$jsonArray["hata"] = TRUE;
$jsonArray["hataMesaj"] = "Sistemsel Bir Hata Oluştu";
}
}
}else {
// gerekli veriler eksik gelirse apiyi kulanacaklara hangi bilgileri istediğimizi bildirdik.
$_code = 400;
$jsonArray["hata"] = TRUE;
$jsonArray["hataMesaj"] = "kullanici_adi,ad_soyad,posta,telefon,user_id Verilerini json olarak göndermediniz.";
}
}
|
üye güncelleme işlemini de bitirdik arkadaşlar. Postman aracılığı ile test edecek olursak:
Öncelikle postmandaki raw kısmından raw data olarak json göndereceğiz. Sizde aşağıdaki görseldeki şekilde veri gönderirseniz çalışacaktır.
6- Rest Api İle Http Delete Methodu
Şimdi silme işlemi yapacağımız için httpy ait delete methodunu kullanacağız. Sileceğimiz üyeye ait user_id değerini alıyoruz ve veritabanımızda o id ye ait bir üye varsa siliyoruz.
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
|
else if($_SERVER['REQUEST_METHOD'] == "DELETE") {
// üye silme işlemi burada olacak. DELETE işlemi
if(isset($_GET["user_id"]) && !empty(trim($_GET["user_id"]))) {
$user_id = intval($_GET["user_id"]);
$userVarMi = $db->query("select * from uyeler where id='$user_id'")->rowCount();
if($userVarMi) {
$sil = $db->query("delete from uyeler where id='$user_id'");
if( $sil ) {
$_code = 200;
$jsonArray["mesaj"] = "Üyelik Silindi.";
}else {
// silme başarısız ise bilgi veriyoruz.
$_code = 400;
$jsonArray["hata"] = TRUE;
$jsonArray["hataMesaj"] = "Sistemsel Bir Hata Oluştu";
}
}else {
$_code = 400;
$jsonArray["hata"] = TRUE; // bir hata olduğu bildirilsin.
$jsonArray["hataMesaj"] = "Geçersiz id"; // Hatanın neden kaynaklı olduğu belirtilsin.
}
}else {
$_code = 400;
$jsonArray["hata"] = TRUE; // bir hata olduğu bildirilsin.
$jsonArray["hataMesaj"] = "Lütfen user_id değişkeni gönderin"; // Hatanın neden kaynaklı olduğu belirtilsin.
}
}
|
Delete işleminde de get kulanabiliriz. örneğin: http://localhost/mobilhanem/users/5 şeklinde link girdiğimizde postmana 5 numaralı id ye sahip üye silinecektir.
Şimdi son olarak üye bilgilerini listeleyip rest apimizi tamamlayalım.
7- Rest Api İle Http Get Methodu
Üye sil işlemindeki gibi bir user_id değeri gönderip geriye cevap olarak üyeye ait bilgileri listeleyelim.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
else if($_SERVER['REQUEST_METHOD'] == "GET") {
// üye bilgisi listeleme burada olacak. GET işlemi
if(isset($_GET["user_id"]) && !empty(trim($_GET["user_id"]))) {
$user_id = intval($_GET["user_id"]);
$userVarMi = $db->query("select * from uyeler where id='$user_id'")->rowCount();
if($userVarMi) {
$bilgiler = $db->query("select * from uyeler where id='$user_id'")->fetch(PDO::FETCH_ASSOC);
$jsonArray["uye-bilgileri"] = $bilgiler;
$_code = 200;
}else {
$_code = 400;
$jsonArray["hata"] = TRUE; // bir hata olduğu bildirilsin.
$jsonArray["hataMesaj"] = "Üye bulunamadı"; // Hatanın neden kaynaklı olduğu belirtilsin.
}
}else {
$_code = 400;
$jsonArray["hata"] = TRUE; // bir hata olduğu bildirilsin.
$jsonArray["hataMesaj"] = "Lütfen user_id değişkeni gönderin"; // Hatanın neden kaynaklı olduğu belirtilsin.
}
}
|
Ve böylelikle başlangıç seviyesinde rest apiyi bitirmiş olduk. Rest api kodlarının tamamına aşağıdaki linkten ulaşabilirsiniz.
Php İle Başlangıç Seviyede Rest Api
Kaynak