2011-09-10 3 views
0

私はRESTful APIを作成しようとしており、資格情報を必要とするいくつかの機能を持っています。たとえば、特定の半径内の近くにあるすべての場所を検出する関数を作成していますが、許可されたユーザーだけが使用できます。それを行うにはSinatra(Ruby)でGETとPOSTを組み合わせる

一つの方法は、そのようGET使用してそれをすべてを送信することです: http://myapi.heroku.com/getNearbyPlaces?lon=12.343523&lat=56.123533&radius=30&username=john&password=blabla123

をしかし、明らかにそれはそれを行うには最悪の方法です。

はそれではなく、ユーザー名とパスワードのフィールドを移動し、SSL経由でPOST変数としてそれらを埋め込むことができるので、URLはだけなので、次のようになります。 https://myapi.heroku.com/getNearbyPlaces?lon=12.343523&lat=56.123533&radius=30

をし、資格情報は暗号化されて送信されます。

SinatraとRubyでGET変数とPOST変数を正しく取得するにはどうしたらいいですか?これは正しい方法ですか?なぜそうでないのであれば?

答えて

2

HTTPの方言を話すURLエンドポイントがいくつかある場合は、本当に安らかなAPIを作成しようとしている場合は、GETに固執する必要があります。それはあなたの道のりでさえもどっているので、あなたはそれがゲットだとかなり確信しているようです。

代わりGETまたはPOSTパラメータのユーザ名とパスワードを隠そうと、あなたの代わりに、その目的のために特に考案し、クライアントで普遍的に利用可能である(そしてシナトラに便利なメソッドを使用して利用可能である)されたBasic authenticationを、使用する必要があります。

また、RESTを使用しようとしている場合は、リソースとリソース収集の概念(RESTのRとEが暗示している)を採用する必要があります。したがって、http://myapi.heroku.com/NearbyPlacesのような単一のURLがあります。 GETがある場合は、そのリソースに関する情報を収集します。なら、新しいリソースを作成します。PUT yopuは既存のリソースを更新します。DELETEの場合は削除します。これまでに行うべきことは、オブジェクト空間をこれらのリソースに構造化し、その周りにAPIを設計することです。

おそらく、あなたはhttp://myapi.heroku.com/placesにリソースコレクションを持つことができます。リソースとしての各場所には、http://myapi.heroku.com/places/123のような固有のURLがあります。新しいポーラーは、POSThttp://myapi.heroku.com/placesに送信することで作成できます。近くの場所はGEThttp://myapi.heroku.com/places/nearby?lon=12.343523&lat=56.123533&radius=30で集めることができます。 ArrayまたはURLを近くの場所に返すことができます(例:あなたが本当に見つけになりたい場合は

[ 
    "http://myapi.heroku.com/places/123", 
    "http://myapi.heroku.com/places/17", 
    "http://myapi.heroku.com/places/42" 
] 

して、あなたはまたには、APIクライアントはどうしたらブラウザを持つユーザーとして、APIを介して「ブラウズ」することを可能にする方法でHATEOASた制約REST smenticsを受け入れるかもしれません。これを可能にするには、上記の例のような、他のリソースを指すAPI内でハイパーリンクを使用します。

1

urlの一部であるパラメータ(つまり、lon,およびradius)はクエリパラメータと呼ばれ、フォームに送信するユーザーとパスワードの情報はフォームパラメータと呼ばれます。 Sinatraでは、これらのタイプのパラメータの両方がコントローラのハッシュで利用可能になります。

Sinatraでは、lonパラメータにはparams[:lon]userパラメータにはparams[:user]と表示されます。

1

基本認証またはダイジェスト認証とプレーンなGETリクエストを使用することをお勧めします。言い換えれば、あなたのリクエストは「GET/places?lat = x & lon = x & radius = x」である必要があり、HTTPで認証を処理させる必要があります。私があなたの状況を正しく理解していれば、これは理想的なアプローチであり、確かに最も簡単な解決策になります。

あなたのURIを改善することができます。あなたのリソース名に動詞(「get」)とクエリーのような形容詞(「近く」)を持つことは本当に適切ではありません。一般的に、リソースは名詞(すなわち、 "場所"、 "人"、 "本")でなければなりません。上に書いたリクエストの例を見てください。 GETリクエストを使用しており、既に場所によって照会しているため、「近傍」が冗長であるため、「取得」は冗長です。

関連する問題