別のミニプロジェクトに戻ります。今回は Go で書かれた電卓バックエンド API ツールです!
私は最近、ステートレス電卓用の HTTP JSON API を構築するプロジェクトを終えました。そして、これは予想していたよりもずっと楽しかった (そして少し難しかった) と言えます。表面的には、「これはただの電卓ですよね?」と単純に聞こえるかもしれません。しかし、実際に取り組んでみると、API を真に本番環境に対応させるための核心的な詳細がすべて明らかになり始めます。
それでは、そのプロセス、学んだ教訓、もう一度やり直さなければならない場合に何を微調整するかを共有しましょう。
~ ソースコード: ここにあります
ミッションは単純明快で、データベースもメモリ内キャッシュも一切データを保存しない電卓用の API を構築するというものでした。すべての計算は個別に行われます。ステートレス。クリーン。単純。 API は、すべてのエンドポイントと予期される動作を規定する OpenAPI 仕様に従っています。
入力検証
私が学んだ最初の教訓の 1 つは、入力検証の重要性でした。たとえ数学のような基本的なことであっても、ユーザーを信頼することはできません。例:
誰かが番号以外を送信した場合はどうなりますか?ドーン。
ゼロ除算はどうでしょうか?ダブルブーム。
これに対処するために、API が処理を考える前に、すべての入力がサニタイズされ、検証されるようにしました。何か問題があった場合、ユーザーには次のような分かりやすいエラー メッセージが表示されます。
{ "error": "Division by zero is not allowed. Please provide a valid denominator." }
不可解な「500 Server Error」メッセージを好む人はいません。
デバッグのためのログ
「丸太はあなたの親友である」ということわざをご存知ですか?それは本当です。 Go golang.org/x/exp/slog パッケージを使用して構造化ログを実装したところ、時間を大幅に節約できました。すべてのリクエストは次のような詳細とともにログに記録されました:
テキスト ログの設定方法のスニペットを次に示します:
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
または JSON ログの場合 (監視ツールとの統合に最適です):
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
これらのログを手元に置いておくと、何かが期待どおりに動作しないときのデバッグが簡単になりました。
当初、この API をブラウザベースのアプリで使用することは計画していませんでしたが、プロジェクトが進行するにつれて、CORS (Cross-Origin Resource Sharing) が必要であることが明らかになりました。
github.com/rs/cors パッケージを使用して、ブラウザベースのクライアントが API と対話できるようにするために必要なヘッダーをすぐに追加しました。
{ "error": "Division by zero is not allowed. Please provide a valid denominator." }
1) net/http: HTTP サーバーを設定し、リクエストをルーティングするための Go の標準ライブラリ。
2) エンコード/json: リクエストとレスポンスの JSON エンコード/デコードを処理します。
3) golang.org/x/exp/slog: すべてのリクエストをテキストまたは JSON 形式でログに記録します。
4) github.com/rs/cors: Web 統合のクロスオリジンリクエストを処理します。
これらの計算用にいくつかのハンドラーを作成しました。これらは本質的に非常に基本的なもので、主に計算のコア機能 (加算、減算、除算、乗算) に重点を置いています。
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
これとは別に、有名な net/http パッケージを使用して HTTP リクエストを処理するのは簡単で、これをさまざまな方法で実行する例がたくさんあります。私のケースは非常に単純で、HTTP を提供し、応答ライターとリクエストを処理するだけで済みました。
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
使用例をいくつか示します:
c := cors.New(cors.Options{ AllowedOrigins: []string{"*"}, AllowedMethods: []string{"GET", "POST", "OPTIONS"}, AllowedHeaders: []string{"Content-Type"}, AllowCredentials: true, })
リクエスト:
//handlers.go func AddHandler(logger *slog.Logger) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { handleOperation(logger, w, r, func(a, b float64) float64 { return a + b }) } } func SubtractHandler(logger *slog.Logger) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { handleOperation(logger, w, r, func(a, b float64) float64 { return a - b }) } } func MultiplyHandler(logger *slog.Logger) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { handleOperation(logger, w, r, func(a, b float64) float64 { return a * b }) } } func DivideHandler(logger *slog.Logger) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { handleOperation(logger, w, r, func(a, b float64) float64 { if b == 0 { panic("division by zero") } return a / b }) } }
そうだ!それだけです!あっという間にできた楽しいミニプロジェクトでした!自由に試してみて、お好みの方法で改善および強化してください。
次回まで、乾杯! ? ?
以上がGo の電卓バックエンド APIの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。