Rumah > pembangunan bahagian belakang > Golang > Kalkulator Bahagian Belakang-API Dalam Go

Kalkulator Bahagian Belakang-API Dalam Go

Barbara Streisand
Lepaskan: 2024-12-05 08:14:10
asal
389 orang telah melayarinya

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

API Kalkulator Tanpa Kewarganegaraan

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.

Apa seterusnya?

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."
}
Salin selepas log masuk
Salin selepas log masuk

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:

  • Laluan permintaan
  • Alamat IP pengguna
  • Kod status
  • Sebarang ralat yang muncul

Berikut ialah coretan cara saya menyediakannya untuk log teks:

logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
Salin selepas log masuk
Salin selepas log masuk

Atau untuk log JSON (yang bagus untuk disepadukan dengan alat pemantauan):

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
Salin selepas log masuk
Salin selepas log masuk

Memiliki log itu berguna menjadikan penyahpepijatan menjadi mudah apabila sesuatu tidak berfungsi seperti yang diharapkan.

CORS: Wira Yang Tidak Dijangka

Calculator Backend-API In Go

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."
}
Salin selepas log masuk
Salin selepas log masuk

Pakej utama saya

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.

Bagaimana pula dengan logik pengiraan?

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))
Salin selepas log masuk
Salin selepas log masuk

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))
Salin selepas log masuk
Salin selepas log masuk

Berikut ialah beberapa contoh kes penggunaan:

c := cors.New(cors.Options{
        AllowedOrigins:   []string{"*"},
        AllowedMethods:   []string{"GET", "POST", "OPTIONS"},
        AllowedHeaders:   []string{"Content-Type"},
        AllowCredentials: true,
    })
Salin selepas log masuk

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
        })
    }
}
Salin selepas log masuk

Kesimpulan

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan