Merhaba arkadaşlar mobilhanem.com üzerinden hazırladığımız rest api eğitimlerinde bir önceki dersimizde rest api hakkında bilgiler vermiştik. Bu dersimizde artık rest apimizin temellerini atacağız. Ö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.
-- -- 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.
<?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
<?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:
#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.
<?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.
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.
<?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:
<?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.
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.
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.
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.
Konuyla ilgili yorumlarınızı konu altından yapabilirsiniz, ayrıca sorularınızı yine konu altından ve Mobilhanem Soru&Cevap bölümünden sorabilirsiniz.
422