まとめ:REST API モデル
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 78/107。
チャレンジ
簡単ブログプラットフォーム向けのREST APIモデルシステムを作りましょう!JSONにシリアライズでき、読みやすい文字列表現を提供する、適切に構造化された型を作成します。実際のAPIレスポンスを構築するときに必要となるものです。
コードを2つのファイルに分けて整理します。
models.go:適切なJSONタグと文字列表現を備えたAPIデータモデルを定義します。ID(int)、Name(string)、Email(string)フィールドを持つAuthor構造体を作成します。これらをJSONキー"id"、"name"、"email"に対応付けます。String()を実装し、形式[Name] <[Email]>を返します。ID(int)、Title(string)、Content(string)、Author(ネストされたAuthor構造体)、Published(bool)を持つPost構造体を作成します。これらを"id"、"title"、"content"、"author"、"published"に対応付けます。空のコンテンツがJSONに表示されないよう、Contentフィールドにはomitemptyを使用します。String()を実装し、"[Title]" by [Author's String representation]を返します。Success(bool)、Message(string)、Data(Post)を持つAPIResponse構造体を作成します。"success"、"message"、"data"に対応付けます。Messageフィールドにはomitemptyを使用します。main.go:APIレスポンスを構築し、JSON出力と文字列表現の両方を示します。操作タイプ(
jsonまたはdisplay)を読み取り、次に投稿の詳細、つまり投稿ID、タイトル、コンテンツ、著者ID、著者名、著者のメールアドレス、公開状態(trueまたはfalse)を読み取ります。jsonの場合:Success: trueを設定し、PostをデータとするAPIResponseを作成します(Messageは空のままにします)。JSONに変換して出力します。displayの場合:Postを作成し、そのStringメソッドを使って出力した後、Authorを別の行に出力します。
次の入力が与えられます。
- 1行目:操作タイプ(
jsonまたはdisplay) - 2行目:投稿ID
- 3行目:タイトル
- 4行目:コンテンツ(空の場合があります)
- 5行目:著者ID
- 6行目:著者名
- 7行目:著者のメールアドレス
- 8行目:公開状態(
trueまたはfalse)
たとえば、次の入力が与えられた場合:
json
1
Getting Started with Go
Learn the basics of Go programming
101
Jane Smith
jane@example.com
true出力は次のようになります。
{"success":true,"data":{"id":1,"title":"Getting Started with Go","content":"Learn the basics of Go programming","author":{"id":101,"name":"Jane Smith","email":"jane@example.com"},"published":true}}また、次の入力が与えられた場合:
json
2
Draft Post
102
John Doe
john@example.com
false出力は次のようになります。
{"success":true,"data":{"id":2,"title":"Draft Post","author":{"id":102,"name":"John Doe","email":"john@example.com"},"published":false}}空のコンテンツフィールドがJSON出力から省略されていることに注目してください。
さらに、次の入力が与えられた場合:
display
3
Advanced Interfaces
Deep dive into Go interfaces
103
Alice Chen
alice@example.com
true出力は次のようになります。
"Advanced Interfaces" by Alice Chen <alice@example.com>
Alice Chen <alice@example.com>自分で試してみよう
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 操作の種類を読み取る
operation, _ := reader.ReadString('\n')
operation = strings.TrimSpace(operation)
// 投稿IDを読み取る
postIDStr, _ := reader.ReadString('\n')
postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))
// タイトルを読み取る
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
// 本文を読み取る
content, _ := reader.ReadString('\n')
content = strings.TrimSpace(content)
// 著者IDを読み取る
authorIDStr, _ := reader.ReadString('\n')
authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))
// 著者名を読み取る
authorName, _ := reader.ReadString('\n')
authorName = strings.TrimSpace(authorName)
// 著者のメールアドレスを読み取る
authorEmail, _ := reader.ReadString('\n')
authorEmail = strings.TrimSpace(authorEmail)
// 公開状態を読み取る
publishedStr, _ := reader.ReadString('\n')
published := strings.TrimSpace(publishedStr) == "true"
// TODO: 読み取った値を使ってAuthor構造体を作成する
// TODO: 読み取った値とAuthorを使ってPost構造体を作成する
// TODO: 操作の種類に応じて処理する
// operationが"json"の場合:
// - Success: true、Data に Post を設定した APIResponse を作成する
// - json.Marshal を使って JSON に変換する
// - JSON 文字列を出力する
// operation が "display" の場合:
// - Post の String メソッドを使って出力する
// - Author を新しい行に出力する
// 変数を使用するための仮のコード(実装時に削除する)
_ = postID
_ = title
_ = content
_ = authorID
_ = authorName
_ = authorEmail
_ = published
_ = operation
_ = json.Marshal
fmt.Println("TODO: Implement the solution")
}
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー11標準ライブラリとOOP
io.Reader と io.Writersort.Interfacefmt.Stringer インターフェースencoding/json と構造体http.Handler インターフェースまとめ:REST API モデル自分で練習してみよう: Goオンラインコンパイラ