问题
我将用Java进行RESTful调用。但是,我不知道如何拨打电话。我是否需要使用URLConnection或其他?谁能帮我。谢谢。
#1 热门回答(127 赞)
**更新:**自从我写下以下答案已经差不多5年了;今天我有不同的看法。
99%的人使用REST这个术语,他们的确意味着HTTP;他们可能不太关心"资源","表示","状态转移","统一界面","超媒体"或任何其他constraints or aspects of the REST architecture style identified by Fielding。因此,各种REST框架提供的抽象是令人困惑和无益的。
所以:你想在2015年使用Java发送HTTP请求。你想要一个清晰,富有表现力,直观,惯用,简单的API。用什么?我不再使用Java,但在过去的几年里,似乎最有前途和最有趣的Java HTTP客户端库是OkHttp。一探究竟。
你可以通过使用URLConnection
或者1HTTPClient来编码HTTP请求,从而与RESTful Web服务进行交互。
然而,通常更期望使用提供专门为此目的而设计的更简单且更具语义的API的库或框架。这使代码更易于编写,读取和调试,并减少了重复工作。这些框架通常实现一些很好的功能,这些功能在低级库中不一定存在或易于使用,例如内容协商,缓存和身份验证。
一些最成熟的选项是Jersey,RESTEasy和Restlet。
我最熟悉Restlet和Jersey,让我们来看看我们如何使用这两种API进行aPOST
请求。
##泽西岛示例
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
headers这样的东西,但希望这些例子非常有用,但不是太复杂。
如你所见,Restlet和Jersey具有类似的客户端API。我相信它们是在同一时间发展起来的,因此相互影响。
我发现Restlet API更具语义性,因此更清晰,但YMMV。
正如我所说,我对Restlet最熟悉,我已经在很多应用程序中使用它多年了,我对它非常满意。它是一个非常成熟,强大,简单,有效,活跃且受到良好支持的框架。我不能和Jersey或RESTEasy说话,但我的印象是他们都是不错的选择。
#2 热门回答(72 赞)
如果你从服务提供商(例如Facebook,Twitter)呼叫RESTful服务,你可以选择任何风格:
如果你不想使用外部库,则可以使用java.net.HttpURLConnection
或javax.net.ssl.HttpsURLConnection
(对于SSL),但这是在java.net.URLConnection
中封装在Factory类型模式中的调用。要获得结果,你将需要connection.getInputStream()
返回给你aInputStream
。然后,你必须将输入流转换为字符串,并将字符串解析为其代表对象(例如XML,JSON等)。
或者,Apache HttpClient(第4版是最新的)。它比java的defaultURLConnection
更稳定,更健壮,并且它支持大多数(如果不是全部)HTTP协议(以及它可以设置为严格模式)。你的回复仍然是InputStream
,你可以按上述方式使用它。
关于HttpClient的文档:http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html
#3 热门回答(24 赞)
这在java中非常复杂,这就是为什么我建议使用Spring的RestTemplate
abstraction:
String result =
restTemplate.getForObject(
"http://example.com/hotels/{hotel}/bookings/{booking}",
String.class,"42", "21"
);
参考:-春季博客:春季休息3(RestTemplate)
- Spring Reference:访问客户端上的RESTful服务
- JavaDoc:RestTemplate