Java中的RESTful调用

我将在Java中进行一个RESTful调用。 但是,我不知道如何打电话。 我需要使用URLConnection还是其他? 任何人都可以帮助我 谢谢。

如果您要从服务提供商(例如Facebook,Twitter)调用RESTful服务,则可以使用您所select的任何风格进行操作:

如果您不想使用外部库,则可以使用java.net.HttpURLConnectionjavax.net.ssl.HttpsURLConnection (对于SSL),但这是在java.net.URLConnection中以Factorytypes模式封装的调用。 要接收结果,你将不得不connection.getInputStream()返回给你一个InputStream 。 您将不得不将inputstream转换为string,并将stringparsing为其代表对象(如XML,JSON等)。

或者, Apache HttpClient (版本4是最新的)。 它比java默认的URLConnection更加稳定和健壮,它支持大多数(如果不是全部的话)HTTP协议(以及它可以被设置为严格模式)。 你的回应仍然在InputStream ,你可以像上面提到的那样使用它。


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

更新:我写了下面的答案已经差不多5年了。 今天我有不同的观点。

当人们使用REST这个术语时,有99%的时间是HTTP; 他们可能不太关心“资源”,“表示”,“状态转移”,“统一接口”,“超媒体”,或者由Fielding标识的REST架构风格的任何其他约束或方面 。 由各种REST框架提供的抽象因此是混乱和无益的。

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


通过使用URLConnection或HTTPClient来编写HTTP请求,您肯定可以与RESTful Web服务交互。

但是,通常更希望使用一个库或框架,它提供了一个更为简单和更具语义的API,专门用于此目的。 这使代码更易于编写,读取和debugging,并减less重复工作。 这些框架通常实现一些很好的function,这些function在内容协商,caching和authentication等低级库中不一定存在或不易使用。

一些最成熟的选项是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()); } 

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非常熟悉,在很多应用程序中已经使用了很多年,对此我感到非常满意。 这是一个非常成熟,健壮,简单,有效,积极和支持良好的框架。 我不能说泽西岛或RESTEasy,但我的印象是,他们都是坚实的select。

如果您只需要简单地调用Java的REST服务,则可以使用这些行中的内容

 /* * Stolen from http://xml.nig.ac.jp/tutorial/rest/index.html * and http://www.dr-chuck.com/csev-blog/2007/09/calling-rest-web-services-from-java/ */ import java.io.*; import java.net.*; public class Rest { public static void main(String[] args) throws IOException { URL url = new URL(INSERT_HERE_YOUR_URL); String query = INSERT_HERE_YOUR_URL_PARAMETERS; //make connection URLConnection urlc = url.openConnection(); //use post mode urlc.setDoOutput(true); urlc.setAllowUserInteraction(false); //send query PrintStream ps = new PrintStream(urlc.getOutputStream()); ps.print(query); ps.close(); //get result BufferedReader br = new BufferedReader(new InputStreamReader(urlc .getInputStream())); String l = null; while ((l=br.readLine())!=null) { System.out.println(l); } br.close(); } } 

这在java中非常复杂,这就是为什么我会build议使用Spring的RestTemplate抽象:

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

参考:

  • 春季博客:春季rest3(RestTemplate)
  • Spring参考: 访问客户端上的RESTful服务
  • JavaDoc: RestTemplate

有几个RESTful API。 我会推荐泽西岛;

https://jersey.java.net/

客户端API文档在这里;

https://jersey.java.net/documentation/latest/index.html

更新
以下评论中OAuth文档的位置是一个无效链接,并已转移到https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334

你可以看看CXF 。 您可以在这里访问JAX-RS文章

调用就像这样简单(引用):

 BookStore store = JAXRSClientFactory.create("http://bookstore.com", BookStore.class); // (1) remote GET call to http://bookstore.com/bookstore Books books = store.getAllBooks(); // (2) no remote call BookResource subresource = store.getBookSubresource(1); // {3} remote GET call to http://bookstore.com/bookstore/1 Book b = subresource.getDescription(); 

我想分享我的个人经验,用Post JSON调用来调用REST WS:

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.URL; import java.net.URLConnection; public class HWS { public static void main(String[] args) throws IOException { URL url = new URL("INSERT YOUR SERVER REQUEST"); //Insert your JSON query request String query = "{'PARAM1': 'VALUE','PARAM2': 'VALUE','PARAM3': 'VALUE','PARAM4': 'VALUE'}"; //It change the apostrophe char to double colon char, to form a correct JSON string query=query.replace("'", "\""); try{ //make connection URLConnection urlc = url.openConnection(); //It Content Type is so importan to support JSON call urlc.setRequestProperty("Content-Type", "application/xml"); Msj("Conectando: " + url.toString()); //use post mode urlc.setDoOutput(true); urlc.setAllowUserInteraction(false); //send query PrintStream ps = new PrintStream(urlc.getOutputStream()); ps.print(query); Msj("Consulta: " + query); ps.close(); //get result BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream())); String l = null; while ((l=br.readLine())!=null) { Msj(l); } br.close(); } catch (Exception e){ Msj("Error ocurrido"); Msj(e.toString()); } } private static void Msj(String texto){ System.out.println(texto); } } 

最简单的解决scheme将使用Apache HTTP客户端库。 请参阅下面的示例代码..此代码使用基本安全进行身份validation。

添加以下依赖项。

 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4</version> </dependency> 
 CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); Credentials credentials = new UsernamePasswordCredentials("username", "password"); credentialsProvider.setCredentials(AuthScope.ANY, credentials); HttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider).build(); HttpPost request = new HttpPost("https://api.plivo.com/v1/Account/MAYNJ3OT/Message/");HttpResponse response = client.execute(request); // Get the response BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line = ""; while ((line = rd.readLine()) != null) { textView = textView + line; } System.out.println(textView); 

您可以使用Async Http Client (该库也支持WebSocket协议):

  String clientChannel = UriBuilder.fromPath("http://localhost:8080/api/{id}").build(id).toString(); try (AsyncHttpClient asyncHttpClient = new AsyncHttpClient()) { BoundRequestBuilder postRequest = asyncHttpClient.preparePost(clientChannel); postRequest.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); postRequest.setBody(message.toString()); // returns JSON postRequest.execute().get(); } 

事实上,这在Java中是非常复杂的:

来自: https : //jersey.java.net/documentation/latest/client.html

 Client client = ClientBuilder.newClient(); WebTarget target = client.target("http://foo").path("bar"); Invocation.Builder invocationBuilder = target.request(MediaType.TEXT_PLAIN_TYPE); Response response = invocationBuilder.get();