Menu
Coddy logo textTech

まとめ:REST API モデル

CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 78/107。

challenge icon

チャレンジ

簡単

ブログプラットフォーム向けのREST APIモデルシステムを構築しましょう!JSONにシリアライズされ、読みやすい文字列表現を提供する、適切に構造化された型を作成します。これは、実際のAPIレスポンスを構築する際にまさに必要となるものです。

コードは2つのファイルに分けて構成します:

  • models.go: 適切なJSONタグと文字列表現を持つAPIデータモデルを定義します。

    ID (int)、Name (string)、Email (string) フィールドを持つ Author 構造体を作成します。これらをJSONキー "id""name""email" にマッピングします。[Name] <[Email]> という形式を返す String() メソッドを実装してください。

    ID (int)、Title (string)、Content (string)、Author (ネストされた Author 構造体)、Published (bool) フィールドを持つ Post 構造体を作成します。これらを "id""title""content""author""published" にマッピングします。Content フィールドには omitempty を使用し、空のコンテンツがJSONに表示されないようにします。"[Title]" by [Author's String representation] を返す String() メソッドを実装してください。

    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}}

空の content フィールドが 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 と Post を Data とした APIResponse を作成する
	//   - json.Marshal を使用して JSON に変換する
	//   - JSON 文字列を出力する
	// operation が "display" の場合:
	//   - String メソッドを使用して Post を出力する
	//   - 新しい行に Author を出力する

	// 変数を使用するためのプレースホルダー(実装時に削除してください)
	_ = postID
	_ = title
	_ = content
	_ = authorID
	_ = authorName
	_ = authorEmail
	_ = published
	_ = operation
	_ = json.Marshal
	fmt.Println("TODO: Implement the solution")
}

オブジェクト指向プログラミングのすべてのレッスン