Java 为RESTful服务创建客户机

Java 为RESTful服务创建客户机,java,rest,Java,Rest,在构建RESTful服务时,我总是遇到如何开发一个可以分发给系统用户的客户端库的问题 举一个简单的例子,假设有一个实体调用人,您希望通过RESTFul服务支持基本的CRUD功能 为了拯救一个人,客户端需要callpost方法并传递 适当的数据结构,比如JSON 若要在生日前查找联系人,您的服务将使用包含联系人对象列表的响应进行回复 若要删除某人,您的服务将以成功或 失败消息 从上面的示例中,已经有两个对象可以与客户端共享:person对象和response对象。我尝试了几种方法来实现这一点:

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

举一个简单的例子,假设有一个实体调用人,您希望通过RESTFul服务支持基本的CRUD功能

  • 为了拯救一个人,客户端需要callpost方法并传递 适当的数据结构,比如JSON

  • 若要在生日前查找联系人,您的服务将使用包含联系人对象列表的响应进行回复

  • 若要删除某人,您的服务将以成功或 失败消息
从上面的示例中,已经有两个对象可以与客户端共享:person对象和response对象。我尝试了几种方法来实现这一点:

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

    • 客户机代码与服务器代码紧密耦合。任何 来自服务器端的更改将要求客户端在 同样的版本

    • Person的对象可能包含用于 持久化或序列化。客户对此毫不关心
      图书馆,但被迫包括它们

  • 包括Map的子类,该子类与Person的对象没有直接关系,但包含一些帮助器类来设置必需的字段

    • 更松散的耦合,但当来自服务器的数据结构发生更改时,可能会导致无声错误
  • 使用描述性文件(如或)在编译期间生成客户端对象。这解决了对象依赖性的问题,但仍然创建了硬依赖性。这几乎类似于为SOAP创建WSDL。然而,这种方法没有得到广泛应用,有时很难找到实例
  • 为应用程序发布客户机jar的最佳方式是什么

  • 它便于客户使用
  • 不会为服务器端更改创建紧密耦合和一些容差

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

    这是一个常见的问题,无论用于通信的协议是什么

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

    这使得事情很好地解耦


    另一方面,您真的不需要提供客户机。毕竟是休息。如果您的RESTAPI构造良好并遵循原则,那么您的API应该易于爬行/浏览,也就是说,您不需要任何其他描述性方案。如果您需要WADL或其他类似的构造,那么您的API可能不是非常RESTful。

    这是一个常见的问题,无论用于通信的协议是什么

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

    这使得事情很好地解耦


    另一方面,您真的不需要提供客户机。毕竟是休息。如果您的RESTAPI构造良好并遵循原则,那么您的API应该易于爬行/浏览,也就是说,您不需要任何其他描述性方案。如果您需要WADL或其他类似的构造,您的API可能不是非常RESTful。

    RESTful服务的全部要点是,客户机可以使用HTTP连接到任何他想要的编程语言b/c。我不会太担心亲自为客户编写代码。然而,有一些WADL文件描述RESTful服务。是的,我同意,这就是为什么SOAP现在如此流行的原因。然而,似乎每个使用您的服务的客户机都必须编写自己的版本。如果可以为流行语言提供一个示例代码,它将使采用变得更加容易。这就是为什么我向客户端提供最简单的示例代码,以从服务中提取数据,我指的是HTTP请求。RESTFUL服务的全部要点是,客户端可以使用HTTP连接到任何他想要的编程语言b/c。我不会太担心亲自为客户编写代码。然而,有一些WADL文件描述RESTful服务。是的,我同意,这就是为什么SOAP现在如此流行的原因。然而,似乎每个使用您的服务的客户机都必须编写自己的版本。如果可以为流行语言提供一个示例代码,它将使采用变得更加容易。这就是为什么我向客户端提供最简单的示例代码,以从服务中提取数据,我指的是HTTP请求。我认为再多的话就太过分了。