java - 我应该让我的 REST 客户端 API 库异步(Java 8)
问题描述
我正在为我们的 REST 服务器创建客户端库。对于 C# 库,我使用HttpClient.PostAsync()效果很好,它返回一个对象,调用者可以等待(使其同步),他们可以完成一些其他操作然后等待,或者他们可以使用 C# 等待机制. 很好的解决方案。
对于 Java,我必须为 Java 8 编写库,因为这是使用最多的版本。使用 Java 8,我们覆盖了 98% 的程序员。(如果我们有足够的需求,我也会做一个 Java 11 的,然后我们会有本机异步调用。)
所以这是我的问题,有一些方法可以获得异步行为,或者使用 DeferredResult 或一些 3rd 方类。但是我围绕这个构建我的 API 并强制它有什么好处吗?因为如果我创建一个同步 API,调用者仍然可以在他们自己的 DeferredResult 代码中调用它。这是相同的最终结果。
所以在我看来,提供一个简单直接的 API 的方法是提供一个同步的。而那些想要异步的人将其包装在他们喜欢使其异步的任何机制中。这里的一个重要优势是我不会强制使用他们不使用的机制或 3rd 方库。
这种方法有什么缺点吗?
更新:这里更详细。
如果我只有一个同步 API,那么调用者可以用许多不同的方式包装我的同步 API 。最简单的使用 vanilla Java 8 是:
// API is: public Metrics postMetrics(Template template)
CompletableFuture<Metrics> completableFuture = CompletableFuture.supplyAsync(() -> { return client.postMetrics(template); });
相反,如果我创建一个异步 API,那么我将选择这些方法中的哪一种(我将使用 CompletableFuture),因此 API 变为:
// API is: public CompletableFuture<Metrics> postMetrics(Template template)
CompletableFuture<Metrics> completableFuture = client.postMetricsAsync(template);
当然,使用异步 API 会更容易一些。但差别很小。不利的一面是我现在对它们强制使用异步方法。我是否错过了提供异步 API 的更大优势?
解决方案
也许您应该从这些术语中思考,如果明天有另一个竞争库提供开箱即用的异步行为和同步呢?
如果我是一名开发人员,我可能会选择一个允许我开箱即用的异步行为,并为我提供配置它的选项。
我所说的只有在您考虑易于开发人员采用和内置易于进行异步 API 调用时才有意义。
我希望这有帮助。
推荐阅读
- exoplayer - ExoPlayer 将进度条定位在 Player View 下方
- c# - c# - 如何将自己的 MySQL 数据库设置到用户自己的电脑上
- javascript - 仅使用 lodash 中的一些特定功能,但作为一个整体安装似乎需要大量依赖
- r - “if else”语句在语句中重复第一个值,而不是为每个值计算
- ios - 在 Mac IOS 上出现 Ionic 构建错误
- java - 当双引号出现在键/值中时 JSON 被破坏
- android - 如何从 onMessageArrived 检索 payloadString 到构造函数?
- angular - 在外部 url 上调用组件而不更改该 url
- apache-kafka - 用于事件发布的 Kafka 与 JMS
- java - BaseEvents 子类的 Checkstyle