committed by
GitHub
1 changed files with 213 additions and 0 deletions
@ -0,0 +1,213 @@ |
|||
# İstek Gövdesi |
|||
|
|||
API'a, bir istemciden (mesela tarayıcıdan) veri göndermek istenilen durumlarda veri, **istek gövdesi** olarak gönderilir. |
|||
|
|||
**İstek** gövdesi API'a istemci tarafından gönderilen veriyi temsil eder. **Yanıt** gövdesi ise API'ın istemciye ilettiği veriden meydana gelir. |
|||
|
|||
API'lar genellikle her zaman bir **yanıt** gövdesi iletmek zorundadır. Fakat, istemcilerin **istek** gövdesi gönderme gibi bir zorunluluğu yoktur. |
|||
|
|||
Bütün güç ve avantajlarından faydalınılarak <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a> modelleri, **istek** gövdeleri oluşturmak için kullanılır. |
|||
|
|||
!!! info "Bilgi" |
|||
Veri göndermek için `POST` (en yaygın), `PUT`, `DELETE` veya `PATCH` kullanılır. |
|||
|
|||
Bir gövde göndermek için `GET` isteği kullanılmasının, spesifikasyonlar üzerinde beklenmedik etkilere sahip olmasına rağmen, bu olay, özellikle fazlasıyla karmaşık veya olağandışı durumlar için FastAPI tarafından desteklenir. |
|||
|
|||
Bahsedilen durumun uygulanması tavsiye edilmediğinden dolayı `GET` isteği kullanılırken Swagger UI destekli interaktif doküman, gövde için ek alan göstermeyecektir. Ayrıca aradaki proxyler de bunu desteklemeyebilir. |
|||
|
|||
## Pydantic'in `BaseModel`'ini Projeye Dahil Edelim |
|||
|
|||
Öncelikle, `BaseModel` sınıfını `pydantic` paketinden projemize dahil edelim: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="2" |
|||
{!> ../../../docs_src/body/tutorial001_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="4" |
|||
{!> ../../../docs_src/body/tutorial001.py!} |
|||
``` |
|||
|
|||
## Veri Modelimizi Oluşturalım |
|||
|
|||
Sonra, `BaseModel` sınıfını miras alacak bir veri modeli sınıfı tanımlayalım. |
|||
|
|||
Özellikler için standart Python tipleri kullanmayı ihmal etmeyelim: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="5-9" |
|||
{!> ../../../docs_src/body/tutorial001_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="7-11" |
|||
{!> ../../../docs_src/body/tutorial001.py!} |
|||
``` |
|||
|
|||
Sorgu parametrelerinde olduğu gibi, bir model özelliği, varsayılan değere sahipse o özellik zorunlu değildir, eğer sahip değilse zorunludur. Özellikler, `None` kullanılarak isteğe bağlı hale getirilebilirler. |
|||
|
|||
Örneğin üstteki model, alttaki gibi bir JSON "`object`"'i (diğer bir adla Python `dict`'i) tanımlar: |
|||
|
|||
```JSON |
|||
{ |
|||
"name": "Foo", |
|||
"description": "An optional description", |
|||
"price": 45.2, |
|||
"tax": 3.5 |
|||
} |
|||
``` |
|||
|
|||
...`description` ve `tax` alanları (`None` varsayılan değeri sayesinde) isteğe bağlı olduklarından dolayı alttaki JSON "`object`"'i de geçerli sayılabilirdi: |
|||
|
|||
```JSON |
|||
{ |
|||
"name": "Foo", |
|||
"price": 45.2 |
|||
} |
|||
``` |
|||
|
|||
## Parametre Olarak Tanımlayalım |
|||
|
|||
Gövdeyi, bir *yol operasyonu* olarak eklemek için yol ve sorgu parametrelerinde yaptığımız gibi tanımlayabiliriz: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="16" |
|||
{!> ../../../docs_src/body/tutorial001_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="18" |
|||
{!> ../../../docs_src/body/tutorial001.py!} |
|||
``` |
|||
|
|||
...sonrasında yarattığımız `Item` modelini gövde tipi olarak tanımlayalım. |
|||
|
|||
## Sonuçlar |
|||
|
|||
Yalnızca bu Python tip tanımlaması ile **FastAPI**: |
|||
|
|||
* İstek gövdesini JSON olarak yorumlar. |
|||
* Karşılık gelen tipleri (eğer gerekiyorsa) dönüştürür. |
|||
* Veriyi doğrular. |
|||
* Veri geçersiz ise hatalı verinin ne ve nerede olduğunu belirten güzel ve anlaşılır bir hata döndürür. |
|||
* `item` parametresi içerisine alınan veriyi aktarır. |
|||
* Gövdeyi, fonksiyon içerisinde `Item` tipli olarak tanımladığımızdan ötürü her özellik ve özellik tipi için tüm editör desteğine de (kod tamamlama, vb.) sahip olmuş oluruz. |
|||
* Modelimiz için <a href="https://json-schema.org" class="external-link" target="_blank">JSON şema</a> tanımları oluşturur ve ek olarak bu tanımları projemizde herhangi bir yerde kullanabilmemize olanak sağlar. |
|||
* Bu şemalar, meydana gelen OpenAPI şemasının bir parçası olur ve otomatik dokümantasyon <abbr title="User Interface">UI'ları</abbr> tarafından da kullanılır. |
|||
|
|||
## Otomatik Dokümantasyon |
|||
|
|||
Modellerimizin JSON şemaları, interaktif API dokümanında gösterilmek üzere OpenAPI tarafından oluşturulan şemanın bir parçası olur: |
|||
|
|||
<img src="/img/tutorial/body/image01.png"> |
|||
|
|||
Ve ayrıca bu şemalar, onlara ihtiyaç duyan her *yol operasyonu* içindeki API dokümanında kullanılır: |
|||
|
|||
<img src="/img/tutorial/body/image02.png"> |
|||
|
|||
## Editör Desteği |
|||
|
|||
Editörünüz ve fonksiyonunuz içerisindeki her alanda tip ipuçları ve kod tamamlama desteği alırsınız (bu destek, Pydantic modeli yerine `dict` alsaydınız gerçekleşmezdi).: |
|||
|
|||
<img src="/img/tutorial/body/image03.png"> |
|||
|
|||
Yanlış tip operasyonları için de ayrıca hata uyarıları alırsınız: |
|||
|
|||
<img src="/img/tutorial/body/image04.png"> |
|||
|
|||
Bu durum, şansın aksine tüm framework bu tasarım üstüne kurulu olduğundan dolayı meydana gelmektedir. |
|||
|
|||
Ve ayrıca, tüm editörlerle çalışıyor olmasından emin olmak adına bu durum, herhangi bir devreye alımdan önce tasarım aşamasında en ince ayrıntısına kadar test edilmiştir. |
|||
|
|||
Hatta, bu durumu desteklemesi amacıyla, Pydantic kütüphanesinin kendi içerisinde bile bazı değişiklikler yapılmıştır. |
|||
|
|||
En son ekran görüntüleri, <a href="https://code.visualstudio.com" class="external-link" target="_blank">Visual Studio Code</a>'da çekilmiştir. |
|||
|
|||
Halbuki, aynı editör desteğini, <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> veya çoğu diğer Python editörleri ile de elde edebilirsiniz: |
|||
|
|||
<img src="/img/tutorial/body/image05.png"> |
|||
|
|||
!!! tip "İpucu" |
|||
Eğer, editörünüz olarak <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> uygulamasını kullanıyorsanız <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a> eklentisinden de faydalanabilirsiniz. |
|||
|
|||
Bu eklenti, aşağıdaki özellikler ile birlikte Pydantic modelleri için editör desteğini güçlendirir: |
|||
|
|||
* oto-tamamlama |
|||
* tip uyarıları |
|||
* düzenleme |
|||
* arama |
|||
* inceleme |
|||
|
|||
## Modeli Kullanalım |
|||
|
|||
Fonksiyon içerisinde direkt olarak modelin tüm özelliklerine erişebilirsiniz: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="19" |
|||
{!> ../../../docs_src/body/tutorial002_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="21" |
|||
{!> ../../../docs_src/body/tutorial002.py!} |
|||
``` |
|||
|
|||
## İstek Gövdesi + Yol Parametreleri |
|||
|
|||
Yol parametrelerini ve istek gövdesini aynı anda tanımlayabilirsiniz. |
|||
|
|||
**FastAPI**, yol parametreleri ile eşleşen fonksiyon parametrelerinin **yol kısmından elde edileceklerinin** ve Pydantic modelleri olarak tanımlanan fonksiyon parametrelerinin **istek gövdesinden elde edileceklerinin** bilincindedir. |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="15-16" |
|||
{!> ../../../docs_src/body/tutorial003_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="17-18" |
|||
{!> ../../../docs_src/body/tutorial003.py!} |
|||
``` |
|||
|
|||
## İstek Gövdesi + Yol ve Sorgu Parametreleri |
|||
|
|||
Ayrıca, **gövde**, **yol** ve **sorgu** parametrelerinin hepsini aynı anda tanımlayabilirsiniz. |
|||
|
|||
**FastAPI** her birini ayırt edecek ve veriyi doğru yerden elde edecektir. |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="16" |
|||
{!> ../../../docs_src/body/tutorial004_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
|
|||
```Python hl_lines="18" |
|||
{!> ../../../docs_src/body/tutorial004.py!} |
|||
``` |
|||
|
|||
Fonksiyon parametreleri şu şekilde ayırt edilecektir: |
|||
|
|||
* Eğer parametre, **yol** kısmında da tanımlıysa yol parametresi olarak değerlendirilecektir. |
|||
* Eğer parametre, **tekil tipten** (`int`, `float`, `str`, `bool`, vb. gibi) ise **sorgu** parametresi olarak yorumlanacaktır. |
|||
* Eğer parametre, bir **Pydantic modeli** ise istek **gövdesi** olarak yorumlanacaktır. |
|||
|
|||
!!! note "Not" |
|||
FastAPI, `q` değerinin zorunlu olmadığını `= None` varsayılan değerini aldığı için fark edecektir. |
|||
|
|||
`Union[str, None]` kısmındaki `Union` anahtar kelimesi FastAPI tarafından kullanılmamasına rağmen kullandığınız editörün size daha iyi destek vermesini ve hataları belirlemesini sağlayacaktır. |
|||
|
|||
## Pydantic Olmadan |
|||
|
|||
Eğer Pydantic modellerini kullanmak istemiyorsanız **Body** parametresinden faydalanabilirsiniz. Ayrıntılı bilgi için [Body - Çoklu Parametreler: Gövde içinde tekil değerler](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank} sayfasını ziyaret edebilirsiniz. |
Loading…
Reference in new issue