REST API ile mobil uygulama yapma

Katılım
4 Ekim 2014
Mesajlar
2.376
Makaleler
1
Çözümler
35
Yer
Super Mario World
Bir arkadaşımla bir proje üzerinde çalışıyoruz. Ben mobil uygulama (şimdilik Java ve Android Studio ile Android uygulama), arkadaşım da Laravel ile web sitesi geliştiriyor. REST API'yi kullanmamız gerektiğini uzun araştırmalar sonucu öğrendik fakat tam olarak nasıl kullanacağımızı anlayamadık.

İncelediğim kaynaklarda genelde bir linkten JSON verisi alınıp işleniyor. Buraya kadar tamam da bu linkte sürekli JSON verisi mi oluyor? Binlerce kullanıcı, sorgu olabileceğini düşünürsek, karışmayacak mıdır? Mesela bir kullanıcı adı sorgusu yapacağımızı düşünelim. Bütün kullanıcıları veri tabanından alıp bu sözde linke hepsini mi yazdıracak? Böyle güvenlik olmaz ki. Yani herkes bu linke erişemez mi? Mesela örnek olarak; https://www.google.com/users REST API'deki bu soru işaretlerimden dolayı yanlış da düşünüyor olabilirim.

Tam olarak kendimi ifade edemiyorum fakat illa ki bilen birileri vardır diye düşünüyorum. Hem benim dışımda başkalarının da kafasındaki bu soru işareti gidecektir. Teşekkürler.
 
Son düzenleyen: Moderatör:
Ben yillardir her projede REST kullaniyorum farkli farkli sirketler icin. Bankalar da dahil buna.

Tum kullanici listesini donmezsin her istege.
Sadece authorized isteklere bu sonucu donersin, ayrica tum listeyi donmek diye bir sey de olmaz, pagination yapman gerekir. Ayrica her authorization bir token sayesinde gerceklesir, her auth token bir authentication neticesinde uretilir. REST authentication ve authorization ayriminin en net yapildigi seylerden biri.

REST de guvenlik token lar ile saglanir, bunu da HTTP Header inda gonderirsin. Body de gitmez, cunku her request body payload i icermez.

Kullanici listesini herkes alamayacak isin ozu. Alabilecekse herkes, zaten o veri gizli degildir.

HTTP isteklerini zarf gibi dusun, icinde birden fazla kagit var. Birinde header yazar. Authorizarion burdan yapilir agirlikli olarak. Birinde request method ve URL yazar, ne yapilacagini burdan anlarsin. Digerinde de payload yani senin esas ihtiyacin olan data yer alir. Business logic buradan doner. Bu katmanlari ayirmak en dogrusudur.

Bilerek yazilim jargonuyla cevapladim soruyu, google da aratabilesin diye.
 
Öncelikle cevap verdiğiniz için teşekkür ederim. Kafam çok karışık mazur görün. Şimdi diyelim GET isteği gönderdim. Cevap bir linke JSON olarak mı yazdırılıyor? Bu linke herkes erişemiyor mu? DELETE isteği gönderdiğimde ne oluyor mesela?

Örneğin, kullanıcı giriş yapacak diyelim. Tam olarak nasıl bir yol izleniyor?

Bir de JSON Web Token diye bir token sistemi varmış, bunu kullanmak zorunda mıyız?

Çok parça parça yazdım kusura bakmayın.
 
Son düzenleme:
Öncelikle cevap verdiğiniz için teşekkür ederim. Kafam çok karışık mazur görün. Şimdi diyelim GET isteği gönderdim. Cevap bir linke JSON olarak mı yazdırılıyor? Bu linke herkes erişemiyor mu? DELETE isteği gönderdiğimde ne oluyor mesela?

Örneğin, kullanıcı giriş yapacak diyelim. Tam olarak nasıl bir yol izleniyor?

Bir de JSON Web Token diye bir token sistemi varmış, bunu kullanmak zorunda mıyız?

Çok parça parça yazdım kusura bakmayın.

Bence senin kafanda cok parca parda duruyor mesele, o yuzden bu kadar oturmamis gibi : ) Sorun yok istedigin kadar sor, arastirip geldigin belli en azindan.

JSON Web Token kullanmak zorunda degilsin. Ama bir token kullanmak durumundasin. JWT nin guzelligi, encryption ile token icerisine kullanici bilgilerinin gomulmesi. Yani standart bir token isleminde, token yalnizca kullaniciya ait gelisiguzel olusturulmus bir String. Sen bu string'i alip, hangi kullaniciya ait oldugunu veritabanina giderek bulmak durumundasin. JWT de ise durum farkli, token'in kendisi bilgi iceriyor. Bu biraz daha riskli aslinda guvenlik acisindan ancak veritabanina gereksiz git-gel lerin onune gectigi icin daha hizli. Bu belki isine yaramayacak bir detay ama JWT kullanmaniz sart degil. Hatta tam olarak ne yaptiginizi bilmiyorsaniz kullanmayin bence.

