小村のポートフォリオサイト開発(13) DjangoRestFramework レスポンスデータフォーマット

  • こんばんは、小村だよ!

  • 下記のポートフォリオサイトを構築していくよ

  • 前回記事の論理削除対応をしたね

  • 今回はAPIのレスポンスのフォーマットを決めていきたいと思います



目次

  1. APIのレスポンスのフォーマットを決める
  2. 記事取込処理の正常系レスポンスを決める
  3. 全体共通のエラー時のレスポンスを決める



記録

APIのレスポンスのフォーマットを決める

参考:Udemy REST WebAPI サービス 設計 26. データの内部構造

参考:WebAPIでエラーをどう表現すべき?15のサービスを調査してみた」についてまとめた

  • APIのレスポンスは、業務上では下記のようなフォーマットで返してました
{
  result: 1 or 0
  data: { ... }
}
  • 改めて今回調べたところ、resultなどは返さないのが一般的のようですね?

  • 何が一番いいのか色々見ましたが最終的にUdemyで上記講座に書かれていた方針でいきます

    • エンベロープは使わない

      • エンベロープ=レスポンスボディ内のメタ情報。ヘッダ情報と役割がかぶるため不要
    • オブジェクトはできるだけフラット

      • レスポンス容量を減らすため
    • エラー詳細はレスポンスボディに追加する

      • 下記の形式とする
{
  code: xx
  detail: ''
}



記事取込処理の正常系レスポンスを決める

  • ではでは、今回の記事取込処理のレスポンスを決めていきましょう

  • まず、正常に処理が行われたときは下記を返すようにしましょうか

http_status: 200

{
  created_count: x,
  updated_count: x,
  deleted_count: x,
  failed_count: x,
  failed_ids: [x, x, x]
}
  • 正常かどうかはレスポンスヘッダで確認します。

  • HTTP 200 OK はリクエストが成功した場合に返すレスポンスコードですね

  • それから作成、更新、削除件数を返します。

  • 最後に入力チェックではじかれた件数とIDを返すようにしましょうか

  • そんな感じにViewsを修正します

  • 修正して実行した結果が最後の図。問題なさそうですね!

f:id:kom314_prog:20210828171542p:plain
f:id:kom314_prog:20210828171628p:plain
f:id:kom314_prog:20210828171728p:plain



全体共通のエラー時のレスポンスを決める


f:id:kom314_prog:20210828194753p:plain
  • 参考サイトを参考に、utiles.handler.pyを作成して図のように記載


f:id:kom314_prog:20210828194437p:plain
  • これをsettingsに上記画像のように書くのだけど、そこで2時間くらいエラーと戦いました。

  • 結果として、上記の書き方です。

    • エラーで詰まったら飯食うの大事。一瞬で解けた。フォルダパスの書き方が原因だった


f:id:kom314_prog:20210828203342p:plain
  • 実装してエラー吐いた結果がこれ

  • 本当は出力をmessageにしたかったのにdetailで出てしまうのは自分の実力不足でする……

  • 業務の方のシステムだとdetailなんて吐いてないので、実装覗いてきて改良します



おわりに

  • やっとこさ取込機能に関する機能の実装は一通りおしまい!

  • あとはリファクタリングしたらweb側の実装に戻れます!

  • あともうちょいだ!がんばろー!

  • ではでは、ちゃお~~~!