6

私の会社は、大きなプロジェクトをゼロから再設計しようとしています。現在、データプロバイダーの実装方法を検討中です。私は過去数か月でいくつかの Web サービスを統合していましたが、この方法でデータを処理するのが好きです。そこで、RESTful な設計を考えていました。REST をサポートする ColdFusion 10 を使用しますが、実際には必要なコンポーネント構造が好きではありません。

おそらく最大の利点は、REST を使用してすべてのプラットフォーム (Web サイト、モバイル Web サイト、iOS/Android アプリ) にデータを提供できることです。私のセキュリティ アプローチは次のとおりです。公開データには誰でもアクセスできます (当然のことです)。個人データには BasicAuth のみでアクセスできます。BasicAuth を使用すると、さまざまなアクセス レベルを持つユーザー ロールを持つこともできます。認証は暗黙的で、セッション/ログインに基づいています。

<!--- server-side example to request customer information (private data, BasicAuth required) --->
<cfset requestedID = 123>
<cfhttp url="/customer/#requestedID#" method="get" username="#APPLICATION.REST_SYSTEMUSER#" password="#APPLICATION.REST_SYSTEMUSER_PW#">
    <cfhttpparam type="url" name="includeAddresses" value="true">
</cfhttp>

<!--- successful response in JSON --->
{
    "ID": 123,
    "FirstName": "John",
    "LastName": "Doe",
    "Birthday": "1970-01-01",
    "BillingAddress": {
        "Receiver": "John Doe",
        "Street": {
            "Name": "Main Street",
            "Number": "13",
            "Addition": ""
        }
        "City": {
            "ZipCode": "AB-123",
            "Name": "Sampletown",
            "District": ""
        }
    },
    "ShippingAddresses": [
    ]
}

<!--- deserialize JSON and build an object to use server-side (the constructor wraps the data and adds functions to it) --->
<cfset customerJSON = deserializeJSON(CFHTTP.FileContent)>
<cfset customer = createObject("component", "Customer").init(customerJSON)>

ここに私の頭に浮かんだ質問があります:

  1. すべての単一ページのすべてに対して、この一般的な REST アプローチを使用するのは賢明でしょうか? (そもそも Web サイトで REST を使用するのは賢明でしょうか?)
  2. ローカル HTTP リクエストはパフォーマンスに影響を与え、ページの読み込みを遅くしますか?
  3. BasicAuth はデータを保護するのに十分ですか? (リクエストスパム保護などのマイナーなセキュリティ機能を追加するだけです)
  4. データを受信するために/customer/アクセスするなど、Web サービス内に依存関係を持たないようにするのが最善 ですか?/address/

他の (古い) Web サイトの一部には、ファイル ベースのデータ プロバイダー (データベース アクセスを処理するインクルードとコンポーネントなど) がありますが、より複雑なページ (チェックアウト プロセスなど) では、名前の競合など、いくつかの問題が発生しました。透明で重いコンポーネント、モデル/ビュー/コントローラー要素の混同などが含まれます。

4

3 に答える 3

4

これが、私が最近行った調査に基づいた私の答えです。私の会社は新製品の開発を検討しているので、あなたと同じ質問をたくさんしてきました。また、REST API がフロントエンドを可能にするだけでなく、他のアプリケーションの統合ポイントにもなるという概念にも非常に惹かれます。他の製品用に別の API を維持していますが、注意しないと、メインのアプリとの同期が簡単に失われてしまいます。

  1. REST/Single-Page アプローチを使用するのは賢明ですか? 確かにそうかもしれません。多くの大規模なサイトはこのように機能します。一般的に思われるのは、サーバーが最初のページの HTML を生成し、おそらく 10 個の製品が表示されるハイブリッド アプローチですが、次の 10 個の製品への移行はクライアント側のレンダリングによる RESTful 呼び出しを介して行われます。これにより、おそらく最高のカスタマー エクスペリエンスが得られますが、2 つの異なるテンプレート (サーバー側とクライアント側) を作成するというわずかなコストがかかります。サイトがどのように機能し、誰がそれを使用するかによって、これが必要な場合と不要な場合があります。たとえば、GMail は単一ページのアプリですが、これはアプリであり、読み込みバーを表示するのに数秒かかることは許容できますが、小売サイトを実行している場合、この種の遅延は許容できない場合があります。

  2. ローカル リクエストは読み込みを遅くしますか? データベースに直接アクセスするのではなく、Web サイトでデータを取得するために REST 呼び出しを行うということですか? その場合、追加のネットワーク ホップが関与するため、多少の遅延が追加されますが、適切にセットアップされたシステムと展開では、遅延は管理可能であると思います.

  3. HTTP 基本。HTTPS 経由でのみ検討します。HTTP では十分に安全ではありません。これについては、以下にリンクするプレゼンテーションで説明します。

  4. 依存データ。私もそれについて疑問に思っていました。私が非常に役に立ったのは、RESTful API を実装する際の多くの懸念事項と優れたプラクティスをカバーしたStormPath のプレゼンテーションを見たことです。データをリンクするアプローチ (HATEOAS 原則に従う) だけでなく、エンティティの拡張もカバーしているため、GET/customers/ID123?expand=addressは顧客の表現を返しますが、アドレスが埋め込まれています。必要なデータ。

CF10のREST対応について。私はそれを見て、それがどのように機能するかについてそれほど熱心ではありませんでした. 誤解しているかもしれませんが、REST アプリは、ハイブリッド化しようとしている通常のアプリとは大きく異なるように見えました。Railo の実装はかなり似ているように見えましたが、微妙な違いがありました。確かに、両方で動作する REST アプリを構築するのはかなり難しいように思えました。タフィーをまったく見たことがありますか?私はしていませんが、それがどのように機能するかに興味があります。

REST は厳密な標準ではなくアーキテクチャ スタイルであるため、物事をどのように実装するかについては自由度が高く、「最善の」アプローチに関する議論/議論の余地がたくさんあります。

于 2013-05-16T21:48:51.403 に答える
1

すべての単一ページのすべてに対して、この一般的な REST アプローチを使用するのは賢明でしょうか? (そもそも Web サイトで REST を使用するのは賢明でしょうか?)

よくわかりませんが、気になる点の 1 つは、CF10 での REST 呼び出しがonErrorエラー ハンドラーをバイパスする方法です。これはFixedとマークされたバグレポートですが、実際にいつ入手できるかは誰にもわかりません。CF11? わかりません。アドビに問い合わせてください。

クライアント側で 5xx エラー コードを取得する以外に、何が問題なのかを正確に知ることはできないため、これは本当に最悪です。

ローカル HTTP リクエストはパフォーマンスに影響を与え、ページの読み込みを遅くしますか?

確かにそうです。Web と RESTful API の両方のフロントがサービス層で同じメソッドを呼び出すとよいと思います。

BasicAuth はデータを保護するのに十分ですか? (リクエストスパム保護などのマイナーなセキュリティ機能を追加するだけです)

HTTPS の場合、通常はい。何が「十分」かによります。

データを受信するために /customer/ が /address/ にアクセスするなど、Web サービス内に依存関係を持たないようにするのが最善ですか?

barnyr に同意します。彼の回答を読んでください。

最後に、CF10 の公式実装以外に、CF10なしで RESTful API を処理できるTaffyColdBoxなどのフレームワークがあることを指摘しておきます。

また、Coldbox RESTful API ができないことで CF10 RESTful API ができることを確認してください。逆もまた然り?

于 2014-04-10T21:58:43.550 に答える