Documentation

You are viewing the documentation for the 2.3.x release series. The latest stable release series is 2.4.x.

§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:

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.