エントリー
RESTは、サーバー上のオブジェクトを操作するための非常に興味深い方法です。 RESTツールを使用してCRUDインターフェースを実装することは、迅速かつ簡単です! 今日、私の意見では、REST / CRUDのどのアプローチが間違っており、プロジェクトに有害であるかを示します。
すべてのリソースに必要
ストーリーを続けるには、オブジェクトプロパティの最小セット、アドレス指定、その他の楽しみをすぐに決定する必要があります。 始めましょう:
slugとidの重要な違い
- id-ユーザーにとってNOTHINGを意味する整数値
- slugは意味のある文字列値です。 通常、スペースの代わりにアンダースコア(またはピリオド)を使用します
sql-tankers(違反なし)について説明します。
- テーブルのid-リレーションシップのデータ整合性。 NONULL、UNIQ、INTの制限があります
- slugはAPI用です。 関係には、NONULL、UNIQ、 CONST 、およびNOT USEDの制限があります。
たとえば、users.idはidですが、users.loginはかなりスラッグです。
そして今、「すべてのオブジェクトは指定されたプロパティを持たなければならない」という公理のためにそれを取り、オブジェクトに広がらないように、それらを__link__プロパティに押し込みます。例えば:
{ __link__: { url: 'http://localhost/api/users/vasya', urn: '/api/users/vasya', resource: 'users', slug: 'vasya' } }
ところで、これは有効なオブジェクトです。 一部のURL(「
localhost / api / users 」ではない)から戻る可能性があり
ます 。 このようなオブジェクトを受け取った開発者は、__ link__からurl / urnのデータを要求する
必要がありますが、それについては後で詳しく説明します。
ところで、「右側」-追加しないでください。 プロパティ "__lnk__"、ただしこれらの目的にはX-URI、X-URN、X-URLなどの形式のヘッダーを使用しますが、すべてのWebユーザーがヘッダーで作業することを好むわけではありません。 モールは死体を持って走った。
うーん...同様のプロパティを持つREST API実装はいくつありますか? 自転車を発明したのでしょうか?
CRUD /読み取りまたはHTTP / GET
ここではすべてが簡単です。 URLを取得し、オブジェクトを要求します。しかし、「and」はどうでしょうか。 そして時々この答えを観察します:
例:
HTTP / GET http:// localhost / api / users
{ status: true, count: 100, data: [ { login: 'vasya', name: 'Vasilii', id: 146, __link__: { url: 'http://localhost/api/users/vasya', urn: '/api/users/vasya', resource: 'users', slug: 'vasya' } }, { login: 'petya', name: 'Petr', id: 145, __link__: { url: 'http://localhost/api/users/petya', urn: '/api/users/petya', resource: 'users', slug: 'petya' } } ] }
ここで何が問題なのか:
- なぜ「ステータス」があるのですか? HTTP / 200がありませんか? または、サーバーがエラーメッセージテキストを送信できませんか? 「status == false」でHTTP / 200を送信-エラーを非表示にします。 エラーが発生した時点でバックエンドにログが記録されていない場合、何が起こるかを探して長い間議論します。 一方、HTTPサーバーログは、エラーが発生したURLをすぐに示します。
- この種のラッピングは、エラーメッセージを表示したりデータを受信したりするために、Weberにアンラップ関数を強制的に書き込みます。 完全なデバッグには、問題のあるURLで十分です。
- うーん...そして、+ 100500要素があり、管理者の1人がユーザー「petya」の「name」プロパティを変更した場合はどうなりますか? または、より頻繁に、新しいユーザーがコレクションに追加され、カウントはすでに101ですか? そうです、HTTP / Cache-controlを忘れることができます-リスト全体を新しい方法でプルします。
結論:これがどれほど正しいかはわかりませんが、これまでのところ、すべての議論がこのアプローチを支持しているわけではありません。
答えは次のようになります。
[ { __link__: { url: 'http://localhost/api/users/vasya', urn: '/api/users/vasya', resource: 'users', slug: 'vasya' } }, { __link__: { url: 'http://localhost/api/users/petya', urn: '/api/users/petya', resource: 'users', slug: 'petya' } } ]
同時に、カウントはHTTP / HEADに存在する
必要があります。 リソースに直接関係するものではありませんが、コレクションの状態を特徴づけます。 繰り返しますが、ユーザー数を表示する必要があります。 になる方法 すべてを選択してJavaScriptでカウントしますか? 要素の数を取得する新しいURLを作成しますか? なんで? HTTP / HEAD収集リクエストを作成します。 データはなく、見出しのみが返されます。
懐疑論者は言う:すべての要素を描くには、バックエンドに多くの要求をしなければならない、
私は答えます:HTTP / 1.1 / Keep-aliveは私たち全員を救います。 JavaScriptフレームワークとキャッシングを使用する場合、ほとんどのデータは初期化中に一度だけ要求され、その後はHTTP / 304応答でのみ要求を交換します(リソースは変更されません)。
ウェブマスターがこのアプローチを好まない理由を知っていますか? 通常の表示では、サーバーからのデータの受信を制御する必要があります。
例:データがプロパティとともにすぐに到着した場合、同期を気にせずにループ内に複数のdivをすぐに描画できます。 ユーザーと4行を表示するために4つのリクエストを行う場合、何らかの方法ですべてのリクエストのステータスを監視する必要があります。 つまり すべてのリクエストが解決するまで-何も描画しないでください。 そのような問題の解決策については、「約束と未来」を参照してください。 それらはすべて強制同期のためのコードを持っていますが、私はそのまますぐに描画します...
PS午前2時30分 リソースのネスト、大規模なDELET / POST / PUTについて話したかったのですが、おそらく眠りにつくでしょう。 この作品は一般に公開します。 コメントで話してください-続ける価値はありますか、それとも一般的な真実が流行していませんか?
PPSサードパーティのデベロッパーからREST APIを使用する際に強化する必要のあるさまざまなレーキに感謝します。
みんなありがとう!