2013-02-21 133 views
2

在构建RESTful服务时,我总是遇到如何开发可分发给系统用户的客户端库的问题。为RESTful服务创建客户端

举一个简单的例子,假设有一个实体调用者,并且你想通过你的RESTFul服务来支持基本的CRUD功能。

  • 救一个人,客户端需要调用POST方法并传递 合适的数据结构,说,在JSON。

  • 要通过生日找人,你的服务将包含的人的名单响应回复对象

  • 要删除的人,你的服务将有一个成功或失败的 消息作出响应。

从上面的例子中,已经有两个可以与客户共享的对象:人物对象和响应对象。我尝试了几种方法来完成此操作:

  1. 在客户端库中包含来自服务器调用的Person对象。这种方法的缺点是:

    • 客户端代码与您的服务器代码紧密耦合。任何 从服务器端的变化将需要客户端在 相同的版本更新。

    • 人的对象可能包含用于持久性或序列化的依赖项或注释。客户端并不关心这个库,而是被迫包含它们。

  2. 包含一个子类地图是不能直接紧人的对象,但包含一些辅助类设置必填字段。

    • 松散耦合,但当服务器的数据结构发生变化时可能导致无提示错误。
  3. 使用描述性文件中像Apache ThriftWADLJson Schema在编译时生成客户端对象。这解决了对象依赖关系的问题,但仍然创建了一个硬依赖关系。这几乎就像为SOAP创建WSDL一样。但是,这种方法并未广泛使用,有时难以找到示例。

什么是发布您的应用程序客户端JAR的最佳途径,使

  1. 它便于客户使用
  2. 不创建紧耦合和一些容忍服务器端更改

如果您的答案是API的更好的文档,那么从Java注释和POJO生成这些文档的好工具是什么?

+0

RESTFUL服务的重点在于客户端可以使用任何编程语言连接他想使用HTTP的B/C。我不会太担心为客户编写代码。但是有WADL文件描述RESTful服务。 – thatidiotguy 2013-02-21 22:14:57

+0

是的,我同意,这就是为什么SOAP现在很受欢迎。但是,似乎每个使用您的服务的客户端都必须编写自己的版本。如果可以为流行语言提供一种语言,它将使采用变得更容易。 – ltfishie 2013-02-21 22:24:28

+0

这就是为什么我提供最简单的示例代码给客户端从服务中提取数据,并且我的意思是HTTP请求。任何超过我认为是过度杀伤。 – thatidiotguy 2013-02-21 22:25:47

回答

2

无论用于通信的协议如何,这都是一个常见问题。

在我们最近使用的一些REST API(基于JAX-RS)中,我们创建了DTO对象。这些仅仅是愚蠢的POJO(有一些JAXB的附加注释会自动为我们做一些编组/解组)。我们将这些作为子模块(在maven中)构建,并将它们作为JAR提供,以便使用我们的API的任何其他项目可以根据需要使用DTO。显然,如果你想提供你自己的客户端库,它可以使用这些DTO。将它们作为单独的JAR(任何应用程序都可以依赖)提供意味着客户端不会陷入他们不需要的疯狂依赖关系(您的整个服务器端代码)。

这可以让事情保持很好的分离。

另一方面,您确实不需要提供客户端。毕竟它是REST。如果您的REST API构建良好并遵循HATEOAS原则,则您的API应该易于抓取/浏览,即您不需要任何其他描述性方案。如果你需要WADL或其他类似的结构,你的API可能不是很RESTful。