Java中的RESTful调用

问题描述

如果从服务提供商(例如Facebook,Twitter)调用RESTful服务,则可以选择以下任意一种方式:

如果您不想使用外部库,则可以使用java.net.HttpURLConnectionjavax.net.ssl.HttpsURLConnection(对于SSL),但这是封装在中的Factory类型模式中的调用java.net.URLConnection。要接收结果,您必须connection.getInputStream()返回InputStream。然后,您将必须将输入流转换为字符串,然后将字符串解析为其代表对象(例如XML,JSON等)。

另外,Apache HttpClient(最新版本为4)。它比java的默认值更稳定和健壮URLConnection,并且支持大多数(如果不是全部)HTTP协议(以及可以设置为严格模式)。您的回复仍然会收到InputStream,您可以按照上述方式使用它。

153

更新:自从我在下面写下答案以来已经快5年了;今天我有不同的看法。

人们有99%的时间使用术语REST,实际上是HTTP。他们可能不太关心Fielding识别的“资源”,“表示形式”,“状态转移”,“统一接口”,“超媒体”或REST体系结构样式的任何其他约束或方面。因此,各种REST框架提供的抽象令人困惑且无益。

因此:您想在2015年使用Java发送HTTP请求。您想要一个清晰,表达,直观,习惯,简单的API。使用什么?我不再使用Java,但是在过去的几年中,似乎最有前途和最有趣的Java HTTP客户端库是OkHttp。一探究竟。

您绝对可以通过使用URLConnection或HTTPClient编码HTTP请求来与RESTful Web服务进行交互。

但是,通常更希望使用一个库或框架来提供专门为此目的设计的更简单,更语义化的API。这使代码更易于编写,阅读和调试,并减少了重复劳动。这些框架通常实现一些很棒的功能,这些功能不一定在低级库中存在或易于使用,例如内容协商,缓存和身份验证。

一些最成熟的选项是Jersey,RESTEasy和Restlet。

我最熟悉Restlet和Jersey,让我们看看如何POST使用这两个API发出请求。

Jersey Example

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());
}

Restlet示例

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最为熟悉,我已经在许多应用程序中使用了多年,对此我感到非常满意。这是一个非常成熟,健壮,简单,有效,活跃且得到良好支持的框架。我无法与Jersey或RESTEasy通话,但我的印象是它们都是不错的选择。

解决方法

我将用Java进行RESTful调用。但是,我不知道如何拨打电话。我是否需要使用URLConnection或其他?谁能帮我。谢谢。

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”