# Yol Parametreleri { #path-parameters }
Python string biçimlemede kullanılan sözdizimiyle path "parametreleri"ni veya "değişkenleri"ni tanımlayabilirsiniz:
{* ../../docs_src/path_params/tutorial001_py310.py hl[6:7] *}
Path parametresi `item_id`'nin değeri, fonksiyonunuza `item_id` argümanı olarak aktarılacaktır.
Yani, bu örneği çalıştırıp [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo) adresine giderseniz, şöyle bir response görürsünüz:
```JSON
{"item_id":"foo"}
```
## Tip İçeren Yol Parametreleri { #path-parameters-with-types }
Standart Python tip belirteçlerini kullanarak path parametresinin tipini fonksiyonun içinde tanımlayabilirsiniz:
{* ../../docs_src/path_params/tutorial002_py310.py hl[7] *}
Bu durumda, `item_id` bir `int` olarak tanımlanır.
/// tip | İpucu
Bu sayede, fonksiyon içinde hata denetimi, kod tamamlama vb. konularda editör desteğine kavuşursunuz.
///
## Veri dönüştürme { #data-conversion }
Bu örneği çalıştırıp tarayıcınızda [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3) adresini açarsanız, şöyle bir response görürsünüz:
```JSON
{"item_id":3}
```
/// tip | İpucu
Dikkat edin: fonksiyonunuzun aldığı (ve döndürdüğü) değer olan `3`, string `"3"` değil, bir Python `int`'idir.
Yani, bu tip tanımıyla birlikte **FastAPI** size otomatik request "ayrıştırma" sağlar.
///
## Veri Doğrulama { #data-validation }
Ancak tarayıcınızda [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo) adresine giderseniz, şuna benzer güzel bir HTTP hatası görürsünüz:
```JSON
{
"detail": [
{
"type": "int_parsing",
"loc": [
"path",
"item_id"
],
"msg": "Input should be a valid integer, unable to parse string as an integer",
"input": "foo"
}
]
}
```
çünkü path parametresi `item_id`, `int` olmayan `"foo"` değerine sahipti.
Aynı hata, şu örnekte olduğu gibi `int` yerine `float` verirseniz de ortaya çıkar: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
/// tip | İpucu
Yani, aynı Python tip tanımıyla birlikte **FastAPI** size veri doğrulama sağlar.
Dikkat edin: hata ayrıca doğrulamanın geçmediği noktayı da açıkça belirtir.
Bu, API'ınızla etkileşime giren kodu geliştirirken ve debug ederken inanılmaz derecede faydalıdır.
///
## Dokümantasyon { #documentation }
Tarayıcınızı [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) adresinde açtığınızda, aşağıdaki gibi otomatik ve interaktif bir API dokümantasyonu görürsünüz:
/// tip | İpucu
Yine, sadece aynı Python tip tanımıyla **FastAPI** size otomatik ve interaktif dokümantasyon (Swagger UI entegrasyonuyla) sağlar.
Dikkat edin: path parametresi integer olarak tanımlanmıştır.
///
## Standartlara Dayalı Avantajlar, Alternatif Dokümantasyon { #standards-based-benefits-alternative-documentation }
Üretilen şema [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md) standardından geldiği için birçok uyumlu araç vardır.
Bu nedenle **FastAPI**'ın kendisi, [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) adresinden erişebileceğiniz alternatif bir API dokümantasyonu (ReDoc kullanarak) sağlar:
Aynı şekilde, birçok uyumlu araç vardır. Birçok dil için kod üretme araçları da buna dahildir.
## Pydantic { #pydantic }
Tüm veri doğrulamaları, arka planda [Pydantic](https://docs.pydantic.dev/) tarafından gerçekleştirilir; böylece onun tüm avantajlarından faydalanırsınız. Ve emin ellerde olduğunuzu bilirsiniz.
Aynı tip tanımlarını `str`, `float`, `bool` ve daha birçok karmaşık veri tipiyle kullanabilirsiniz.
Bunların birkaçı, eğitimin sonraki bölümlerinde ele alınacaktır.
## Sıralama Önemlidir { #order-matters }
*Path operation*'lar oluştururken sabit bir path'e sahip olduğunuz durumlarla karşılaşabilirsiniz.
Örneğin `/users/me`'nin, geçerli kullanıcı hakkında veri almak için kullanıldığını varsayalım.
Sonra belirli bir kullanıcı hakkında, kullanıcı ID'si ile veri almak için `/users/{user_id}` şeklinde bir path'iniz de olabilir.
*Path operation*'lar sırayla değerlendirildiği için, `/users/me` için olan path'in `/users/{user_id}` olandan önce tanımlandığından emin olmanız gerekir:
{* ../../docs_src/path_params/tutorial003_py310.py hl[6,11] *}
Aksi halde, `/users/{user_id}` için olan path, `"me"` değerini `user_id` parametresi olarak aldığını "düşünerek" `/users/me` için de eşleşir.
Benzer şekilde, bir path operation'ı yeniden tanımlayamazsınız:
{* ../../docs_src/path_params/tutorial003b_py310.py hl[6,11] *}
Path önce eşleştiği için her zaman ilk olan kullanılır.
## Ön Tanımlı Değerler { #predefined-values }
Bir *path operation*'ınız *path parameter* alıyorsa ama olası geçerli *path parameter* değerlerinin önceden tanımlı olmasını istiyorsanız, standart bir Python `Enum` kullanabilirsiniz.
### Bir `Enum` Sınıfı Oluşturalım { #create-an-enum-class }
`Enum`'u import edin ve `str` ile `Enum`'dan miras alan bir alt sınıf oluşturun.
`str`'den miras aldığınızda API dokümanları değerlerin `string` tipinde olması gerektiğini anlayabilir ve doğru şekilde render edebilir.
Sonra, kullanılabilir geçerli değerler olacak sabit değerli class attribute'ları oluşturun:
{* ../../docs_src/path_params/tutorial005_py310.py hl[1,6:9] *}
/// tip | İpucu
Merak ediyorsanız: "AlexNet", "ResNet" ve "LeNet", Makine Öğrenmesi modellerinin sadece isimleridir.
///
### Bir *Path Parameter* Tanımlayalım { #declare-a-path-parameter }
Ardından oluşturduğunuz enum sınıfını (`ModelName`) kullanarak tip belirteciyle bir *path parameter* oluşturun:
{* ../../docs_src/path_params/tutorial005_py310.py hl[16] *}
### Dokümana Göz Atalım { #check-the-docs }
*Path parameter* için kullanılabilir değerler ön tanımlı olduğu için, interaktif dokümanlar bunları güzelce gösterebilir:
### Python *Enumeration*'ları ile Çalışmak { #working-with-python-enumerations }
*Path parameter*'ın değeri bir *enumeration member* olacaktır.
#### *Enumeration Member*'ları Karşılaştıralım { #compare-enumeration-members }
Bunu, oluşturduğunuz enum `ModelName` içindeki *enumeration member* ile karşılaştırabilirsiniz:
{* ../../docs_src/path_params/tutorial005_py310.py hl[17] *}
#### *Enumeration Value*'yu Alalım { #get-the-enumeration-value }
Gerçek değeri (bu durumda bir `str`) `model_name.value` ile veya genel olarak `your_enum_member.value` ile alabilirsiniz:
{* ../../docs_src/path_params/tutorial005_py310.py hl[20] *}
/// tip | İpucu
`"lenet"` değerine `ModelName.lenet.value` ile de erişebilirsiniz.
///
#### *Enumeration Member*'ları Döndürelim { #return-enumeration-members }
*Path operation*'ınızdan, bir JSON body'nin içine gömülü olsalar bile (ör. bir `dict`) *enum member*'ları döndürebilirsiniz.
İstemciye dönmeden önce, karşılık gelen değerlerine (bu durumda string) dönüştürülürler:
{* ../../docs_src/path_params/tutorial005_py310.py hl[18,21,23] *}
İstemcinizde şöyle bir JSON response alırsınız:
```JSON
{
"model_name": "alexnet",
"message": "Deep Learning FTW!"
}
```
## Path İçeren Path Parametreleri { #path-parameters-containing-paths }
Diyelim ki `/files/{file_path}` path'ine sahip bir *path operation*'ınız var.
Ama `file_path`'in kendisinin `home/johndoe/myfile.txt` gibi bir *path* içermesi gerekiyor.
Böylece, o dosyanın URL'si şu şekilde olur: `/files/home/johndoe/myfile.txt`.
### OpenAPI Desteği { #openapi-support }
OpenAPI, içinde bir *path* barındıracak bir *path parameter* tanımlamak için bir yöntem desteklemez; çünkü bu, test etmesi ve tanımlaması zor senaryolara yol açabilir.
Yine de, Starlette'in dahili araçlarından birini kullanarak bunu **FastAPI**'da yapabilirsiniz.
Ve dokümanlar, parametrenin bir path içermesi gerektiğini söyleyen herhangi bir dokümantasyon eklemese bile çalışmaya devam eder.
### Path Dönüştürücü { #path-convertor }
Starlette'ten doğrudan gelen bir seçenekle, *path* içeren bir *path parameter*'ı şu URL ile tanımlayabilirsiniz:
```
/files/{file_path:path}
```
Bu durumda parametrenin adı `file_path`'tir ve son kısım olan `:path`, parametrenin herhangi bir *path* ile eşleşmesi gerektiğini söyler.
Yani şununla kullanabilirsiniz:
{* ../../docs_src/path_params/tutorial004_py310.py hl[6] *}
/// tip | İpucu
Parametrenin başında `/home/johndoe/myfile.txt` örneğinde olduğu gibi bir eğik çizgi (`/`) ile başlaması gerekebilir.
Bu durumda URL, `files` ile `home` arasında çift eğik çizgi (`//`) olacak şekilde `/files//home/johndoe/myfile.txt` olur.
///
## Özet { #recap }
**FastAPI** ile kısa, sezgisel ve standart Python tip tanımlarını kullanarak şunları elde edersiniz:
* Editör desteği: hata denetimleri, otomatik tamamlama vb.
* Veri "ayrıştırma"
* Veri doğrulama
* API annotation ve otomatik dokümantasyon
Ve bunları sadece bir kez tanımlamanız yeterlidir.
Bu, (ham performans dışında) **FastAPI**'ın alternatif framework'lere kıyasla muhtemelen en görünür ana avantajıdır.