"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > Rest Full API - Golang (أفضل الممارسات)

Rest Full API - Golang (أفضل الممارسات)

تم النشر بتاريخ 2024-08-19
تصفح:790

Rest Full API - Golang (Best Practices)

1. هيكل المشروع

قم بتنظيم التعليمات البرمجية الخاصة بك بطريقة تجعل من السهل فهمها وتوسيعها. تتضمن البنية الشائعة فصل التعليمات البرمجية الخاصة بك إلى مجلدات مثل النماذج، والمعالجات، والمسارات، والبرامج الوسيطة، والأدوات المساعدة، والتكوين.

مثال للهيكل:

go-rest-api/
|-- main.go
|-- config/
|   |-- config.go
|-- handlers/
|   |-- user.go
|-- models/
|   |-- user.go
|-- routes/
|   |-- routes.go
|-- middlewares/
|   |-- logging.go
|-- utils/
|   |-- helpers.go

2. تكوين البيئة

تخزين إعدادات التكوين (مثل بيانات اعتماد قاعدة البيانات وأرقام المنافذ وما إلى ذلك) في متغيرات البيئة أو ملفات التكوين. استخدم حزمة مثل viper لإدارة التكوينات.

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. معالجة الأخطاء

تعامل دائمًا مع الأخطاء بشكل مناسب. إرجاع رسائل خطأ ذات معنى ورموز حالة HTTP.

handlers/user.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/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))
    })
}

في main.go أوways/routes.go:

r.Use(middlewares.LoggingMiddleware)

5. التعامل مع JSON

استخدم تشفير وفك تشفير JSON المناسبين. التحقق من صحة بيانات JSON الواردة للتأكد من أنها تلبي البنية المتوقعة.

handlers/user.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. الوصول إلى قاعدة البيانات

استخدم قاعدة بيانات لتخزين بياناتك. استخدم حزمة مثل gorm لـ ORM أو sqlx لاستعلامات SQL الأولية.

models/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. التسجيل

استخدم مكتبة تسجيل منظمة مثل logrus أو zap لتسجيل أفضل.

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. الأمن

تأكد من أن واجهة برمجة التطبيقات الخاصة بك آمنة باستخدام HTTPS، والتحقق من صحة المدخلات وتعقيمها، وتنفيذ المصادقة والترخيص المناسبين.

9. الإصدار

قم بإصدار واجهة برمجة التطبيقات الخاصة بك للتعامل مع التغييرات دون كسر العملاء الحاليين. ويمكن القيام بذلك عن طريق تضمين الإصدار في عنوان URL، مثل /api/v1/users.

10. التوثيق

قم بتوثيق واجهة برمجة التطبيقات الخاصة بك باستخدام أدوات مثل Swagger أو Postman لتوفير تعليمات استخدام واضحة للمطورين.

من خلال اتباع أفضل الممارسات هذه، يمكنك إنشاء واجهة برمجة تطبيقات RESTful قوية وقابلة للصيانة وقابلة للتطوير في Go.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/faiyajz/rest-full-api-golang-best-practices-g0n?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3