単一ページのアプリケーションでのリモートサービスメソッドの単純な呼び出し

この記事では、クライアントとサーバーの対話を整理するための私のアプローチを、単一ページのブラウザーアプリケーションでJavaのサーバー側と共有したいと思います。

要するに、このアプローチを「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はハードドラッグです!
それに夢中になるには、バズを一度だけキャッチすれば十分です。)

設計には、 ブートストラップが使用されます。

バックエンドでは、 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つは、すでに注釈でよく知られています: RemoteSecuredAbstractService-
すべてのサービスを継承する抽象クラス、およびCommonServiceController

彼のメソッドprocessAjaxRequestリクエストはServiceスクリプトオブジェクトからprocessAjaxRequestます。

次に、サービスの名前によるコンポーネントがあり、その上に、アクセス権を確認した後、反射的に、指定されたメソッドが呼び出されます。

User(エンティティ)は、ユーザーに関するデータを保存し、 UserManagerは、 UserオブジェクトをUserした操作(永続性のエミュレーションを使用したテスト実装を保存します。

ビジネスロジックは、2つのサービスで実装されます。TestUserService-データの登録、ログイン、および編集のためのメソッドを持つサービスと、 TestAdminService-ユーザーの削除およびロールの変更のためのメソッドを持つサービスです。

コードは可能な限り自明であるため、理解が容易になることを願っています。

Githubデモコード

次は?


次の記事では、このアプローチに基づいて、Webソケットを介したクライアントとサーバーの相互作用を整理する方法、およびサーバー上でWebソケットコンテキストからHTTPセッションを取得する方法を作成する予定です。

Update2:
Update1-記事の本文に移動しました。

Source: https://habr.com/ru/post/J211937/


All Articles