İyi günler bu yazımda Laravel ile api işlemlerini göstereceğim.Öncelikle Api nedir biraz ondan bahsediyim.Api (Application Programming Interface) kelime anlamı olarak uygulama programlama arayüzüdür.Api bir uygulamadaki istediğimiz işlevlerin başka uygulamalarda da kullanılmasını sağlar.Diyelim ki bir web yazılımınız var ve bu yazılımdaki müşterileri farklı bir uygulamada da kullanmak istediniz işte burda Api devreye giriyor.İzin verdiğiniz işlevleri dışarıya açabiliyorsunuz.Tabi burda bazı kontrollerin olması gerekiyor.Eğer kontroller olmazsa api saldırıya açık olabilir veya bilgileriniz başkaları tarafından görünebilir.
Laravel geliştirme konusunda gerçekten çok başarılı bir framework,ihtiyaç duyulan çoğu standart şeyleri içinde barındırıyor.Bu da bize performans konusunda biraz ödün versede zaman açısından çok hızlandırıyor.Şimdi yavaştan veritabanı kısmı ile başlayıp daha sonrasında Laravel ile kodlamamızı yapalım.
Öncelikle veritabanı oluşturup tabloları ekleyelim.Burasını sql cümlelerini verip hızlı geçiyorum.Siz kendinize göre düzenleyebilirsiniz.İsterseniz migration oluşturabilirsiniz isterseniz bu şekilde yapabilirsiniz.Ben şu an hızlı olması açısından migration oluşturmuyorum.Users ve articles adında iki tane tablo oluşturdum.Users tablosunda kullanıcı bilgilerini ,articles tablosunda ise api üzerinden ulaşabileceğim bilgileri tutacağım.Ben tablolarımda zaman damgalarını (created_at,updated_at) her zaman kullanıyorum siz isterseniz kullanmayabilirsiniz.
create table users ( id bigint unsigned auto_increment primary key, name varchar(255) not null, email varchar(255) not null, email_verified_at timestamp null, password varchar(255) not null, remember_token varchar(100) null, created_at timestamp null, updated_at timestamp null, api_token varchar(255) null, constraint users_api_token_unique unique (api_token), constraint users_email_unique unique (email) )collate = utf8mb4_unicode_ci;
create table articles ( id int unsigned auto_increment primary key, title varchar(255) not null, body text not null, created_at timestamp null, updated_at timestamp null, constraint articles_title_uindex unique (title) )collate = utf8mb4_unicode_ci;
Tabloları oluşturduktan sonra sıfırdan bir Laravel projesi oluşturalım.Projeyi composer üzerinden oluşturuyorum.
composer create-project laravel/laravel ApiProjesi
Projemiz standart Laravel dosya yapısı ile oluştu.Başlamadan bazı ayarlamalar yapmamız gerekiyor.Eğer local geliştirme ortamında çalışıyorsanız .env dosyasında,production ortamında çalışıyorsanız config klasöründeki dosyalarda config ayarlarını yapmanız gerekmektedir.Unutmadan söylemek istiyorum production ortamında .env dosyanızı silin.Ben şu an local geliştirme ortamında olduğum için .env dosyası ile çalışacağım.
.env dosyamızda APP_KEY boş ise proje açılırken hata verecektir.Bunun için php artisan key:generate komutunu verip proje için key oluşturun.Veritabanı ayarlarını aşağıdaki satırları değiştirerek yapabilirsiniz.
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE= DB_USERNAME= DB_PASSWORD=
Ayarlarımızı yaptıktan sonra php artisan serve diyerek projemizi ayağa kaldıralım.Bizi standart olarak Laravel açılış sayfası karşılıyor.Bizim şu an görünüm kısımları ile işimiz yok.Şimdi model dosyalarımızı oluşturalım.Laravel 8 ile app klasörü altında Models klasörü geldi.Daha öncesinde kendimiz oluşturuyorduk artık klasör standart olarak geliyor.
Models klasöründe yine standart olarak User modeli geliyor.User modelinde değişiklik yapmıyoruz.Article isminde bir adet model oluşturuyoruz.Model dosyamızın içeriği bu şekildedir.
app/Model/Article.php
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Article extends Model { protected $table="articles"; protected $fillable = ['title', 'body']; }
Daha sonrasında ise rotalarımızı oluşturuyoruz.Burda normal rota oluşturmaktan farklı olarak web.php dosyası yerine api.php dosyasında rotalarımızı oluşturuyoruz.Rotamızda sadece token alma,verileri listeleme ve ekleme işlemleri var.Burdaki kısımları kendinize göre özelleştirebilirsiniz.
Burda önemli kısımlardan biri middleware kullanmaktır.Ajax isteği dışındaki istekleri engellemek için burda middleware kullanacağız.Bunun için bulunduğumuz klasörde terminal açıp php artisan make:middleware Api yazıp çalıştırıyoruz.Burda handle fonksiyonun içeriğini aşağıdaki gibi değiştiriyoruz.
app/Http/Middleware/Api.php
if(!$request->acceptsJson()){ abort(401); } return $next($request);
Daha sonrasında ise app/Http/Kernel.php içerisinde $middleWareGroups dizisinde api altına middleware adımızı ve yolunu ekliyoruz.Bunları yaptıktan sonra php artisan optimize kodunu çalıştırmanız iyi olur.Middleware sayesinde tarayıcıdan api adreslerine girmeye çalıştığımız zaman 401 hatasını dönderecek.
'api' => \App\Http\Middleware\Api::class
routes.php/api.php
Route::post('login', [ArticleApiController::class,'login']); Route::middleware('api')->group(function() { Route::get( 'articles', [ArticleApiController::class,'articles']); Route::post('article-add', [ArticleApiController::class,'create']); });
Rotalarımızı ve middleware yapımızı şu an ayarladık sıra controller oluşturup gerekli fonksiyonları yazmaya geldi.Login metodu bizim burda token oluşturup geri dönüş yaptığımız metodumuz olacak.
Login metodumuzda kullanıcıdan gelen e-posta ve şifreyi Auth::attempt ile kontrol ediyoruz.Burdan eğer true dönerse $token değişkenimize rastgele bir string oluşturup atıyoruz.Daha sonrasında tokeni veritabanınında sha256 ile kriptolayıp kayıt ediyoruz.
Articles metodunda tümünü gösteriyoruz create metonda ise gelen tüm değerleri gönderip veriyi oluşturuyoruz.
<?php namespace App\Http\Controllers; use App\Models\Article; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class ArticleController extends Controller { public function login(){ if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){ $token = Str::random(60); $request->user()->forceFill([ 'api_token' => hash('sha256', $token), ])->save(); return response()->json(['token' => $token], "200"); } else{ return response()->json(['error'=>'Unauthorised'], 401); } } public function articles() { return Article::all(); } public function create(Request $request) { try { $add=Article::create($request->all()); if ($add) { return response()->json(['status'=>'success'], 201); } else { return response()->json(['status'=>'error'], 400); } } catch (\Exception $exception) { return response()->json(['status'=>'error','error'=>$exception->getMessage()], 400); } } }
Şimdi bu yaptıklarımızı Postman üzerinden test edelim.php artisan serve diyerek projemizi çalıştıralım.Url üzerinden gönderilen parametreleri kendinize göre düzenleyiniz.Burda önemli nokta rotamızı post veya get olarak api.php dosyasına eklediysek o şekilde istek atıyoruz.
Token almak için kullanacağımız url : http://localhost:8000/api/login?email=&password=
Başarılı ise dönen cevap :
{ "token":"jFzosMPXtW6lCvLISHJQMRrnrnVlqpaql2WvlhZJGZUxiW1AINL12vYsBZFY" }
Başarısız ise dönen cevap :
{ "error": "Unauthorised" }
Tokenimizi aldıktan sonra ise bunu Authorization sekmesinden Bearer Token seçip token alanına yapıştırıyoruz.Bundan sonraki isteklerimizde bu tokeni kullanacağız.
İstek göndereceğimiz adres : http://localhost:8000/api/articles
Burda önemli olan şey aldığımız tokeni Authorization kısmında type seçeneğinden Bearer Token ile göndermektir.Bu şekilde tokeni token kısmına yapıştırdıktan sonra bize istenilen bilgileri verecektir.Bu listeleme yaptığımız bir istekti şimdi de ekleme işlemini yapalım.
İstek göndereceğimiz adres : http://localhost:8000/api/add-article
Post isteği ile parametrelerimizi gönderdikten ve ekleme işlemi tamamlandı ise başarılı değilse hata sonucu ile beraber başarısız sonucunu dönderdik.
Laravel Api işlemlerimiz bu kadardı,sizler bunu geliştirip kendinize göre düzenleyebilirsiniz.Kısaca middleware ve route yapısınıda anlatmış oldum.Daha sonraki yazılarımda görüşmek dileğiyle herkese iyi kodlamalar diliyorum.