encore-go-api

Par encoredev · skills

Créez des endpoints API avec Encore Go.

npx skills add https://github.com/encoredev/skills --skill encore-go-api

Points de terminaison API Encore Go

Instructions

Lors de la création de points de terminaison API avec Encore Go, suivez ces modèles :

1. Point de terminaison API de base

Utilisez l'annotation //encore:api au-dessus de votre fonction :

package user

import "context"

type GetUserParams struct {
    ID string
}

type User struct {
    ID    string `json:"id"`
    Email string `json:"email"`
    Name  string `json:"name"`
}

//encore:api public method=GET path=/users/:id
func GetUser(ctx context.Context, params *GetUserParams) (*User, error) {
    // Implementation
    return &User{ID: params.ID, Email: "user@example.com", Name: "John"}, nil
}

2. POST avec corps de requête

type CreateUserParams struct {
    Email string `json:"email"`
    Name  string `json:"name"`
}

//encore:api public method=POST path=/users
func CreateUser(ctx context.Context, params *CreateUserParams) (*User, error) {
    // Implementation
    return &User{ID: "new-id", Email: params.Email, Name: params.Name}, nil
}

Options d'annotation API

Option Valeurs Description
public - Accessible de l'extérieur
private - Uniquement appelable depuis d'autres services
auth - Requiert une authentification
method GET, POST, PUT, PATCH, DELETE Méthode HTTP
path string Chemin URL avec :param pour les paramètres de chemin
sensitive - Masque les payloads de requête/réponse des traces

Exemples

//encore:api public method=GET path=/health
//encore:api private method=POST path=/internal/process
//encore:api auth method=GET path=/profile
//encore:api public sensitive method=POST path=/auth/login

Données sensibles

Marquez les champs sensibles pour les masquer des logs de traçage :

type LoginParams struct {
    Email    string `json:"email"`
    Password string `json:"password" encore:"sensitive"`
}

Ou marquez l'endpoint entier comme sensible dans l'annotation :

//encore:api public sensitive method=POST path=/auth/login
func Login(ctx context.Context, params *LoginParams) (*TokenResponse, error) {
    // Request and response will be redacted from traces
}

Codes de statut HTTP personnalisés

Retournez des codes de statut HTTP personnalisés en utilisant le tag encore:"httpstatus" :

type CreateResponse struct {
    ID     string `json:"id"`
    Status int    `encore:"httpstatus"`
}

//encore:api public method=POST path=/items
func CreateItem(ctx context.Context, params *CreateParams) (*CreateResponse, error) {
    item := createItem(params)
    return &CreateResponse{
        ID:     item.ID,
        Status: 201,  // Returns HTTP 201 Created
    }, nil
}

Sources de paramètres de requête

Paramètres de chemin

// Path: /users/:id
type GetUserParams struct {
    ID string  // Automatically mapped from :id
}

Paramètres de requête

// Path: /users
type ListUsersParams struct {
    Limit  int `query:"limit"`
    Offset int `query:"offset"`
}

//encore:api public method=GET path=/users
func ListUsers(ctx context.Context, params *ListUsersParams) (*ListResponse, error) {
    // params.Limit and params.Offset come from query string
}

En-têtes

type WebhookParams struct {
    Signature string `header:"X-Webhook-Signature"`
    Payload   string `json:"payload"`
}

Cookies

import "net/http"

type AuthParams struct {
    SessionCookie *http.Cookie `cookie:"session"`
    CSRFToken     string       `header:"X-CSRF-Token"`
}

//encore:api auth method=POST path=/logout
func Logout(ctx context.Context, params *AuthParams) error {
    // Access params.SessionCookie.Value
    return nil
}

Points de terminaison bruts

Utilisez //encore:api raw pour les webhooks ou l'accès HTTP direct :

import "net/http"

//encore:api public raw path=/webhooks/stripe method=POST
func StripeWebhook(w http.ResponseWriter, req *http.Request) {
    sig := req.Header.Get("Stripe-Signature")
    // Handle raw request...
    w.WriteHeader(http.StatusOK)
}

Types de réponse

Réponse standard

type Response struct {
    Message string `json:"message"`
}

//encore:api public method=GET path=/hello
func Hello(ctx context.Context) (*Response, error) {
    return &Response{Message: "Hello, World!"}, nil
}

Sans corps de réponse

//encore:api public method=DELETE path=/users/:id
func DeleteUser(ctx context.Context, params *DeleteParams) error {
    // Return only error (no response body on success)
    return nil
}

Sans paramètres de requête

//encore:api public method=GET path=/health
func Health(ctx context.Context) (*HealthResponse, error) {
    return &HealthResponse{Status: "ok"}, nil
}

Gestion des erreurs

Utilisez le package errs pour les réponses d'erreur HTTP appropriées :

import "encore.dev/beta/errs"

//encore:api public method=GET path=/users/:id
func GetUser(ctx context.Context, params *GetUserParams) (*User, error) {
    user, err := findUser(params.ID)
    if err != nil {
        return nil, err
    }
    if user == nil {
        return nil, &errs.Error{
            Code:    errs.NotFound,
            Message: "user not found",
        }
    }
    return user, nil
}

Codes d'erreur courants

Code Statut HTTP Utilisation
errs.NotFound 404 La ressource n'existe pas
errs.InvalidArgument 400 Entrée invalide
errs.Unauthenticated 401 Authentification manquante/invalide
errs.PermissionDenied 403 Non autorisé
errs.AlreadyExists 409 Ressource dupliquée

Directives

  • Utilisez l'annotation //encore:api au-dessus de la fonction
  • Les paramètres de requête doivent être un pointeur vers une struct ou omis
  • La réponse doit être un pointeur vers une struct (ou omis pour aucun corps)
  • Toujours retourner error comme dernière valeur de retour
  • Utilisez les struct tags pour les noms de champs JSON, paramètres de requête et en-têtes
  • Les paramètres de chemin sont automatiquement mappés aux champs de la struct par nom

Skills similaires