Skip to content

Latest commit

 

History

History
229 lines (159 loc) · 9.76 KB

step3.ja.md

File metadata and controls

229 lines (159 loc) · 9.76 KB

STEP3: 出品APIを作る

1. APIをたたいてみる

📖 Reference

GETリクエスト

サービスをローカルで立ち上げると、ブラウザで http://127.0.0.1:9000 からサービスにアクセスすることができるようになりました。 次に、curlというコマンドを使ってアクセスをしてみます。 curlがインストールされていない場合、インストールしてください。

curl -X GET 'http://127.0.0.1:9000'

ブラウザと同じように{"message": "Hello, world!"} がコンソール上で返ってくることを確認します。

POSTリクエスト

サンプルコードには /items というエンドポイントが用意されています。 こちらのエンドポイントをcurlで叩いてみます。

$ curl -X POST 'http://127.0.0.1:9000/items'

このエンドポイントは、コールに成功すると{"message": "item received: <name>"} というレスポンスが返ってくることが期待されていますが、違ったレスポンスが返ってきてしまいます。

コマンドを以下のように修正することで、{"message": "item received: jacket"}が返ってきますが、なぜそのような結果になるのか調べてみましょう。

$ curl -X POST \
  --url 'http://localhost:9000/items' \
  -d name=jacket

🔰 Point

  • POSTとGETのリクエストの違いについて調べてみましょう
  • ブラウザで http://127.0.0.1:9000/items にアクセスしても {"message": "item received: <name>"} が返ってこないのはなぜでしょうか?
    • アクセスしたときに返ってくるHTTPステータスコードはいくつですか?
    • それはどんな意味をもつステータスコードですか?

2. 新しい商品を登録する

商品を登録するエンドポイントを作成します。

📖 Reference

準備されているPOST /itemsのエンドポイントはnameという情報を受け取れます。 ここにcategoryの情報も受け取れるように変更を加えます。

  • name: 商品の名前 (string)
  • category: 商品のカテゴリ(string)

このままではデータの保存ができないので、jsonファイルに保存するようにしましょう。 items.json というファイルを作り、そこのitemsというキーに新しく登録された商品を追加するようにしましょう。

商品を追加すると、items.jsonの中身は以下のようになることを期待しています。

{"items": [{"name": "jacket", "category": "fashion"}, ...]}

3. 商品一覧を取得する

GETで/itemsにアクセスしたときに、登録された商品一覧を取得できるようにエンドポイントを実装しましょう。 以下のようなレスポンスを期待しています。

# 商品の登録
$ curl -X POST \
  --url 'http://localhost:9000/items' \
  -d 'name=jacket' \
  -d 'category=fashion'
# /itemsにPOSTリクエストを送った時のレスポンス
{"message": "item received: jacket"}
# 登録された商品一覧
$ curl -X GET 'http://127.0.0.1:9000/items'
# /itemsにGETリクエストを送った時のレスポンス
{"items": [{"name": "jacket", "category": "fashion"}, ...]}

4. Databaseに保存する

ここまでitems.jsonに情報を保存してきましたが、このデータをデータベースに移し替えます。
今回は SQLiteというデータベースを使います。

📖 Reference

SQLiteをインストールし、dbフォルダに、mercari.sqlite3 というデータベースファイルを作成します。 mercari.sqlite3を開き、itemsテーブルを作成します。

itemsテーブルは以下のように定義し、スキーマを db/items.db に保存します。

  • id: int 商品ごとにユニークなID
  • name: string 商品の名前
  • category: string 商品のカテゴリ

データがデータベースに保存され、商品一覧情報を取り出すことができるように、GET /itemsPOST /itemsのエンドポイントを変更しましょう。

items.dbはgitの管理対象にしますが、mercari.sqlite3はgitの管理対象として追加しないようにしてください。

🔰 Point

  • jsonファイルではなくデータベース(SQLite)にデータを保存する利点は何がありますか?

5. 商品を検索する

指定したキーワードを含む商品一覧を返す、GET /searchエンドポイントを作ります。

# "jacket"という文字を含む商品一覧をリクエストする
$ curl -X GET 'http://127.0.0.1:9000/search?keyword=jacket'
# "jacket"をnameに含む商品一覧が返ってくる
{"items": [{"name": "jacket", "category": "fashion"}, ...]}

6. 画像を登録する

商品情報に画像(image)を登録できるように、GET /itemsPOST /itemsのエンドポイントを変更します。

  • 画像は images というフォルダを作成し保存します
  • ポストされた画像を sha256 で hash化し、<hash>.jpgという名前で保存します
  • itemsテーブルに画像のファイル名をstringで保存できるように変更を加えます
# ディレクトリに保存された.jpgをポストする
curl -X POST \
  --url 'http://localhost:9000/items' \
  -d 'name=jacket' \
  -d 'category=fashion' \
  -d 'image=images/default.jpg'

Items table example:

id name category image
1 jacket fashion 510824dfd4caed183a7a7cc2be80f24a5f5048e15b3b5338556d5bbd3f7bc267.jpg
2 ...

🔰 Point

  • Hash化とはなにか?
  • sha256以外にどんなハッシュ関数があるか調べてみましょう

7. 商品の詳細を返す

商品の詳細情報を取得する GET /items/<item_id> というエンドポイントを作成します。

$ curl -X GET 'http://127.0.0.1:9000/items/1'
{"name": "jacket", "category": "fashion", "image": "..."}

8. (Optional) カテゴリの情報を別のテーブルに移す

データベースを以下のように構成しなおします。 これによってカテゴリの名前が?途中で変わったとしても、全部のitemsテーブルのcategoryを修正する必要がなくなります。
GET itemsではcategoryの名前を変わらず取得したいので、テーブルをjoinしてレスポンス用のデータを作って返しましょう。

items table

id name category_id image
1 jacket 1 510824dfd4caed183a7a7cc2be80f24a5f5048e15b3b5338556d5bbd3f7bc267.jpg
2 ...

category table

id name
1 fashion
...

🔰 Point

  • データベースの正規化とは何でしょうか?

9. (Optional) Loggerについて調べる

http://127.0.0.1:9000/image/no_image.jpgにアクセスしてみましょう。 no imageという画像が帰ってきますが、 コード中にある

Image not found: <image path>

というデバッグログがコンソールに表示されません。 これはなぜか、調べてみましょう。 これを表示するためには、どこを変更したらいいでしょうか?

🔰 Point

  • Log levelとは?
  • webサーバーでは、本番はどのログレベルまで表示する?

🔰 Point

以下のキーワードについて理解しましょう

  • port (ポート番号)
  • localhost, 127.0.0.1
  • HTTPリクエストメソッド (GET, POST...)
  • HTTPステータスコード (1XX, 2XX, 3XX, 4XX, 5XXはそれぞれどんな意味を持ちますか?)

Next

STEP4: 仮想環境でアプリを動かす