私はWebアプリを設計していましたが、RESTful WebサービスとしてどのようにAPIを設計すべきかを考えるために立ち止まりました。今のところ、私のURIのほとんどは汎用であり、さまざまなWebアプリに適用される可能性があります。
GET /logout // destroys session and redirects to /
GET /login // gets the webpage that has the login form
POST /login // authenticates credentials against database and either redirects home with a new session or redirects back to /login
GET /register // gets the webpage that has the registration form
POST /register // records the entered information into database as a new /user/xxx
GET /user/xxx // gets and renders current user data in a profile view
POST /user/xxx // updates new information about user
SOとgoogleをいじくり回した後、ここでかなり間違っていると感じています。
/logout
から始めて、おそらく私は本当にGET
何もしないので-POST
へのリクエストが/logout
に適切で、セッションを破棄してからGET
リダイレクト。 /logout
の用語はそのままにしておく必要がありますか?
/login
と/register
はどうですか。 /register
を/registration
に変更することはできますが、それにより私のサービスが根本的に機能する方法は変わりません-より深い問題がある場合。
/user
リソースを公開することはありません。おそらくそれはどういうわけか利用できるでしょう。たとえば、ユーザーmyUser
を使用します。
foo.com/user/myUser
または
foo.com/user
エンドユーザーは、URIに余分な冗長性を必要としません。ただし、視覚的により魅力的なのはどれですか?
このSOビジネスに関するRESTで他の質問にここで気づきましたが、可能であれば、ここで何をレイアウトしたかについてのガイダンスを本当に感謝します。
ありがとう!
更新:
私もいくつかの意見が欲しい:
/user/1
対
/user/myUserName
特に、RESTに対応していないということは、ログアウトにGETリクエストを使用することです。
( http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_methods から)
一部のメソッド(たとえば、HEAD、GET、OPTIONS、TRACE)は安全であると定義されています。つまり、情報の取得のみを目的としており、サーバーの状態を変更しないでください。言い換えれば、ロギング、キャッシュ、バナー広告の配信、Webカウンターの増分などの比較的無害な効果を超えて、副作用が発生してはなりません。 [...]
[... H]サーバーによる[GETリクエストの]アンドリングは、技術的に制限されていません。したがって、不注意または意図的なプログラミングは、サーバー上で重要な変更を引き起こす可能性があります。これは、Webキャッシング、検索エンジン、その他の自動エージェントに問題を引き起こす可能性があるため、推奨されません[...]
ログアウトとリダイレクトに関しては、ログアウトURIへの投稿に、ログアウト後のページにリダイレクトする303応答を与えることができます。
http://en.wikipedia.org/wiki/Post/Redirect/Get
http://en.wikipedia.org/wiki/HTTP_3
編集してURL設計の問題に対処します。
「リソースをどのように設計しますか?」私にとって重要な質問です。 「URLをどのように設計しますか?」次の2つの領域の考慮事項です。
ユーザーに表示されるURLは、できればtooくて意味のあるものであってはなりません。あるリソースへのリクエストでCookieを送信し、他のリソースへは送信しないようにするには、パスとCookieパスを構造化します。
JRandomUser
が自分のプロファイルを確認したい場合で、URLをfoo.com/user/JRandomUser
またはfoo.com/user/(JRandom's numeric user id here)
よりもきれいにしたい場合、ユーザーが自分の情報を見るためだけに別のURLを作成できます。 :
GET foo.com/profile /*examines cookies to figure out who
* is logged in (SomeUser) and then
* displays the same response as a
* GET to foo.com/users/SomeUser.
*/
私はこの主題についての知恵よりもはるかに容易に無知を主張しますが、ここにいくつかのリソース設計の考慮事項があります。
RESTfulは、URLを構築するためのガイドラインとして使用でき、sessionsおよびsersリソースを作成できます。
GET /session/new
は、ログインフォームがあるWebページを取得しますPOST /session
はデータベースに対して資格情報を認証しますDELETE /session
はセッションを破棄し、/にリダイレクトしますGET /users/new
は、登録フォームがあるWebページを取得しますPOST /users
は、入力された情報を新しい/ user/xxxとしてデータベースに記録しますGET /users/xxx
//プロファイルビューで現在のユーザーデータを取得してレンダリングしますPOST /users/xxx
//ユーザーに関する新しい情報を更新しますこれらは複数形でも単数形でも構いません(どちらが正しいかはわかりません)。通常、ユーザーインデックスページに/users
を使用し(予想どおり)、/sessions
を使用して、ログインしているユーザーを表示します(予想どおり)。
URLで番号の代わりに名前(/users/43
と/users/joe
)を使用することは、通常、技術的な要件ではなく、ユーザーや検索エンジンにより親しみを持たせたいという願望に基づいています。どちらでも構いませんが、一貫性を保つことをお勧めします。
Register/login/logoutまたはsign(in|up|out)
を使用すると、安らかな用語ではうまく機能しないと思います。
セッションはRESTfulではありません
はい、知っています。通常はOAuthを使用して行われていますが、実際にはセッションはRESTfulではありません。主にセッションが必要ないため、/ login/logoutリソースを使用しないでください。
実行する場合は、RESTfulにします。リソースは名詞であり、/ loginと/ logoutは名詞ではありません。/sessionを使用します。これにより、作成と削除がより自然なアクションになります。
セッションのPOSTとGETは簡単です。ユーザー/パスワードを変数として送信している場合、POSTを使用します。URIの一部としてパスワードを送信したくないためです。ログに表示され、場合によってはワイヤ上で公開されます。また、GET argsの制限でソフトウェアが失敗するリスクもあります。
通常、RESTサービスでは基本認証を使用するか、認証を使用しません。
ユーザーの作成
これは1つのリソースであるため、/ registerは必要ありません。
どの種類のIDを使用するかは難しい質問です。一意性を強制すること、削除された古いIDの再利用について考える必要があります。たとえば、IDがリサイクルされる場合(可能な場合)、それらのIDをバックエンドの外部キーとして使用することは望ましくありません。ただし、外部/内部ID変換のルックアップを使用して、バックエンドの要件を緩和できます。
さまざまなREST Webサービスをモバイルアプリに使用するか、サーバー間通信に使用するかを問わず、さまざまなREST APIを統合した経験から話をします。その他。以下は、他の人のREST APIから収集した観察結果と、私たちが自分で作成した観察結果です。
GET/register //登録フォームがあるWebページを取得します
GET/logout //セッションを破棄し、/ POST/loginにリダイレクトします//データベースに対して認証情報を認証し、新しいセッションでホームをリダイレクトするか、/ login にリダイレクトします。
RESTはサービスとして設計されているため、ログインやログアウトなどの機能は通常、成功/失敗結果(通常はJSONまたはXMLデータ形式)を返し、消費者はそれを解釈します。そのような解釈には、あなたが言ったように適切なウェブページへのリダイレクトが含まれる可能性があります
GET/register //登録フォームのあるWebページを取得します POST/register //入力した情報を新しい/user/xxx としてデータベースに記録します
これらは私が対処したことからのいくつかのポイントです。あなたにいくつかの洞察を提供してくれることを願っています。
これで、RESTの実装に関する限り、これらは私が遭遇した典型的な実装です。
GET/logout
バックエンドでログアウトを実行し、操作の成功/失敗を示すJSONを返します
POST /login
バックエンドに資格情報を送信します。成功/失敗を返します。成功した場合、通常はセッショントークンとプロファイル情報も返します。
POST /register
バックエンドに登録を送信します。成功/失敗を返します。成功した場合、通常は成功したログインと同様に扱われます。または、別個のサービスとして登録することを選択できます。
GET /user/xxx
ユーザープロファイルを取得し、ユーザーのプロファイルのJSONデータ形式を返す
POST/user/xxx //は POST /updateUser/xxx に名前が変更されました
更新されたプロファイル情報をJSON形式として投稿し、バックエンドの情報を更新します。呼び出し元に成功/失敗を返す
これは認証に対するRESTfulなアプローチだと思います。ログインには、HttpPut
を使用します。このHTTPメソッドは、キーが提供され、繰り返し呼び出しがcan等である場合に作成に使用できます。 LogOffの場合、HttpDelete
メソッドで同じパスを指定します。動詞は使用されません。適切なコレクションの複数形。 HTTPメソッドは目的をサポートします。
[HttpPut]
[Route("sessions/current")]
public IActionResult LogIn(LogInModel model) { ... }
[HttpDelete]
[Route("sessions/current")]
public IActionResult LogOff() { ... }
必要に応じて、アクティブをアクティブに置き換えることができます。
Twitterに似たユーザーアカウントURLを使用することをお勧めします。ユーザーのアカウントURLは、URL https://で自分のTwitterアカウントにアクセスできるように、foo.com/myUserName
のようになります。 Twitter.com/joelbyler
POSTが必要なログアウトについては同意しません。 APIの一部として、セッションを維持する場合、UUIDの形式のセッションIDは、ユーザーを追跡し、実行されているアクションが許可されていることを確認するために使用できるものです。その後、GETでさえセッションIDをリソースに渡すことができます。
簡単に言えば、URLはシンプルで覚えやすいものにすることをお勧めします。