Java 中的 RESTful 调用
我将在Java中进行RESTful调用。但是,我不知道如何拨打电话。我是否需要使用 或 其他?URLConnection
我将在Java中进行RESTful调用。但是,我不知道如何拨打电话。我是否需要使用 或 其他?URLConnection
更新:自从我在下面写答案以来,已经快5年了;今天我有了不同的观点。
99%的人使用术语REST时,他们真的意味着HTTP;他们可以不关心“资源”,“表示”,“状态转移”,“统一接口”,“超媒体”,或者Fielding确定的REST架构风格的任何其他约束或方面。因此,各种 REST 框架提供的抽象令人困惑且无济于事。
所以:你想在2015年使用Java发送HTTP请求。您需要一个清晰,富有表现力,直观,惯用语,简单的API。使用什么?我不再使用Java,但在过去的几年里,看起来最有前途和最有趣的Java HTTP客户端库是OkHttp。来看看吧。
您绝对可以通过使用或HTTPClient对HTTP请求进行编码来与RESTful Web服务进行交互。URLConnection
但是,通常更需要使用一个库或框架,该库或框架提供专门为此设计的更简单,更具语义的API。这使得代码更易于编写、读取和调试,并减少重复工作。这些框架通常实现了一些在较低级别库中不一定存在或易于使用的强大功能,例如内容协商,缓存和身份验证。
一些最成熟的选择是Jersey,RESTEasy和Restlet。
我最熟悉 Restlet 和 Jersey,让我们来看看如何使用这两个 API 提出请求。POST
Form form = new Form();
form.add("x", "foo");
form.add("y", "bar");
Client client = ClientBuilder.newClient();
WebTarget resource = client.target("http://localhost:8080/someresource");
Builder request = resource.request();
request.accept(MediaType.APPLICATION_JSON);
Response response = request.get();
if (response.getStatusInfo().getFamily() == Family.SUCCESSFUL) {
System.out.println("Success! " + response.getStatus());
System.out.println(response.getEntity());
} else {
System.out.println("ERROR! " + response.getStatus());
System.out.println(response.getEntity());
}
Form form = new Form();
form.add("x", "foo");
form.add("y", "bar");
ClientResource resource = new ClientResource("http://localhost:8080/someresource");
Response response = resource.post(form.getWebRepresentation());
if (response.getStatus().isSuccess()) {
System.out.println("Success! " + response.getStatus());
System.out.println(response.getEntity().getText());
} else {
System.out.println("ERROR! " + response.getStatus());
System.out.println(response.getEntity().getText());
}
当然,GET 请求甚至更简单,您还可以指定实体标记和标头等内容,但希望这些示例有用且不简单,但不会太复杂。Accept
如您所见,Restlet 和 Jersey 具有类似的客户端 API。我相信它们是在同一时间开发的,因此相互影响。
我发现 Restlet API 更具语义性,因此更清晰一些,但 YMMV。
正如我所说,我对 Restlet 最熟悉,我已经在许多应用程序中使用它很多年了,我对它非常满意。这是一个非常成熟,健壮,简单,有效,活跃且支持良好的框架。我不能和泽西岛或RESTEasy交谈,但我的印象是,他们都是可靠的选择。
如果您从服务提供商(例如Facebook,Twitter)调用RESTful服务,则可以使用您选择的任何口味进行:
如果不想使用外部库,则可以使用 或 (对于 SSL),但这是在 中的工厂类型模式中封装的调用。要接收结果,您必须向哪个返回 .然后,您必须将输入流转换为字符串,并将字符串解析为其代表性对象(例如.XML,JSON等)。java.net.HttpURLConnection
javax.net.ssl.HttpsURLConnection
java.net.URLConnection
connection.getInputStream()
InputStream
或者,Apache HttpClient(版本4是最新的)。它比java的默认协议更稳定,更强大,它支持大多数(如果不是全部)HTTP协议(并且可以设置为严格模式)。您的回复仍将存在,您可以如上所述使用它。URLConnection
InputStream
有关 HttpClient 的文档:http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html