2

MySQLデータベースと対話するためのRESTAPIを作成しようとしています。このAPIを使用して、アプリケーションを介してデータベースを直接公開せずに、AndroidまたはiOSデバイスからデータベースにアクセスしたいと思います。しかし、RESTとその原則に基づいて設計されたAPIの実装に関する重要な側面に頭を悩ませているのです。

理論的な観点からRESTの概念を理解しています。私が何日も把握しようとして苦労してきたのは、RESTURIがデータベースサーバー上にあるものにどのようにマッピングされるかです。

特定のURIを持つリソースのサーバーにGETリクエストを行う場合は、http://www.example.com/resourceと言います。、内部的に、これはサーバーのどこに行きますか?私が理解しているのは、ルートディレクトリに移動し、次に「リソース」ディレクトリに移動するということです。そこから、その「リソース」ディレクトリ内のすべてのファイルを返します。リソースがデータベースサーバーにあり、APIが呼び出されているサーバーではないため、私は単に混乱しています。リソースパス/階層はサーバー上の実際のディレクトリを表しますか、それともリソースの抽象化ですか?後者の場合、その抽象化されたリソース名をデータベースのテーブルまたは行にマップするにはどうすればよいですか?このURIパスが内部でどのように機能するかを簡単に理解できる、この具体的な実装例を見つけることができないのはイライラしています。

4

2 に答える 2

0

RESTアプリケーションを構築するフレームワークから始める必要があると思います。Rails、RestEasy for java、Codeigniterはすべて、優れたRESTルーティング機能の基盤を備えています。これには、データベースまたはビジネスプロセスのいずれかから下線を引くリソースからURLを抽象化することが含まれます。彼らは、URLマッピングを使用するか、抽象化のためのファサードを作成することでこれを実現します。
一般に、RESTは、クエリパラメーターを使用する従来のGET / PUT/POSTと実際には違いはありません。実際、Apache URLの書き換えは通常、RESTスタイルのルーティングをサポートするために使用されます。フレームワークの1つを選び、それらがこの機能をどのように実装するかを研究することをお勧めします。Rails iは、他のフレームワークの中でも大きな強みを持っています。

于 2012-06-13T19:02:52.373 に答える
0

フレームワークを使用して多くの作業を行うことができますが、内部で行われることは魔法ではありません。ある意味で、URIはいくつかのデータベーステーブルにマップされます。それらは特定のディレクトリ構造を参照していませんが、リソース間の階層関係を説明しようとします。

たとえば、大学をモデル化しているとしましょう。データベース内の要素は、学部またはコースの2つのテーブルのいずれかに格納されます。学部テーブルは、法学部、医学部などを説明する行で構成されています。一意のfaculty_id列があり、次に必要なものを説明する列があります。Coursesテーブルには、コースがどの学部に属しているかを示すために、一意のcourse_id列と外部キーfaculty_id列があります。

このAPIを設計するRESTfulな方法は次のようになります

  • /facultiesすべての学部のリストを取得するには、SELECT * FROM Faculties
  • /faculties/2特定の学部に関する情報を取得するには、SELECT * FROM Faculties WHERE faculty_id=2
  • /faculties/2/courses特定の学部に属するすべてのコースを取得するには、SELECT * FROM Courses WHERE faculty_id=2
  • /faculties/2/courses/15特定のコースを取得するには、それが実際に学部2に属している場合、SELECT * FROM Courses WHERE faculty_id=2 AND course_id=15

これの正確な実装は、選択したプログラミング言語(および場合によってはフレームワーク)によって異なりますが、ある時点で、データベースにクエリを実行する方法を選択する必要があります。これは明らかではありません。あなたはそれが意味をなすためにそれを注意深く計画する必要があります!

もちろん、データベースからの結果は、何らかの方法でエンコードする必要があります。通常はXMLまたはJSONです(ただし、他の表現も同様に問題ありませんが、一般的ではない場合があります)。

GETこれとは別に、SQLコマンド( = SELECTPOST= INSERTPUT= UPDATEDELETE= )と一致するように、4つの動詞を正しく実装し、DELETEエンコーディングネゴシエーションを正しく処理し、適切なHTTP応答コードとその他の期待されるすべてのものを返すようにする必要があります。 RESTfulAPIの

最後のアドバイスとして:これをきちんと行うと、モバイルアプリの設計が非常に簡単になります。私は本当にこれを十分に強調することはできません。たとえば、POSTリクエストでデータベースに表示されているとおりに完全なエントリを返す場合、正しいIDを使用してすぐに電話に保存でき、コンテンツをレンダリングする場合と同じコードを使用できます。GETリクエストを使用してダウンロードされました。また、リクエストが成功したかどうかを知る前に、時期尚早に更新してユーザーをだますことはありません(携帯電話は接続を大幅に失います)。

編集:コメントであなたの質問に答えるために:APIの作成は芸術の一形態と見なすことができ、おそらく設計段階でのコーディングを伴うべきではありません。APIは意味があり、特定の実装に依存しないようにする必要があります(つまり、異なるデータベースの選択がAPIに影響を与えることはありません)。次のタスクは、APIの人間が読める構造とデータベースの間に関係を作成することです(リレーショナルであるか他の何かであるかに関係なく)。そうです、翻訳を行う必要がありますが、クエリ文字列がどのように役立つかわかりません。典型的な構造はapi.my.website/collection/element/collection/elementです。クエリはフィルタリングに使用できます。example.com/resource?since=2012-06-01たとえば、「リソース」コレクションから要素のサブセットを取得するように記述できます。一意のIDで表現します。

私の理解では、受信リクエストは常にPHPサーバーとHTTPサーバーの動作に基づいて別々のファイルに送られる必要があると思います。これは当てはまりませんすべてのリクエストを単一のPHPファイルにルーティングしてから解析するようにWebサーバーを構成できます$_SERVER['REQUEST_URI']。選択したHTTPサーバーによって、マイレージは異なる場合がありますが、これは基本的にあなたがやりたいことです。

グーグルでPHPのフレームワークのリストを見つけましたが、どれもわかりません。他にもありますが、最近誰かがApifyについて言及しているのを聞きましたが、それについてもあまりお話しできません。PHPは、おそらくAPIを実装するためのもう1つの一般的な選択肢です。ただし、 cURLは、私が知る限り、他のWebサイトに接続するためだけに設計されたライブラリ/ツールです。確かにコマンドラインバージョンを使用してAPIをデバッグすることはできますが、サーバー側ではあまり使用されないと思います。

于 2012-06-13T21:18:39.287 に答える