Susun kod anda dengan cara yang memudahkan untuk memahami dan memanjangkannya. Struktur biasa termasuk memisahkan kod anda ke dalam folder seperti model, pengendali, laluan, middleware, util dan konfigurasi.
Contoh struktur:
go-rest-api/ |-- main.go |-- config/ | |-- config.go |-- handlers/ | |-- user.go |-- models/ | |-- user.go |-- routes/ | |-- routes.go |-- middlewares/ | |-- logging.go |-- utils/ | |-- helpers.go
Simpan tetapan konfigurasi (seperti bukti kelayakan pangkalan data, nombor port, dll.) dalam pembolehubah persekitaran atau fail konfigurasi. Gunakan pakej seperti viper untuk mengurus konfigurasi.
config/config.go:
package config import ( "github.com/spf13/viper" "log" ) type Config struct { Port string DB struct { Host string Port string User string Password string Name string } } var AppConfig Config func LoadConfig() { viper.SetConfigName("config") viper.AddConfigPath(".") viper.AutomaticEnv() if err := viper.ReadInConfig(); err != nil { log.Fatalf("Error reading config file, %s", err) } err := viper.Unmarshal(&AppConfig) if err != nil { log.Fatalf("Unable to decode into struct, %v", err) } }
Sentiasa mengendalikan ralat dengan sewajarnya. Kembalikan mesej ralat yang bermakna dan kod status HTTP.
pengendali/pengguna.go:
func GetUserHandler(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) id, err := strconv.Atoi(params["id"]) if err != nil { http.Error(w, "Invalid user ID", http.StatusBadRequest) return } user, err := findUserByID(id) if err != nil { http.Error(w, "User not found", http.StatusNotFound) return } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(user) }
Gunakan perisian tengah untuk pengelogan, pengesahan dan kebimbangan silang yang lain.
middlewares/logging.go:
package middlewares import ( "log" "net/http" "time" ) func LoggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() next.ServeHTTP(w, r) log.Printf("%s %s %s", r.Method, r.RequestURI, time.Since(start)) }) }
Dalam main.go atau route/routes.go:
r.Use(middlewares.LoggingMiddleware)
Gunakan pengekodan dan penyahkodan JSON yang betul. Sahkan data JSON yang masuk untuk memastikan ia memenuhi struktur yang diharapkan.
pengendali/pengguna.go:
func CreateUserHandler(w http.ResponseWriter, r *http.Request) { var user models.User if err := json.NewDecoder(r.Body).Decode(&user); err != nil { http.Error(w, "Invalid input", http.StatusBadRequest) return } // Validate user data... users = append(users, user) w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(user) }
Gunakan pangkalan data untuk menyimpan data anda. Gunakan pakej seperti gorm untuk ORM atau sqlx untuk pertanyaan SQL mentah.
model/user.go:
package models import "gorm.io/gorm" type User struct { gorm.Model Name string `json:"name"` Email string `json:"email"` }
main.go:
package main import ( "github.com/yourusername/go-rest-api/config" "github.com/yourusername/go-rest-api/routes" "gorm.io/driver/postgres" "gorm.io/gorm" "log" "net/http" ) func main() { config.LoadConfig() dsn := "host=" + config.AppConfig.DB.Host + " user=" + config.AppConfig.DB.User + " password=" + config.AppConfig.DB.Password + " dbname=" + config.AppConfig.DB.Name + " port=" + config.AppConfig.DB.Port + " sslmode=disable" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { log.Fatalf("Could not connect to the database: %v", err) } r := routes.NewRouter(db) log.Println("Starting server on port", config.AppConfig.Port) log.Fatal(http.ListenAndServe(":"+config.AppConfig.Port, r)) }
Gunakan perpustakaan pengelogan berstruktur seperti logrus atau zap untuk pengelogan yang lebih baik.
middlewares/logging.go:
package middlewares import ( "github.com/sirupsen/logrus" "net/http" "time" ) func LoggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() next.ServeHTTP(w, r) logrus.WithFields(logrus.Fields{ "method": r.Method, "url": r.URL.Path, "time": time.Since(start), }).Info("handled request") }) }
Pastikan API anda selamat dengan menggunakan HTTPS, mengesahkan dan membersihkan input serta melaksanakan pengesahan dan kebenaran yang betul.
Versi API anda untuk mengendalikan perubahan tanpa merosakkan pelanggan sedia ada. Ini boleh dilakukan dengan memasukkan versi dalam URL, seperti /api/v1/users.
Dokumenkan API anda menggunakan alatan seperti Swagger atau Posman untuk memberikan arahan penggunaan yang jelas untuk pembangun.
Dengan mengikuti amalan terbaik ini, anda boleh mencipta API RESTful yang teguh, boleh diselenggara dan berskala dalam Go.
Atas ialah kandungan terperinci Rest Full API - Golang (Amalan Terbaik). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!