Browse Source

🌐 Add Indonesian translation for `docs/id/docs/tutorial/path-params.md` (#13086)

pull/13107/head
Gerry Sabar 3 months ago
committed by GitHub
parent
commit
d529449241
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 258
      docs/id/docs/tutorial/path-params.md

258
docs/id/docs/tutorial/path-params.md

@ -0,0 +1,258 @@
# Parameter Path
"parameter" atau "variabel" path didefinisikan dengan sintaksis Python format string:
{* ../../docs_src/path_params/tutorial001.py hl[6:7] *}
Nilai parameter path `item_id` akan dikirim ke fungsi sebagai argument `item_id`:
Jika anda menjalankan contoh berikut dan kunjungi <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>, anda akan melihat respon:
```JSON
{"item_id":"foo"}
```
## Parameter path dengan tipe data
Tipe data parameter path bisa didefinisikan di dalam fungsi, menggunakan anotasi tipe data standar Python:
{* ../../docs_src/path_params/tutorial002.py hl[7] *}
Dalam hal ini `item_id` didefinisikan sebagai `int`.
/// check | Periksa
Penyunting kode anda bisa membantu periksa di dalam fungsi seperti pemeriksaan kesalahan, kelengkapan kode, dll.
///
## <abbr title="juga disebut: serialization, parsing, marshalling">Konversi</abbr> data
Jika contoh berikut dijalankan dan diakses browser melalui <a href="http://127.0.0.1:8000/items/3" class="external-link" target="_blank">http://127.0.0.1:8000/items/3</a>, anda akan melihat respon:
```JSON
{"item_id":3}
```
/// check | Periksa
Perhatikan nilai fungsi yang diterima (dan dihasilkan) adalah `3`, sebagai `int` di Python, dan bukan string `"3"`.
Sehingga dengan deklarasi tipe data **FastAPI** memberikan request otomatis <abbr title="konversi string dari request HTTP menjadi data Python">"parsing"</abbr>.
///
## Validasi Data
Tetapi jika di browser anda akses <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>, anda akan melihat pesan kesalahan HTTP:
```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",
"url": "https://errors.pydantic.dev/2.1/v/int_parsing"
}
]
}
```
Karena parameter path `item_id` bernilai `"foo"` yang bukan tipe data `int`.
Kesalahan yang sama akan muncul jika menggunakan `float` daripada `int`, seperti di: <a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a>
/// check | Periksa
Dengan deklarasi tipe data Python, **FastAPI** melakukan validasi data.
Perhatikan kesalahan tersebut juga menjelaskan validasi apa yang tidak sesuai.
Validasi ini sangat membantu ketika mengembangkan dan men-*debug* kode yang berhubungan dengan API anda.
///
## Dokumentasi
Ketika anda membuka browser di <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>, anda melihat dokumentasi API interaktif otomatis berikut:
<img src="/img/tutorial/path-params/image01.png">
/// check | Periksa
Dengan deklarasi tipe data Python yang sama, **FastAPI** membuat dokumentasi interaktif otomatis (terintegrasi Swagger UI).
Perhatikan parameter path dideklarasikan sebagai integer.
///
## Keuntungan basis-standar, dokumentasi alternatif
Karena skema yang dibuat berasal dari standar <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md" class="external-link" target="_blank">OpenAPI</a>, maka banyak alat lain yang kompatibel.
Sehingga **FastAPI** menyediakan dokumentasi alternatif (menggunakan ReDoc), yang bisa diakses di <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>:
<img src="/img/tutorial/path-params/image02.png">
Cara yang sama untuk menggunakan tools kompatibel lainnya. Termasuk alat membuat kode otomatis untuk banyak bahasa.
## Pydantic
Semua validasi data dikerjakan di belakang layar oleh <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>, sehingga anda mendapatkan banyak kemudahan. Anda juga tahu proses ini akan ditangani dengan baik.
Anda bisa mendeklarasikan tipe data dengan `str`, `float`, `bool` dan banyak tipe data kompleks lainnya.
Beberapa tipe di atas akan dibahas pada bab berikutnya tutorial ini.
## Urutan berpengaruh
Ketika membuat *operasi path*, anda bisa menghadapi kondisi dimana *path* nya sudah tetap.
Seperti `/users/me`, untuk mendapatkan data user yang sedang aktif.
Kemudian anda bisa memiliki path `/users/{user_id}` untuk mendapatkan data user tertentu melalui user ID.
karena *operasi path* dievaluasi melalui urutan, anda harus memastikan path untuk `/users/me` dideklarasikan sebelum `/user/{user_id}`:
{* ../../docs_src/path_params/tutorial003.py hl[6,11] *}
Sebaliknya, path `/users/{user_id}` juga akan sesuai dengan `/users/me`, "menganggap" menerima parameter `user_id` dengan nilai `"me"`.
Serupa, anda juga tidak bisa mendefinisikan operasi path:
{* ../../docs_src/path_params/tutorial003b.py hl[6,11] *}
Path pertama akan selalu digunakan karena path sesuai dengan yang pertama.
## Nilai terdefinisi
Jika ada *operasi path* yang menerima *parameter path*, tetapi anda ingin nilai valid *parameter path* sudah terdefinisi, anda bisa menggunakan standar Python <abbr title="Enumeration">`Enum`</abbr>.
### Membuat class `Enum`
Import `Enum` dan buat *sub-class* warisan dari `str` dan `Enum`.
Dengan warisan dari `str` dokumen API mengetahui nilai nya harus berjenis `string` supaya bisa digunakan dengan benar.
Kemudian buat atribut *class* dengan nilai tetap *string* yang benar:
{* ../../docs_src/path_params/tutorial005.py hl[1,6:9] *}
/// info
<a href="https://docs.python.org/3/library/enum.html" class="external-link" target="_blank">Enumerasi (atau enum) tersedia di Python</a> sejak versi 3.4.
///
/// tip | Tips
"AlxexNet", "ResNet", dan "LeNet" adalah nama <abbr title="Secara teknis, arsitektur model Deep Learning">model</abbr> *Machine Learning*.
///
### Mendeklarasikan *parameter path*
Kemudian buat *parameter path* dengan tipe anotasi menggunakan *class* enum dari (`ModelName`)
{* ../../docs_src/path_params/tutorial005.py hl[16] *}
### Periksa dokumentasi
Karena nilai yang tersedia untuk *parameter path* telah terdefinisi, dokumen interatik bisa memunculkan:
<img src="/img/tutorial/path-params/image03.png">
### Bekerja dengan *enumarasi* Python
Nilai *parameter path* akan menjadi *anggota enumerasi*.
#### Membandingkan *anggota enumerasi*
Anda bisa membandingkan parameter *path* dengan *anggota enumerasi* di enum `ModelName` yang anda buat:
{* ../../docs_src/path_params/tutorial005.py hl[17] *}
#### Mendapatkan *nilai enumerasi*
Anda bisa mendapatkan nilai (`str` dalam kasus ini) menggunakan `model_name.value`, atau secara umum `anggota_enum_anda.value`:
{* ../../docs_src/path_params/tutorial005.py hl[20] *}
/// tip | Tips
Anda bisa mengakses nilai `"lenet"` dnegan `ModelName.lenet.value`.
///
#### Menghasilkan *anggota enumerasi*
Anda bisa menghasilkan *anggota enumerasi* dari *operasi path* bahkan di body JSON bersarang (contoh `dict`).
They will be converted to their corresponding values (strings in this case) before returning them to the client:
{* ../../docs_src/path_params/tutorial005.py hl[18,21,23] *}
Klien akan mendapatkan respon JSON seperti berikut:
```JSON
{
"model_name": "alexnet",
"message": "Deep Learning FTW!"
}
```
## Parameter path berisi path
Misalkan terdapat *operasi path* dengan path `/files/{file_path}`.
Tetapi anda memerlukan `file_path` itu berisi *path*, seperti like `home/johndoe/myfile.txt`.
Sehingga URL untuk file tersebut akan seperti: `/files/home/johndoe/myfile.txt`.
### Dukungan OpenAPI
OpenAPI tidak bisa mendeklarasikan *parameter path* berisi *path* di dalamnya, karena menyebabkan kondisi yang sulit di*test* dan didefinisikan.
Tetapi, di **FastAPI** anda tetap bisa melakukannya dengan menggunakan *tools* internal dari Starlette.
Dan dokumentasi tetap berfungsi walaupun tidak menambahkan keterangan bahwa parameter harus berisi *path*.
### Konverter path
Melalui Starlette anda bisa mendeklarasikan *parameter path* berisi *path* dengan URL seperti:
```
/files/{file_path:path}
```
Dikondisi ini nama parameter adalah `file_path` dan bagian terakhir `:path` menginformasikan parameter harus sesuai dengan setiap *path*.
Sehingga anda bisa menggunakan:
{* ../../docs_src/path_params/tutorial004.py hl[6] *}
/// tip | Tips
Anda mungkin perlu parameter berisi `/home/johndoe/myfile.txt` di awali garis belakang (`/`).
Di kondisi ini, URL nya menjadi: `/files//home/johndoe/myfile.txt`, dengan dua garis belakang (`//`) di antara `files` dan `home`.
///
## Ringkasan
Di **FastAPI** dengan menggunakan deklarasi tipe Python standar, pendek, intuitif, anda mendapatkan:
* Dukungan editor: pemeriksaan kesalahan, autocompletion, dll.
* "<abbr title="konversi string dari request HTTP menjadi data Python">Parsing</abbr>" data.
* Validasi data.
* Annotasi API dan dokumentasi otomatis.
Semua itu anda hanya perlu mendeklarasikan sekali saja.
Ini adalah salah satu keunggulan **FastAPI** dibandingkan dengan *framework* lainnya (selain dari performa Python *native*c)
Loading…
Cancel
Save