Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Rest Full API - Golang (Amalan Terbaik)

Rest Full API - Golang (Amalan Terbaik)

王林
王林asal
2024-07-28 07:09:43808semak imbas

Rest Full API - Golang (Best Practices)

1. Struktur Projek

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

2. Konfigurasi Persekitaran

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)
    }
}

3. Pengendalian Ralat

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)
}

4. Middlewares

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)

5. Pengendalian JSON

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)
}

6. Akses Pangkalan Data

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))
}

7. Pembalakan

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")
    })
}

8. Keselamatan

Pastikan API anda selamat dengan menggunakan HTTPS, mengesahkan dan membersihkan input serta melaksanakan pengesahan dan kebenaran yang betul.

9. Versi

Versi API anda untuk mengendalikan perubahan tanpa merosakkan pelanggan sedia ada. Ini boleh dilakukan dengan memasukkan versi dalam URL, seperti /api/v1/users.

10. Dokumentasi

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!

Kenyataan:
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