Rest Full API - Golang (Amalan Terbaik)

王林
Lepaskan: 2024-07-28 07:09:43
asal
807 orang telah melayarinya

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

Salin selepas log masuk

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

Salin selepas log masuk

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

Salin selepas log masuk

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

Salin selepas log masuk

Dalam main.go atau route/routes.go:

r.Use(middlewares.LoggingMiddleware)

Salin selepas log masuk

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

Salin selepas log masuk

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

Salin selepas log masuk

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

Salin selepas log masuk

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

Salin selepas log masuk

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!