10.1. Endpoint pertama Anda¶
Sebelum kamera dapat melakukan hal yang menarik, jaringan lainnya harus bisa menjangkaunya. Hal paling sederhana yang membuktikan server masih berjalan adalah satu rute HTTP endpoint yang mengembalikan JSON:
from microdot import Microdot
app = Microdot()
frame_count = 0
trigger_count = 0
@app.get('/status')
async def status(request):
return {'frames': frame_count, 'triggers': trigger_count}
app.run(host='0.0.0.0', port=80)
Jalankan di IDE. Dari mesin lain di LAN, buka http://<cam-ip>/status. Browser menampilkan:
{"frames": 0, "triggers": 0}
Penghitung adalah placeholder -- belum ada yang menyentuhnya -- tetapi permintaan telah melintasi jaringan, kamera telah merutekannya, menjalankan handler, dan mengirimkan JSON kembali.
10.1.1. Apa yang dilakukan setiap baris¶
Satu instans microdot.Microdot per skrip. Instans tersebut mengelola tabel routing, handler error, dan siklus hidup (start, serve, stop). Aplikasi besar dibagi menjadi beberapa modul Python tetapi tetap berbagi satu objek app.
@app.get('/status') adalah dekorator rute. Kita hanya menggunakan microdot.Microdot.get() di sini; post(), put(), dan delete() akan muncul di halaman berikutnya saat kamera mulai menerima penulisan.
Setiap handler rute adalah coroutine asyncio dan menerima permintaan sebagai argumen pertamanya. Handler tidak harus menggunakan request -- yang ini mengabaikannya -- tetapi parameternya selalu ada agar tanda tangannya konsisten.
Mengembalikan dict adalah cara tercepat untuk mengirim JSON. Microdot menyerialkan dict ke JSON secara otomatis dan menetapkan Content-Type: application/json pada respons. Mengembalikan string mengirimkan text/plain. Mengembalikan microdot.Response secara eksplisit adalah bentuk panjang -- diperlukan saat isi respons biner atau saat respons membutuhkan header khusus.
app.run(host='0.0.0.0', port=80) memulai server. 0.0.0.0 berarti dengarkan di setiap antarmuka yang dimiliki kamera -- baik ethernet kabel maupun wifi STA, jika keduanya aktif. Port 80 adalah default HTTP, sehingga browser tidak perlu mengetikkan nomor port.
10.1.2. Satu permintaan, dari ujung ke ujung¶
Ponsel membuka koneksi TCP, menulis baris permintaan dan header, lalu menunggu. Kamera membaca byte dari soket, menguraikannya menjadi objek microdot.Request, mencocokkan jalur dan metode terhadap tabel routing, menunggu coroutine handler, menyerialkan nilai yang dikembalikannya, menulis baris status, header, dan isi respons kembali ke soket, lalu menutup koneksi (default HTTP/1.0) atau mendaur ulangnya (HTTP/1.1 dengan Connection: keep-alive). Seluruh pertukaran membutuhkan waktu kira-kira selama perjalanan bolak-balik jaringan ditambah apa pun yang dilakukan handler.
10.1.3. Catatan tentang pemblokiran¶
run() bersifat memblokir -- tidak pernah kembali hingga server berhenti. Itu tidak masalah untuk server satu tujuan. Aplikasi yang juga menangkap bingkai atau menjalankan coroutine lain menggunakan start_server() di dalam asyncio.run() sebagai gantinya, sehingga server HTTP dapat berbagi loop dengan yang lain.
Aplikasi menjawab satu URL.