问题

我将用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,RESTEasyRestlet

我最熟悉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请求甚至更简单,你也可以指定像实体标签和Acceptheaders这样的东西,但希望这些例子非常有用,但不是太复杂。

如你所见,Restlet和Jersey具有类似的客户端API。我相信它们是在同一时间发展起来的,因此相互影响。

我发现Restlet API更具语义性,因此更清晰,但YMMV。

正如我所说,我对Restlet最熟悉,我已经在很多应用程序中使用它多年了,我对它非常满意。它是一个非常成熟,强大,简单,有效,活跃且受到良好支持的框架。我不能和Jersey或RESTEasy说话,但我的印象是他们都是不错的选择。


#2 热门回答(72 赞)

如果你从服务提供商(例如Facebook,Twitter)呼叫RESTful服务,你可以选择任何风格:

如果你不想使用外部库,则可以使用java.net.HttpURLConnectionjavax.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的RestTemplateabstraction:

String result = 
restTemplate.getForObject(
    "http://example.com/hotels/{hotel}/bookings/{booking}",
    String.class,"42", "21"
);

参考:-春季博客:春季休息3(RestTemplate)

  • Spring Reference:访问客户端上的RESTful服务
  • JavaDoc:RestTemplate

原文链接