encore-go-api について
Encore Go で API エンドポイントを作成するためのガイドです。Go 開発者向けに、注釈、リクエストとレスポンスの形式、パラメーターの割り当て、HTTP エラー処理を説明します。
主な機能
- 01Encore API 注釈
- 02リクエストとレスポンスの構造体パターン
- 03パス、クエリ、ヘッダー、Cookie の入力
- 04機密データのマスキング
- 05HTTP ステータスとエラー処理
活用シーン
- 01認証付きまたは公開エンドポイントの作成
- 02リクエストデータの Go 構造体への割り当て
- 03エンドポイントのトレースでの機密データのマスキング
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ encoredev/ skills --skill encore-go-apiインストール後、Claude Code で/encore-go-apiを入力して読み込まれたか確認します。
詳細
Encore Go API エンドポイント
手順
Encore Go で API エンドポイントを作成する際は、次のパターンに従ってください。
1. 基本的な API エンドポイント
関数の上に //encore:api アノテーションを記述します。
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: "[email protected]", Name: "John"}, nil
}
2. リクエストボディ付きの POST
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
}
API アノテーションのオプション
| オプション | 値 | 説明 |
|---|---|---|
public | - | 外部からアクセス可能 |
private | - | 他のサービスからのみ呼び出し可能 |
auth | - | 認証が必要 |
method | GET, POST, PUT, PATCH, DELETE | HTTP メソッド |
path | string | パスパラメータに :param を使用する URL パス |
sensitive | - | トレースからリクエスト/レスポンスのペイロードを秘匿化 |
例
//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
機密データ
機密フィールドをマークして、トレースログから秘匿化します。
type LoginParams struct {
Email string `json:"email"`
Password string `json:"password" encore:"sensitive"`
}
または、アノテーションでエンドポイント全体を機密としてマークします。
//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
}
カスタム HTTP ステータスコード
encore:"httpstatus" タグを使用して、カスタム HTTP ステータスコードを返します。
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
}
リクエストパラメータのソース
パスパラメータ
// Path: /users/:id
type GetUserParams struct {
ID string // Automatically mapped from :id
}
クエリパラメータ
// 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
}
ヘッダー
type WebhookParams struct {
Signature string `header:"X-Webhook-Signature"`
Payload string `json:"payload"`
}
Cookie
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
}
レスポンスの種類
標準レスポンス
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
}
レスポンスボディなし
//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
}
リクエストパラメータなし
//encore:api public method=GET path=/health
func Health(ctx context.Context) (*HealthResponse, error) {
return &HealthResponse{Status: "ok"}, nil
}
エラーハンドリング
適切な HTTP エラーレスポンスを返すには、errs パッケージを使用します。
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
}
一般的なエラーコード
| コード | HTTP ステータス | 用途 |
|---|---|---|
errs.NotFound | 404 | リソースが存在しない |
errs.InvalidArgument | 400 | 不正な入力 |
errs.Unauthenticated | 401 | 認証の欠落/無効 |
errs.PermissionDenied | 403 | 許可されていない |
errs.AlreadyExists | 409 | リソースの重複 |
ガイドライン
- 関数の上に
//encore:apiアノテーションを記述する - リクエストパラメータは構造体へのポインタであるか、省略されている必要がある
- レスポンスは構造体へのポインタである必要がある(ボディなしの場合は省略)
- 常に最後の戻り値として
errorを返す - JSON フィールド名、クエリパラメータ、ヘッダーには構造体タグを使用する
- パスパラメータは名前によって構造体フィールドに自動的にマッピングされる
コメント
Markdown 対応