如何为 Java 创建 REST 客户端?[已关闭]

2022-08-31 05:31:13

通过 JSR 311 及其实现,我们有了一个通过 REST 公开 Java 对象的强大标准。然而,在客户端,似乎缺少一些与Apache Axis for SOAP相当的东西 - 隐藏Web服务并将数据透明地封送回Java对象。

如何创建 Java RESTful 客户端?使用 HTTPConnection 和手动解析结果?还是泽西岛或Apache CXR等专业客户?


答案 1

这是一个古老的问题(2008年),所以现在有更多的选择:

更新(2020年项目仍在进行):

  • Apache HTTP Components (4.2) Fluent adapter - JDK的基本替代品,由此列表中的其他几个候选者使用。比旧的Commons HTTP Client 3更好,更容易用于构建自己的REST客户端。您必须使用像Jackson这样的东西来支持JSON解析,并且可以使用HTTP组件URIBuilder来构建类似于Jersey / JAX-RS Rest客户端的资源URI。HTTP组件也支持NIO,但鉴于REST的简短请求,我怀疑你会得到比BIO更好的性能。 Apache HttpComponents 5有HTTP / 2支持。
  • OkHttp - JDK的基本替代品,类似于http组件,由此列表中的其他几个候选者使用。支持较新的 HTTP 协议(SPDY 和 HTTP2)。适用于安卓系统。不幸的是,它没有提供真正的基于反应堆环路的异步选项(参见上面的Ning和HTTP组件)。但是,如果您使用较新的HTTP2协议,则问题不大(假设连接计数有问题)。
  • Ning Async-http-client - 提供 NIO 支持。以前称为Sonatype的Async-http-client
  • Feign wrapper for lower level http clients (okhttp, apache httpcomponents).基于接口存根自动创建客户端,类似于某些 Jersey 和 CXF 扩展。弹簧集成度强。
  • 改造 - 用于较低级别 http 客户端的包装器 (okhttp)。基于接口存根自动创建客户端,类似于某些 Jersey 和 CXF 扩展。
  • Volley wrapper for jdk http client, by google
  • google-http wrapper for jdk http client, or apache httpcomponents, by google
  • Unirest wrapper for jdk http client, by kong
  • 不安分JakartaEE wrapper for jdk http client, by jboss, jboss framework 的一部分
  • jcabi-http wrapper for apache httpcomponents,jcabi collection 的一部分
  • restlet wrapper for apache httpcomponents,restlet 框架的一部分
  • 带有断言的放心包装器,便于测试

关于选择 HTTP/REST 客户端的注意事项。确保检查您的框架堆栈用于HTTP客户端的内容,它如何进行线程处理,并且理想情况下,如果它提供一个客户端,则使用相同的客户端。也就是说,如果您使用Vert.x或Play之类的东西,您可能希望尝试使用其支持客户端来参与框架提供的任何总线或反应器循环...否则,请为可能有趣的线程问题做好准备。


答案 2

正如我在这个线程中提到的,我倾向于使用Jage,它实现了JAX-RS并带有一个不错的REST客户端。好消息是,如果您使用 JAX-RS 实现 RESTful 资源,那么 Jersey 客户端可以重用实体提供程序,例如 JAXB/XML/JSON/Atom 等 - 因此您可以在服务器端重用与在客户端单元测试中使用的对象相同的对象。

例如,这里有一个来自Apache Camel项目的单元测试用例,它从RESTful资源(使用JAXB对象端点)中查找XML有效负载。resource(uri) 方法在此基类中定义,该基类仅使用 Jersey 客户端 API。

例如:

    clientConfig = new DefaultClientConfig();
    client = Client.create(clientConfig);

    resource = client.resource("http://localhost:8080");
    // lets get the XML as a String
    String text = resource("foo").accept("application/xml").get(String.class);        

顺便说一句,我希望JAX-RS的未来版本添加一个不错的客户端API,就像泽西岛一样。