Kembali lagi dengan projek mini lain, kali ini dengan alat API bahagian belakang kalkulator yang ditulis dalam Go!
Baru-baru ini saya telah menyiapkan projek untuk membina HTTP JSON API untuk kalkulator tanpa kewarganegaraan, dan izinkan saya memberitahu anda—ia adalah lebih menyeronokkan (dan sedikit lebih mencabar) daripada yang saya jangkakan. Secara luaran, ia mungkin kedengaran mudah: "Hei, ini hanya kalkulator, bukan?" Tetapi sebaik sahaja anda menyelam, anda mula menemui semua butiran terperinci yang menjadikan API benar-benar sedia untuk pengeluaran.
Jadi, izinkan saya berkongsi proses, pengajaran yang dipelajari dan perkara yang akan saya tweak jika saya terpaksa melakukannya sekali lagi.
~ Kod sumber: Ditemui di sini
Misinya adalah mudah: bina API untuk kalkulator yang tidak menyimpan sebarang data—tiada pangkalan data, tiada caching dalam memori. Setiap pengiraan berlaku secara berasingan. Tanpa kewarganegaraan. Bersih. Mudah. API mengikut spesifikasi OpenAPI, yang membentangkan semua titik akhir dan gelagat yang dijangkakan.
Pengesahan Input
Salah satu pelajaran pertama yang saya pelajari ialah kepentingan pengesahan input. Anda tidak boleh mempercayai pengguna, walaupun dengan sesuatu yang asas seperti matematik. Contohnya:
Apa yang berlaku jika seseorang menghantar bukan nombor? Boom.
Bagaimana pula dengan pembahagian dengan sifar? Ledakan berganda.
Untuk mengendalikan perkara ini, saya memastikan setiap input telah dibersihkan dan disahkan sebelum API memikirkan untuk memprosesnya. Jika ada sesuatu yang tidak aktif, pengguna mendapat mesej ralat mesra yang berguna seperti:
{ "error": "Division by zero is not allowed. Please provide a valid denominator." }
Tiada sesiapa yang suka mesej "500 Ralat Pelayan" yang samar.
Melog untuk Menyahpepijat
Anda tahu perkataan itu, "Balak adalah kawan baik anda"? Memang benar. Saya melaksanakan pengelogan berstruktur menggunakan pakej Go golang.org/x/exp/slog, dan ia menjimatkan banyak masa saya. Setiap permintaan telah dilog dengan butiran seperti:
Berikut ialah coretan cara saya menyediakannya untuk log teks:
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
Atau untuk log JSON (yang bagus untuk disepadukan dengan alat pemantauan):
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
Memiliki log itu berguna menjadikan penyahpepijatan menjadi mudah apabila sesuatu tidak berfungsi seperti yang diharapkan.
Saya pada mulanya tidak merancang untuk API ini digunakan dalam apl berasaskan penyemak imbas, tetapi apabila projek itu berkembang, menjadi jelas bahawa CORS (Perkongsian Sumber Silang Asal) diperlukan.
Menggunakan pakej github.com/rs/cors, saya dengan cepat menambah pengepala yang diperlukan untuk membolehkan klien berasaskan penyemak imbas berinteraksi dengan API.
{ "error": "Division by zero is not allowed. Please provide a valid denominator." }
1) net/http: Pustaka standard Go untuk menyediakan pelayan HTTP dan permintaan penghalaan.
2) pengekodan/json: Untuk mengendalikan pengekodan/penyahkodan JSON untuk permintaan dan respons.
3) golang.org/x/exp/slog: Untuk mengelog setiap permintaan dalam sama ada teks atau format JSON.
4) github.com/rs/cors: Untuk mengendalikan permintaan silang asal untuk penyepaduan web.
Baiklah, saya telah membuat beberapa pengendali untuk pengiraan ini, ia agak asas dan tertumpu terutamanya pada fungsi teras pengiraan (Tambahan, Penolakan, Pembahagian & Pendaraban).
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
Selain itu, mengendalikan permintaan HTTP saya dengan pakej net/http yang terkenal adalah mudah dan terdapat banyak contoh di luar sana untuk melakukan ini dengan cara yang berbeza. Kes saya sangat mudah dan saya hanya perlu menyediakan beberapa HTTP, mengendalikan penulis respons dan permintaan.
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
Berikut ialah beberapa contoh kes penggunaan:
c := cors.New(cors.Options{ AllowedOrigins: []string{"*"}, AllowedMethods: []string{"GET", "POST", "OPTIONS"}, AllowedHeaders: []string{"Content-Type"}, AllowCredentials: true, })
Permintaan:
//handlers.go func AddHandler(logger *slog.Logger) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { handleOperation(logger, w, r, func(a, b float64) float64 { return a + b }) } } func SubtractHandler(logger *slog.Logger) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { handleOperation(logger, w, r, func(a, b float64) float64 { return a - b }) } } func MultiplyHandler(logger *slog.Logger) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { handleOperation(logger, w, r, func(a, b float64) float64 { return a * b }) } } func DivideHandler(logger *slog.Logger) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { handleOperation(logger, w, r, func(a, b float64) float64 { if b == 0 { panic("division by zero") } return a / b }) } }
Ya! Itu sahaja! Ia adalah projek mini yang pantas dan menyeronokkan yang saya gemari! Jangan ragu untuk mencubanya dan perbaiki & tingkatkan mengikut mana-mana cara yang anda mahu.
Sehingga lain kali, sorakan! ? ?
Atas ialah kandungan terperinci Kalkulator Bahagian Belakang-API Dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!