mcpField
E
encore-go-api

encore-go-api

github.com/encoredev開発30569 回インストール2 日前に更新
リポジトリ

encore-go-api について

Encore Go で API エンドポイントを作成するためのガイドです。Go 開発者向けに、注釈、リクエストとレスポンスの形式、パラメーターの割り当て、HTTP エラー処理を説明します。

主な機能

  1. 01Encore API 注釈
  2. 02リクエストとレスポンスの構造体パターン
  3. 03パス、クエリ、ヘッダー、Cookie の入力
  4. 04機密データのマスキング
  5. 05HTTP ステータスとエラー処理

活用シーン

  1. 01認証付きまたは公開エンドポイントの作成
  2. 02リクエストデータの Go 構造体への割り当て
  3. 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-認証が必要
methodGET, POST, PUT, PATCH, DELETEHTTP メソッド
pathstringパスパラメータに :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.NotFound404リソースが存在しない
errs.InvalidArgument400不正な入力
errs.Unauthenticated401認証の欠落/無効
errs.PermissionDenied403許可されていない
errs.AlreadyExists409リソースの重複

ガイドライン

  • 関数の上に //encore:api アノテーションを記述する
  • リクエストパラメータは構造体へのポインタであるか、省略されている必要がある
  • レスポンスは構造体へのポインタである必要がある(ボディなしの場合は省略)
  • 常に最後の戻り値として error を返す
  • JSON フィールド名、クエリパラメータ、ヘッダーには構造体タグを使用する
  • パスパラメータは名前によって構造体フィールドに自動的にマッピングされる

コメント