§HTTP yönlendirme
§Yerleşik HTTP router
Router gelen her HTTP isteğini bir Action’a dönüştüren bileşendir.
Bir HTTP isteği MVC çatısı tarafından bir olay olarak görülür. Bu olay iki önemli bilgi parçası içerir:
- query string de dahil olmak üzere istek yolu (örneğin
/clients/1542
,/photos/list
) - HTTP metodu (GET, POST, vb.)
Yönlendirmeler conf/routes
dosyasında tanımlanmıştır. Bu dosya da derlenen bir dosyadır. Bu nedenle yönlendirme hatalarını doğrudan tarayıcınızda görürsünüz:
§routes dosyası sözdizimi
conf/routes
router tarafından kullanılan ayar dosyasıdır. Bu dosya uygulama tarafından ihtiyaç duyulan bütün yönlendirmeleri listeler. Her yönlendirme bir HTTP metodu ve URI deseninden oluşur ve bir Action
üretici ile ilişkilidir.
Bir yönlendirme tanımının neye benzediğine bir bakalım:
GET /clients/:id controllers.Clients.show(id: Long)
Her yönlendirme bir HTTP metodu ile başlar ve URI deseni ile devam eder. Son eleman ise action çağrısı tanımıdır.
routes dosyasına #
karakteri ile yorum satırları ekleyebilirsiniz.
# Display a client.
GET /clients/:id controllers.Clients.show(id: Long)
§HTTP metodu
HTTP metodu HTTP tarafından desteklenen metodlardan herhangi biri olabilir (GET
, POST
, PUT
, DELETE
, HEAD
).
§URI deseni
URI deseni yönlendirmenin istek yolunu tanımlar. İstek yolunun belli kısımları değişken olabilir.
§Sabit yol
Örneğin gelen GET /clients/all
isteğini yakalamak için aşağıdaki yönlendirmeyi tanımlayabilirsiniz:
GET /clients/all controllers.Clients.list()
§Değişken kısımlar
Eğer bir kaynağı ID ile getiren bir yönlendirme tanımlamak isterseniz değişken bir kısım eklemeniz gerekir:
GET /clients/:id controllers.Clients.show(id: Long)
URI deseninin birden fazla değişken kısmı olabileceğini unutmayın.
Bir değişken kısım için varsayılan kısım eşleme stratejisi şu düzenli ifade ile tanımlanır: [^/]+
. Bu, :id
şeklinde tanımlanan bir değişken kısmın yalnız bir URI kısmına eşleneceği anlamına gelir.
§Birden fazla / içeren değişken kısımlar
Eğer bir değişken kısmın /
ile ayrılan birden fazla URI yol kısmını yakalamasını isterseniz, .+
düzenli ifadesini kullanan *id
sözdizimini kullanarak bir değişken kısım tanımlayabilirsiniz:
GET /files/*name controllers.Application.download(name)
Burada GET /files/images/logo.png
gibi bir istek için değişken kısım images/logo.png
değerini yakalayacaktır.
§Özel düzenli ifadeler ile değişken kısımlar
Değişken kısım için $id<regex>
sözdizimini kullanarak kendi düzenli ifadenizi de tanımlayabilirsiniz:
GET /items/$id<[0-9]+> controllers.Items.show(id: Long)
§Action üretici metodu çağırma
Yönlendirme tanımının son kısmı çağrı kısmıdır. Bu kısım bir play.api.mvc.Action
değeri döndüren bir metoda geçerli bir çağrı tanımlamalıdır. Bu tanım doğal olarak bir controller action metodu olacaktır.
Eğer metot hiçbir parametre tanımlamıyorsa yalnızca tam metot adını vermeniz yeterlidir:
GET / controllers.Application.homePage()
Eğer action metodu bazı parametreler tanımlıyorsa tüm bu parametreler istek URI içerisinde aranacak ve doğrudan URI yolundan ya da query string’inden elde edilecektir.
# Extract the page parameter from the path.
GET /:page controllers.Application.show(page)
Ya da:
# Extract the page parameter from the query string.
GET / controllers.Application.show(page)
Aşağıda buna karşılık gelen controllers.Application
controller’ındaki show
metot tanımı bulunuyor.
def show(page: String) = Action {
loadContentFromDatabase(page).map { htmlContent =>
Ok(htmlContent).as("text/html")
}.getOrElse(NotFound)
}
§Parametre türleri
String
türündeki parametreler için parametre türünü yazmaya gerek yoktur. Eğer Play’in gelen parametreyi belirli bir Scala türüne dönüştürmesini istiyorsanız bir tür belirtebilirsiniz:
GET /clients/:id controllers.Clients.show(id: Long)
Ve aynısını karşılık gelen controllers.Clients
controller’ındaki show
metodu için de yapmalısınız:
def show(id: Long) = Action {
Client.findById(id).map { client =>
Ok(views.html.Clients.display(client))
}.getOrElse(NotFound)
}
§Sabit değerli parametreler
Bazen bir parametre için sabit bir değer belirtmek isteyebilirsiniz:
# Extract the page parameter from the path, or fix the value for /
GET / controllers.Application.show(page = "home")
GET /:page controllers.Application.show(page)
§Varsayılan değerli parametreler
Ayrıca gelen istekte bir değer bulunamadığında kullanılacak varsayılan bir değer belirtebilirsiniz:
# Pagination links, like /clients?page=3
GET /clients controllers.Clients.list(page: Int ?= 1)
§Seçimli parametreler
Tüm isteklerde bulunması zorunlu olmayan seçimli bir parametre de tanımlayabilirsiniz:
# The version parameter is optional. E.g. /api/list-all?version=3.0
GET /api/list-all controllers.Api.list(version: Option[String])
§Yönlendirme önceliği
Farklı yönledirmeler aynı istekle eşleşebilir. Eğer bir çakışma varsa ilk yönlendirme (tanım sırasına göre) kullanılır.
§Tersine yönlendirme
Router ayrıca bir Scala çağrısından bir URL oluşturmak için de kullanılabilir. Bu yöntem tüm URI desenlerinizin ortak bir ayar dosyasında bulunmasını sağlar. Böylece uygulamanızı daha güvenle yeniden düzenleyebilirsiniz.
routes dosyasında belirtilen her bir controller için router routes
paketinde bir ‘reverse controller’ oluşturur. Bu controller da aynı imza ile aynı action metotlarına sahiptir. Fakat bu action metotlar play.api.mvc.Action
yerine play.api.mvc.Call
döndürürler.
play.api.mvc.Call
bir HTTP çağrısı tanımlayarak bir HTTP metodu ile bir URI belirtir.
Örneğin aşağıdaki gibi bir controller oluşturursanız:
package controllers
import play.api._
import play.api.mvc._
object Application extends Controller {
def hello(name: String) = Action {
Ok("Hello " + name + "!")
}
}
Ve conf/routes
dosyasında şöyle eşlerseniz:
# Hello action
GET /hello/:name controllers.Application.hello(name)
hello
action metoduna giden URL’i controllers.routes.Application
reverse controller’ı kullanarak elde edebilirsiniz:
// Redirect to /hello/Bob
def helloBob = Action {
Redirect(routes.Application.hello("Bob"))
}
Sonraki: Yanıtları işlemek
Dokümantasyonun bu çevirisi Play ekibi tarafından yapılmamaktadır. Eğer bir hata bulduysanız, bu sayfanın kaynak kodu burada bulunmaktadır. Dokümantasyon yönergelerini okuduktan sonra lütfen katkı yapmaktan çekinmeyin.