要するに、このアプローチを「Json Remote Service Procedure Call」-JRSPCと呼びます。 (おそらくあまり調和的ではありませんが、曲から単語を消去することはありません。)
jrspcの使用-クライアントおよびサーバーでのサービスインターフェイス定義のレイヤーの使用を排除し、コードの量を減らし、リファクタリングを簡素化し、エラーの可能性を減らします。
このアプローチを使用すると、ビジネスロジックを担当するコードのみを記述でき、
新しいビジネスメソッドを定義するときに追加のコードは必要ありません。
たとえば、サーバーでは、ビジネスメソッドの定義は次のようになります。
@Component("testService") public class TestService{ @Remote public String testMethod(Long userId, String role, boolean test, List<User> users, User user){ ... return "ok"; } }
クライアントでの呼び出しは次のようになります。
var params = [userId, role, true, [{id:1, login:"111"}, {id:2, login:"222"} ], {id:3, login:"333"}] Server.call("testService", "testMethod", params, sucessCallback, errorCallback, controlWhichWillDisabledUntilResponse);
それ以上に、メソッドを定義するとき、コードはどこにも書かれていません。
仕組み
トランスポートレベルで、jrspc-json-rpcを使用し、メソッドだけでなくサービスも呼び出しで指定できます。 したがって、このようなjson-rpcはjson-rspc(s-service)と呼ばれる可能性があります。
仕様が存在する場合、 json-rpc 2.0仕様に似ていますが、サービスフィールドがリクエストオブジェクトに追加され、idフィールドがオプションになり、答えが-オプションのerrorCode。
デモのために、登録、ログイン、およびユーザーデータとユーザー権限の変更を実装する簡単なデモアプリケーションを作成しました。
クライアント部
このアプリケーションのクライアント部分は、 AngularJSフレームワークで記述されています。
警告
(まだ書いていない人に警告するのは私の義務だと思います:
{{user.name}}、Angularはハードドラッグです!
それに夢中になるには、バズを一度だけキャッチすれば十分です。)
{{user.name}}、Angularはハードドラッグです!
それに夢中になるには、バズを一度だけキャッチすれば十分です。)
設計には、 ブートストラップが使用されます。
バックエンドでは、 Spring 。
jsonオブジェクトの実装として、 json-libライブラリの
JSONObject
が使用されます。
クライアント部分は3つのファイルで構成されています。
ajax-connector.js
Server
オブジェクトにカプセル化されたサーバー要求メカニズムの実装。
(ajaxプレフィックスは、web-socket ws-connector.jsと区別するために使用されます。これにより、user-controller.jsコードを変更せずに置き換えることができます。)
user-controller.js
以下は、
userController
関数にカプセル化されたアプリケーションのビジネスロジックです。
application.html
要素ロックロジックを備えたアプリケーションGUI。
ご覧のとおり、スクリプトコードのビューでは、リモートサーバーはサーバーオブジェクトのように見えます。これは、URLで初期化する必要があります。
このオブジェクトを介して、サーバー上の任意のコンポーネントにアクセスし、次の方法でそのメソッドを呼び出すことができます。
Server.call(serviceName, mathodName, [param1, param2, ...], successCallBack, errorCallback, control);
回答またはエラー-適切なコールバックに来てください。
サーバーに新しいサービスまたはメソッドを追加しても、クライアントコードには何の影響もありません。これらのサービスとメソッドは、サーバーコードに表示された直後に呼び出すことができます。
当然、「誰にでも」と言って-私は少し真実から離れました。
実際、リモートサービスとしては、
AbstractService
から派生したクラスのみを呼び出すことができ、リモートで呼び出されるメソッドには
@Remote
によって注釈を付ける必要があります。
メソッドへのアクセス権を制限するために、アノテーション
@Secured(roleName)
ます。
そのため、たとえば、
@Secured("Admin")
アノテーションが付けられたメソッドは、 "User"ロールを持つユーザーが呼び出すことはできません。
サーバー部
サーバー全体の「フレームワーク」は、いわば、9 kb未満です。また、6つのクラスで構成されています。そのうち2つは、すでに注釈でよく知られています: RemoteとSecured 、 AbstractService-
すべてのサービスを継承する抽象クラス、およびCommonServiceController
彼のメソッド
processAjaxRequest
リクエストは
Service
スクリプトオブジェクトから
processAjaxRequest
ます。
次に、サービスの名前によるコンポーネントがあり、その上に、アクセス権を確認した後、反射的に、指定されたメソッドが呼び出されます。
User(エンティティ)は、ユーザーに関するデータを保存し、 UserManagerは、
User
オブジェクトを
User
した操作(永続性のエミュレーションを使用したテスト実装)を保存します。
ビジネスロジックは、2つのサービスで実装されます。TestUserService-データの登録、ログイン、および編集のためのメソッドを持つサービスと、 TestAdminService-ユーザーの削除およびロールの変更のためのメソッドを持つサービスです。
コードは可能な限り自明であるため、理解が容易になることを願っています。
Githubデモコード 。
次は?
次の記事では、このアプローチに基づいて、Webソケットを介したクライアントとサーバーの相互作用を整理する方法、およびサーバー上でWebソケットコンテキストからHTTPセッションを取得する方法を作成する予定です。
Update2:
Update1-記事の本文に移動しました。