フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

Web API レスポンスデータと考慮する点を調査する

はじめに

レスポンス データフォーマット

フォーマット 概要 注意点
XML XMLは、個別の目的に応じたマークアップ言語群を創るために汎用的に使える。
<要素名 属性="値">内容</要素名>
JSON JavaScript Object Notation

- JSONで表現するデータ型は以下の通り。

1.オブジェクト(順序づけされていないキーと値のペアの集まり。JSONでは連想配列と等価)
2.配列(データのシーケンス)
3.数値(整数、浮動小数点数
4.文字列(バックスラッシュによるエスケープシーケンス記法を含む、ダブルクォーテーション"でくくった文字列)
5.真偽値(true と false)
6.null
JSONP JSON with padding
scriptタグを使用してクロスドメインな(異なるドメインに存在する)データを取得する仕組みのことである。HTMLのscriptタグ、JavaScript(関数)、JSONを組み合わせて実現される。
クロスサイトリクエストフォージェリCSRF)に対する脆弱性に注意が必要である。

レスポンス フォーマットリクエスト方法

フォーマット サンプル
クエリパラメータ http://api.sample.com/v1/users?format=json
拡張子 http://api.sample.com/v1/users.json
リクエストヘッダー GET http://api.sample.com/v1/users
Host: api.sample.com
Accept: application/json

レスポンスデータの内部構造の設計で考慮すること

ポイント 概要
エンベロープは使わない ヘッダー情報と役割が被るので、エンベロープは使わない
オブジェクトはできるだけフラットにする JSONはネストした構造を作成することができるが、レスポンス容量を減らす。クライアント側のPerthする処理を軽減するためにも、オブジェクトはできるだけフラットにする
ページネーションをサポートする情報は返さない 情報更新される可能性があるため。

{"users": [
{
"id" : "12345",
"name" : "Yamada Taro"
}
],
"nextPage" : 3,
"prevPage": 1
}

{"users": [
{
"id" : "12345",
"name" : "Yamada Taro"
}
],
"hasNext" : true
}
プロパティの命名規則API全体で統一する - スネークケースまたはキャメルケースのどちらかで統一する
- JSONJavaScriptベースであるおとプロパティ名は変数名に相当するととらえるならキャメルケースが妥当
日付はRFC3339(W3C-DTF) 形式を使う 「2020-09-02T09:33:12+09:00」
大きな数値(64bit整数)は文字列を返す - javascriptで扱える演算可能な歳男性数は「9,007,199,254,740,991」

エラー処理の考慮

ポイント 概要
- エラー詳細はレスポンスボディに入れる。ステータスコードだけで判断しない

{
"code": "12345",
"message" : 不正な検索条件です
}
- エラーの際にHTMLが返らないようにする
クライアント側はJSON形式などを受け取る想定でいるので、レスポンスフォーマットが変わること。クライアントアプリ側で処理できないため。

Content-Type: application/json

{
"code": "12345",
"message" : 不正な検索条件です
}
サービス閉塞時は503 + "Retry-After"で返す Content-Type: application/json
Retry-After: Mon, 6 Apr 2020 ・・・

{
"code": "9999",
"message" : "サービスは利用できません"
}

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Retry-After