この記事の途中に、以下の記事の引用を含んでいます。
Providing APIs (2013)
API開発の常識が変わる!?──この記事が語る「APIとデータフォーマット」の真髄
API開発の現場でよく耳にする「REST」「JSON」「XML」「RDF」といったキーワード。
ですが、なぜ多くのモダンWebサービスがXMLを避けてJSONを第一選択とするのか、そしてその先にRDFがどんな可能性を秘めているのか、深く考察する機会は少ないのではないでしょうか。
今回ご紹介するのは、「APIは別物として用意するものなのか?」という素朴な疑問からスタートし、API開発の本質、そしてJSON/XML/RDFなどのデータフォーマットの特徴と意義を掘り下げた、稀有な技術論文です。
特に現場で「どのデータフォーマットを採るべきか?」「API設計をどうシンプルに保てるか?」を悩んでいるエンジニアにとって、大きな示唆を与えてくれます。
APIは「別物」じゃない!──記事が主張する設計思想とは
記事冒頭で筆者は次のように述べます。
if you design your website following the principles in this book, the API isn’t a separate thing from your normal website, but a natural extension of it. All the principles we’ve talked about—smart URLs, GET and POST, etc.—apply equally well to web sites or APIs. The only difference is that instead of returning HTML, you’ll want to return JSON instead.
つまり「WebサイトとAPIは本質的に一体不可分。違いは返す内容がHTMLかJSONかでしかない」と主張しています。
さらに、JSONがデータ共有においてXMLよりはるかに優れている理由も、強く強調されます。
JSON recognizes this and makes it easy to share these data structures. Want to share the number 5? Just write ’5;. The string “foo” is just “foo”. A list of the two of them is simply “[5, “foo”]”—and so on.
そして、XMLへの強烈な批判も。
XML is probably just about the worst format for sharing data … Publishing data as XML requires figuring out how to shoehorn your internal data into a particular format, then making sure you do all of your quoting properly. Parsing XML is even worse.
API設計革命──「Webの作法」から自然派生するAPIの姿
これまで多くのエンジニアが「APIはWebサイトと別物のシステム」と捉えがちでした。
しかし著者は、REST的な設計原則(スマートなURL設計、HTTPメソッドの活用等)を守れば、
「同じURI・同じエンドポイント」で、リクエストの内容やヘッダー(Accept: application/jsonかどうか)だけをみてJSONあるいはHTMLを返せば良いと述べています。
これにはHTTPの「コンテンツネゴシエーション(Content Negotiation)」という、古くて新しい仕組みを巧みに使います。
この設計は、トラフィックやハンドラーの複雑性を増やすことなく、
WebページもAPIも「一つのURIに集約」できます。
従来やりがちだった「/items.html」「/items.json」のような拡張子による分離も、意識すればネゴシエーションできれいに集約できる。
こうすることで「エントリーポイントの乱立」「機能の重複CRUD」のリスクが大きく減ります。
XML神話の終焉──開発者とセキュリティの視点で見るJSONの優位性
記事ではXMLに対する手厳しい批判が繰り返されています。
特に「データ共有」を目的とする場合、XMLの設計思想そのものが大きな障害になると指摘します。
なぜなら、XMLは本来「テキストのマークアップ(装飾・メタ情報付加)」を目的としたフォーマットであり、
数値やリスト、ハッシュといった構造的なデータ表現を苦手とします。
一方で、JSONは現代的な多くのプログラミング言語のデータ構造とシームレスに一致するため、
「シリアライズ(データ構造を文字列化)」「デシリアライズ(逆変換)」がほぼ自動で高速、しかもバグも生じにくいのです。
> The main reason XML is so bad at sharing data is because it was never designed to do that in the first place. It was a format for marking up textual documents; annotating writing with formatting instructions and metadata of various sorts, ala HTML.
さらに致命的なのが「複雑性=バグ(特にセキュリティホール)の温床」になる点です。
XML combines the worst of both worlds: it is an incredibly complex system of parsing. Not surprisingly, XML has been responsible for hundreds of security holes.
開発者の視点でも、運用・保守の観点でも、APIをJSON化することで「速い・安全・バグに強い」API構築が可能になります。
JSONP──Webブラウザの“穴”を活かしたクロスドメイン処理の美学
APIを外部公開する場合、「同一生成元ポリシー(Same-Origin Policy)」の壁が立ちはだかります。
普通のAjaxリクエスト(XMLHttpRequest)は同一ドメインしかアクセスできません。
しかし、JavaScriptがloadする「