客户应该如何与服务互动?

时间:2017-01-06 15:38:26

标签: javascript java ajax spring service

我有一个客户端Web应用程序。用户点击按钮,提供输入,进行选择等等......这都是使用Spring框架使用Java完成的。

客户端与我用Java构建的另一个服务(使用Vertx)进行通信。此服务与数据库通信,处理缓存,端点返回值。

user navigates to web page--->client controller handles request mapping--->
--->request mapping uses controller method to return view--->
--->view's JS makes requests to service--->service returns model data

现在,我喜欢Spring控制器提供的控制思想。我的客户端页面使用Spring控制器返回视图和少量模型数据。

但是,我要做的就是调用我的服务:在我看来的JS中,我正在直接向服务进行AJAX调用。我的意思是,它有效,这就是我建议做的事情,但我不确定这是否是我应该做的事情。

另一种方法是让我的客户端对客户端应用程序的控制器进行JS调用,让我的客户端应用程序的控制器向我的服务发出请求并接收响应,然后将这些响应传回到我的JS。我觉得这可能是“更干净”或“更好”的方法,但我只用了一年的Java编程,不知道最好的方法是什么。从本质上讲,

user navigates to web page--->client controller handles request mapping--->
--->request mapping uses controller method to return view--->client view's
JS makes requests to client controller--->client controller makes request
to service--->service returns data to client controller--->
client controller handles data and returns data to client view's JS

我的抱怨是,就服务的端点而言,JS暴露的次数超出了我的预期。此外,我觉得使用我的客户端控制器来调用端点似乎......正确。

我更愿意向有经验的开发人员提供关于这些设计模式的正确与否的信息。

1 个答案:

答案 0 :(得分:1)

我已经看到它成功实施了两种方式。使用客户端控制器是缩小API暴露表面的一种相当简单的方法(前提是您锁定对后端服务的访问权限,否则您只是在浪费时间)。此方法还允许您将客户端控制器转换为适配器,以使API的返回值适应更多以UI为中心的内容(例如,通过i18n文件将映射编码的值转换为文本),并在进入之前减少任何剩余数据。客户端。

然而,还有额外工作或重复的元素以及性能开销(跳跃,编组和解组)。

如果您怀疑自己会公开底层API,或者客户对它的使用会增长到您有效创建API的卷影副本的程度,你应该只设置一个强大的Auth和Auth系统,只允许来自适当位置的呼叫。这不是一项微不足道的任务,但允许您将API公开给其他消费者。

您API的当前和预期的未来使用情况(但不要全部使用YAGNI!)应该决定您的决定。如果您希望客户端具有更透明的资源表示,则可以让客户端控制器层进行过滤和整形以避免过多的客户端有效负载。