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