为Java留下客户端?
通过JSR 311及其实现,我们拥有通过Rest展示Java对象的强大标准。 然而,在客户端,似乎缺少一些与Apache Axis for SOAP相当的东西 - 这些东西隐藏了Web服务,并将数据透明地编组回Java对象。
你如何创建Java RESTful客户端? 使用HTTPConnection并手动解析结果? 或者是针对Jersey或Apache CXR的专业客户端?
这是一个古老的问题(2008),所以现在比以前有更多选择:
更新大约在2014年:
该块提供NIO支持的新成员(尽管如此,我认为这不会像服务器那样真正提高客户端的性能)。
2016年更新 :
关于选择HTTP / REST客户端的警告。 确保检查你的框架堆栈用于HTTP客户端,它是如何进行线程化的,并且理想情况下使用相同的客户端(如果它提供的话)。 也就是说,如果你使用类似Vert.x或Play的东西,你可能想要使用它的支持客户端来参与框架提供的任何总线或者反应器循环,否则就要为可能有趣的线程问题做好准备。
正如我在这个线程中提到的,我倾向于使用实现了JAX-RS的Jersey,并带有一个不错的REST客户端。 好的是,如果您使用JAX-RS实现RESTful资源,那么Jersey客户端可以重用JAXB / XML / JSON / Atom等实体提供者 - 这样您就可以在服务器端重复使用相同的对象在客户端单元测试中使用。
例如,这里是Apache Camel项目的一个单元测试用例,它从RESTful资源(使用JAXB对象端点)查找XML负载。 资源(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版本可以在Jersey中添加一个很好的客户端API
您可以使用标准的Java SE API:
private void updateCustomer(Customer customer) {
try {
URL url = new URL("http://www.example.com/customers");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("PUT");
connection.setRequestProperty("Content-Type", "application/xml");
OutputStream os = connection.getOutputStream();
jaxbContext.createMarshaller().marshal(customer, os);
os.flush();
connection.getResponseCode();
connection.disconnect();
} catch(Exception e) {
throw new RuntimeException(e);
}
}
或者,您可以使用由JAX-RS实现(如Jersey)提供的REST客户端API。 这些API更易于使用,但需要在类路径上添加额外的jar。
WebResource resource = client.resource("http://www.example.com/customers");
ClientResponse response = resource.type("application/xml");).put(ClientResponse.class, "<customer>...</customer.");
System.out.println(response);
有关更多信息,请参阅