InfoQ

InfoQ

News

マイブックマーク

ブックマークするためにログイン または 会員登録 する

ブックマークされました!

ブックマークがエラーになりました。もう一度お願いします。

HTTP API進化に関するベストプラクティス

作者 Dilip Krishnan , 翻訳者 尾崎 義尚 投稿日 2012年1月25日

セクション
エンタープライズ・アーキテクチャ,
設計/アーキテクチャ,
デベロップメント
トピック
HTTP ,
REST ,
W3C ,
エンタープライズアーキテクチャ ,
Architecture ,
プログラミング ,
仕様

原文(投稿日:2012/01/18)へのリンク

HTTP API発展性へのベストプラクティスのタイトルが示すようにBenjamin Carlyle氏は、HTTP APIに関するシステムを設計する際の原則とプラクティスを定義した。システムとは、拡張可能で、時間とともに進化するものである。彼は、アーキテクチャスタイルのRESTと、HTTPを経由して公開されるプログラム可能なHTTP APIとの違いを示すことからはじめた。

HTTP APIは、特定のサービスに対するプログラマ指向のインターフェイスであり、RESTfulサービスコントラクトリソース指向アーキテクチャURI空間と言った別名で知られている。

細かく言うと、多くのHTTP APIは、インターフェイスの"標準"で要求された厳密な意味での定型インターフェイス制約に制限されない。[…]

まず彼は、時間をかけて進化を決定するAPI構築の様々な要素を特定することからはじめた。一般的にAPIの進化は、クライアントとサーバーの互換性、特にAPIの変更による上位互換と下位互換に影響する。頻繁な変更による改善:

  1. APIで使われるメソッドの一般的なセマンティクスには、例外的な条件と他のメタデータが含まれる
  2. APIで使われるメディアタイプの一般的なセマンティクスには、任意のまたは、すべてのスキーマ情報が含まれる
  3. APIで作られるURIのセットには、APIで使われる一般的なメソッドと一般的なメディアタイプの特定のセマンティクスが含まれる

API進化で最新の変更をした状態は、メソッドのセマンティクスである。この記事で説明されているベストプラクティスは、上位および下位互換への変更と、サービスとクライアントはよりゆるやかな方法で進化できるようにするアプリケーションがポステルの法則を認識することである。彼は、互換性の問題を伝えるために可能な限りHTTPエラーコードを使うことを提案している。

ベストプラクティス3:既存のメソッドと下位互換がないメソッドには、新しい名前が選択されるべきである。 - たとえば、メソッドを正しく処理するために理解するべき(セマンティクスを理解する必要がある)新しいメソッドの機能があった場合に新しいメソッド名が選択されるべきである。

ベストプラクティス4:サービスは、理解できない、またはそれらが認識していないコンポーネントのヘッダを無視するべきである。プロキシは、それらのヘッダを変更しない、または彼らが変更無しでは理解できないコンポーネントは変更せずにパスするすべきである。

[…]

ベストプラクティス7:新しいステータスには、既存の、状態を理解できる粒度の、数値の範囲内のステータスコードが割り当てられるべきである。

[…]

ベストプラクティス9:新しいステータスが、400 Bad Requestや500 Internal Server Error以外の既存のステータスのサブセットだった場合、既存のステータスの意味を改良して、レスポンスヘッダに追加情報を追加するよりも、新しいステータスコードを割り当てた方がよい。

彼は、サーバーとクライアントのメディアタイプに関する対称的な性質に関して重要な違いについて指摘している ...

[…] クライアント・サーバー間の非同期なメソッドとステータスとは違い、メディアタイプは一般的にリクエストとレスポンスのペイロードとして、どちらの方向に移動するのにも適している。このような理由から、このセクションでは、クライアントとサーバーについてではなく、送信者と受信者について話します。

... メディアタイプに関して、ベストプラクティスの基本的なフォームとして認識されている。

[…]

ベストプラクティス11:ドキュメントのバリデーションは、ベストプラクティス10を満たして、バリデーションロジックが同じバージョンか、それ以降のバージョンのAPIでドキュメントの送信者として書かれた場合のみ失敗する可能性がある。

ベストプラクティス12:メディアタイプの設計目標で既存のメディアタイプのスキーマに新しい情報を追加できる場合、それを追加するべきである。

彼は、送信者と受信者間の互換性を管理するためにContent-TypesとAcceptヘッダを使うことを提唱している。

HTTP APIはメディアタイプスキーマの変更の上位互換に利用する。要求されたスキーマ、または新しいクライアントによって提供された互換性のない変更を伴う新しいメディアタイプ。継続して要求されており、前からのクライアントによって提供された古いメディアタイプ。クライアントとサーバーのメディアタイプがアップグレードされ、新しいメディアタイプが対応されるまでの間のサポートに必要である。

彼の意見では、URLのリソース空間の変更はサーバー中心の問題であり、ハイパーメディアの制約設計によって、 クライアントで互換性の問題を起こすべきではない。彼は、クライアントリクエストをサーバーのインスタンス/サーバーに適切にルーティングするためにクッキーの利用を提言している。

汎用メソッドやメディアタイプを処理する必要はなくなったが、様々な汎用メソッドを使うとき、特定のセマンティクスを持つ特定のURLを処理する必要がある。   […] 以下は、サービスコントラクトに関する、サーバー中心の見方である:

  • GET /invoice/{invoice-id}, invoice-idの請求書(invoice)をapplication/invoice+xmlで返す
  • GET /invoice/{invoice-id}/paid, invoice-idの請求支払い(invoice paid)ステータスをtext/plain (xsd:boolシンタックス)で返す。
  • PUT /invoice/{invoice-id}/paid, invoice-idの請求(invoice)に対する、請求支払い(invoice paid)ステータスをtext/plain (xsd:bool シンタックス)でセットできる

加えて彼は、サーバーサイトURL空間を変更することができるクライアント機能に関するベストプラクティスも示した。

ベストプラクティス19: サーバーは、クライアントを古いサーバーに固定しておくのか、クッキーやそれに似たメカニズムを使って新しいサーバーにアップグレードするのかを追跡し続けるべきである。

ベストプラクティス20: クライアントは、HEADまたはGETリクエストから応答がないときの、サーバーからのリダイレクトステータス応答を追跡するべきである。[RFC2616]

ベストプラクティス21:URL空間を再設計する場合、古いURLと同じセマンティクスでURLを用意し、古いURLから新しいURLにリダイレクトするようにする。

この記事は、時間をかけて進化するHTTP APIシステムを可能にする基本原則を提供する。このトピックをより深く知りたい場合、元の記事を参考にして欲しい。

特集コンテンツ一覧

GAE開発の落とし穴

Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します

イベントレポート:「Coqチュートリアル#1」

去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。

Javaの未来についてのNeal Gafter氏とのディスカッション

Choosing Options

Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。

Google Dartのエッセンス:アプリケーションの構築、スナップショット、Isolate

GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式

CSPベースのモデル検査ツール「Process Analysis Toolkit」

本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。

Jenkinsによる継続的インテグレーションのススメ(4) ~CloudBeesでJenkinsをサービスとして使う~

前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。

書籍『抽象によるソフトウェア設計-Alloyではじめる形式手法-』の紹介

Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。

Windows デバイスで開発するタッチユーザーインターフェイス

スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。