Java 中的 RESTful 调用

新手上路,请多包涵

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

原文由 Questions 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 657
2 个回答

如果您从服务提供商(例如 Facebook、Twitter)调用 RESTful 服务,您可以选择任何 _风格_:

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

或者, Apache HttpClient (版本 4 是最新的)。它比 java 的默认 URLConnection 更稳定和健壮,并且它支持大多数(如果不是全部)HTTP 协议(以及它可以设置为严格模式)。您的回复仍将在 InputStream 中,您可以如上所述使用它。


HttpClient 文档:http: //hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html

原文由 Buhake Sindi 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

当人们使用术语 REST 时,99% 的时间他们真正指的是 HTTP;他们可能不太关心“资源”、“表示”、“状态传输”、“统一接口”、“超媒体”或 Fielding 确定的 REST 架构风格的任何其他约束或方面。因此,各种 REST 框架提供的抽象令人困惑且毫无帮助。

所以:你想在 2015 年使用 Java 发送 HTTP 请求。你想要一个清晰、富有表现力、直观、惯用、简单的 API。用什么?我不再使用 Java,但在过去的几年里,看起来最有前途和最有趣的 Java HTTP 客户端库是 OkHttp 。看看这个。


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

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

一些最成熟的选择是 JerseyRESTEasyRestlet

我最熟悉 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());
}

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 交谈,但我的印象是它们都是不错的选择。

原文由 Avi Flax 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题