Cevabin JSON'a yazdirilmasi diye bir sey yok. En temel HTTP protokolune geri donelim; Request atarsin - Response donersin. Bu kadar. Her request ve response icinde bir "payload" barindirir. REST icin bu payload genelde JSON formatindadir. Bu kadar. JSON olmak zorunda bile degil aslinda. REST 'i REST yapan Request Methodlandirmasi ve URL isimlendirmesi; JSON degil.

Yani sen GET request i atarsin, server bunu degerlendirir ve sana bir response doner. Iste o response'un payload'i JSON icerecektir. Bu kadar basit. Her response payload icermek zorunda degil. Her request de ayni sekilde.

Kullanici girisi farkli bir mesele. Authenticate ve authorize iki farkli konsept.

Ahmet'in ahmet oldugundan nasil emin olursun? Ahmet'in kendine ait sifresini ve diger bilgilerini girmesini istersin. Buna "Authentication" denilir. Bir kisinin iddia ettigi kisi oldugundan emin olmaca. Aslinda bu hep bildigimiz login islemi. Ama sonucunda sen Ahmet'e bir token verirsin. Bu demektir ki " Ahmet'cigim ben seni tanidim ve sen hakkaten soyledigin kisisin. Al sana bu token'i. Bundan sonra bana istek yaptiginda her defasinda ben Ahmet'im demene gerek yok, bu token ile gelsen yeterli".

Iste bundan sonraki her request Ahmet tarafindan geldiginde senin ona verdigin token'i icermeli. O noktada server token i kontrol edecek
1) O token gercekten gecerli mi ( suresi dolmus mu vs )
2) O token'a sahip birisi bu request e yetkili mi ( Ornegin Ahmet kendi token'iyla tum user listesini cekebilir mi )

Bu islem de authorization. Kisinin kim oldugunu umursamadan, yapilacak isleme yetkisi olup olmadigini degerlendirme proseduru.

Ben kapiciyim. Herkese ekmek alirim ama sadece apartman yoneticisine sut alirim.

Apartmana giren herkes bekciye kendini tanitiyor. Bekci onlara "token" veriyor.

Ben kapici olarak ev ev gezip isteklerini soruyorum. Kapiyi cocuk da acabilir, eve gelen misafir de acabilir. Beni ilgilendirmez. Ben "token" a bakarim. Bekciyle konustum, hangi token'larin ekmek, hangi tokenlarin sut almasi gerektigini biliyorum. Token'a bakarim token mi diye, sorana bakarim istegi makul mu diye : ) Eger her sey olmasi gerektigi gibiyse isimi yaparim.

Bu senaryoda bekci authenticate ediyor.

Kapici authorize ediyor.

Tum bu islemin amaci, bekci ve kapici sistemini birbirinden ayirmak ve herkesin isini kolaylastirmak. Hem guvenli, hem hizli hem pratik.
 
Cevabin JSON'a yazdirilmasi diye bir sey yok.
Linkten JSON verilerini alıp, parse ediyorlar izlediğim videolarda. Bir linkten alıyorlar verileri derken şunu kastediyordum; Şu videonun 3:10'daki bölümünde görebilirsiniz. mesela "/posts" kısmına girince, orada bir JSON dizisi bulunuyor (sanırım dizi). Belki neden anlamadığımı buradan anlayabilirsiniz.

JSON parse ediyorlar izlediğim videolarda, authenticate hakkında bilgi vermiyorlar. Token'i nerede üretiyoruz ve token veritabanına falan mı kaydoluyor? Benim anlamadığım izlediğim videoların hepsinde, JSON verilerini bir linkten almaları. Ve bu linki tarayıcıda açıp, JSON verilerini okuyabiliyoruz. Ben mi karıştırıyorum kendi kafamda acaba? Baya açıklayıcı bir şekilde yazmışsınız fakat bir türlü anlayamadım, kusura bakmayın. Okuldaki hocalar da bilmiyor sanırsam REST API'yi. Bir hocam biliyor onu da yakalayamıyorum bir türlü :)
 
