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:apiau-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
errorcomme 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