Son düzenleme:
Linkten JSON verilerini alıp, parse ediyorlar izlediğim videolarda. Bir linkten alıyorlar verileri derken şunu kastediyordum; Şu videonun 3:10'daki bölümünde görebilirsiniz. mesela "/posts" kısmına girince, orada bir JSON dizisi bulunuyor (sanırım dizi). Belki neden anlamadığımı buradan anlayabilirsiniz.

JSON parse ediyorlar izlediğim videolarda, authenticate hakkında bilgi vermiyorlar. Token'i nerede üretiyoruz ve token veritabanına falan mı kaydoluyor? Benim anlamadığım izlediğim videoların hepsinde, JSON verilerini bir linkten almaları. Ve bu linki tarayıcıda açıp, JSON verilerini okuyabiliyoruz. Ben mi karıştırıyorum kendi kafamda acaba? Baya açıklayıcı bir şekilde yazmışsınız fakat bir türlü anlayamadım, kusura bakmayın. Okuldaki hocalar da bilmiyor sanırsam REST API'yi. Bir hocam biliyor onu da yakalayamıyorum bir türlü :)

O videoda gordugun sey, Chrome sebebiyle sana o sekilde gorunuyor.

Ornek URL: https://jsonplaceholder.typicode.com/todos/1

Bu adresi Chrome'a yazinca Chrome bune "GET" request gonderiyor. Sonuc da, Content-Type application/json oldugu icin JSON olarak ekrana bastiriliyor, hepsini Chrome yapiyor. Sen uygulamanda bu request'i gonderdiginde JSON sana response payload'i icinde gelecek.

Yukaridaki ornek icin Chrome dev tools'dan bakarsan:
382090


382091


Gordugun gibi ekrana bastirilan JSON aslinda Response icinde geliyor. Yani sen request gonderiyorsun, server respose olarak sana Content-Type: application/json donuyor ( bu demek ki sana verecegim cevap payload icinde JSON olacak ) ve sen de response icinden okuyorsun datayi.

Parse edecegin kisim burasi.

Aslinda JSON verisini bir linkten almiyorsun teknik olarak, server senin attigin GET request'e verdigi response icine gomuyor JSON ' i. Chrome sayesinde o linkten aliyormus gibi gorunuyorsunuz.

---

Token kismi da senin dedigin gibi backend de uretilecek, veritabaninda kaydedilecek. Sizin uygulamanizin modeline gore her kullanici icin farkli farkli da olabilir, kullanici gruplari icin farkli farkli da olabilir.

Token uretme kismi derya deniz. Ama yazdiginiz bir seyler varsa benimle paylas buradan yardimci olayim. Cok basite de indirgeyebilirsiniz. Mesela hic guvenli degil ama sistem zamanini token kabul edip de ilerleyebilirsiniz baslangicta.

Ayrica browser'lar GET atarlar url kismina yazilan requestlere, bu ornekler hep GET uzerinden yurudugu icin sorun yok. Ama diger request method lar icin farkli uygulamalar kullanmaniz gerek test icin.

Backendi hangi dille yaziyorsunuz? PHP mi?
 
Ama yazdiginiz bir seyler varsa benimle paylas buradan yardimci olayim. Cok basite de indirgeyebilirsiniz. Mesela hic guvenli degil ama sistem zamanini token kabul edip de ilerleyebilirsiniz baslangicta.
Henüz tasarımları ve menü geçişleri gibi şeyleri yapıyorum.
Backendi hangi dille yaziyorsunuz? PHP mi?
Web Service kısmını, PHP framework'ü Laravel ile arkadaşım yazıyor. Laravel ile REST API örnekleri internetten bakıyormuş ancak hiçbir şey anlamadığını söylüyor. Onun da REST API ile ilgili bilgisi yokmuş.
 
Son düzenleme:
Web Service kısmını PHP framework'ü Laravel ile arkadaşım yazıyor. Laravel ile REST API örnekleri internetten bakıyormuş ancak hiçbir şey anlamadığını söylüyor. Onun da REST API ile ilgili bilgisi yokmuş.

O zaman hic token moken, database vs kafanizi karistirmadan en basit sekilde hello world rest api yazin. Client + server baglantisini kurun, onun hello world JSON ini sen mobil cihazda parse edecek seviyeye geldikten sonra kucuk kucuk karmasiklastirirsiniz. Boyle kaybolursunuz bu isin icinde.

JSON parse icin ben FasterXML/jackson oneririm Java icin, en iyisi bu.

Eger Web sitesi ayagi yoksa, yalnizca backend API olarak kalacaksa bence PHP ile kastirmanin da anlami yok. node.js ya da Java daha pratik. Nasil olsa o da bilmiyormus PHP ile yapmayi, daha modern bir seyler ogrenmis olur.

Bir de ilk mesajinda sordugun soruya cevap vereyim:

Ornegin REST olmayan klasik bir backend icin soyle bir request gonderirsin:


RESTFUL yapacaksan bunu, klasik yontem ile ugrasmazsin request suna doner:


Ustteki link her zaman 1 numarali User bilgisini return eder. Klasik de ayni sekilde ama request parametresinden kurtarirsin isi, RESTFUL bunu gerektirdigi icin. Eski sistemin hantalligini egale etmis olursun boylece. Ama bu detaylar arasinda bogulmadan bence cok cok basitten baslayin.

Ayrica API herkese acik olacak mobil proje icin, sadece Android uygulamamizdan gelen isteklere cevap donelim diye bir sey yapamazsiniz, onun teknik olarak kesin bir yolu yok. Ona gore dizayn edin.

Odev mi bu yoksa side-project olarak mi yapiyorsunuz?
 
Odev mi bu yoksa side-project olarak mi yapiyorsunuz?
Bitirme projesi. Bilgisayar programcılığı okuyorum, yazılım mühendisliğine geçeceğim. Onun yaptıkları onun projesi (web), benim yaptıklarım benim projem (mobil). Ama aynı marka üzerinde çalışıp birbirine bağlamak istiyoruz. Kendimizi geliştirmek ve bir şeyler üretebilmek için uğraşıyoruz. Proje konuları arasında "Cisco Packet Tracer ile Ağ Simulasyonu" gibi konular da vardı fakat biz kolaya kaçmak istemedik. Sıfırdan oturup kod yazmayacak olsak da kopyala yapıştırla bile olsa bir şeyler öğrenme çabasındayız. Android'i okulda öğretmediler bu arada internetten öğreniyorum.
JSON parse icin ben FasterXML/jackson oneririm Java icin, en iyisi bu.
JSON Parse için Android tarafında Retrofit kütüphanesi çok kullanılıyormuş araştırdığım kadarıyla. Size attığım videoda da Retrofit ile yapıyor yapan kişi. Bunun yerine o videodakileri uygulasam bir şey kaybeder miyim?
Ayrica API herkese acik olacak mobil proje icin, sadece Android uygulamamizdan gelen isteklere cevap donelim diye bir sey yapamazsiniz, onun teknik olarak kesin bir yolu yok. Ona gore dizayn edin.
Burada dizayn derken tam olarak neyi kastettiniz? Açık olacaktan kastınız nedir? Herkes istediği bilgiye ulaşabilecek mi ulaşmaması gereken bile olsa? Yoksa token kullanmadığımız için mi açık olacak demek istediniz?

Bu arada arkadaşım bazı veritabanı işlemlerini yapmış. Login-register işlemini yapabiliyoruz.
 
JSON Parse için Android tarafında Retrofit kütüphanesi çok kullanılıyormuş araştırdığım kadarıyla. Size attığım videoda da Retrofit ile yapıyor yapan kişi. Bunun yerine o videodakileri uygulasam bir şey kaybeder miyim?

Hic bir sey kaybetmezsin, uc asagi bes yukari hepsi ayni isi yapiyor. Hangisinden basladiysan oyle devam etmelisin.

Burada dizayn derken tam olarak neyi kastettiniz? Açık olacaktan kastınız nedir? Herkes istediği bilgiye ulaşabilecek mi ulaşmaması gereken bile olsa? Yoksa token kullanmadığımız için mi açık olacak demek istediniz?

Yani soyle, siz backend tarafinda gelen isteklerin bir mobil cihaz tarafindan gonderilip gonderilmedigine kesin emin olamayacaksiniz demek istedim. O sebeple bir token mekanizmasi sart guvenlik onlemi olarak. Ama daha once dedigim gibi o noktaya gelene kadar once bir hello world kismini atlatin bana kalirsa.

Android'i okulda öğretmediler bu arada internetten öğreniyorum.

Bir suru seyi okulda ogretmezler. Temeli verirler gerisi sana bakar. Normal. Bir de Android bugun var yarin yok. Okul egitimi seninle hayat boyu devam edecek seylerden olusmali, kisa omurlu bir isletim sistemi uzerine programlama ogreterek meslek ogretilmez, dogru yapiyorlar. Android gider Fuscia gelir, o gider baskasi gelir. Ben okuldayken BlackBerry'den bir suru insan geliyordu bize egitim icin, isletim sistemlerine uygulama gelistirelim istiyorlardi. Simdi BB kullanan 3 kisi vardir Anadolu Yakasinda.
 

Technopat Haberler

Yeni konular

Geri
Yukarı