Java中的RESTful调用
我将在Java中进行一个RESTful调用。 但是,我不知道如何打电话。 我需要使用URLConnection还是其他? 任何人都可以帮助我 谢谢。
如果您要从服务提供商(例如Facebook,Twitter)调用RESTful服务,则可以使用您所select的任何风格进行操作:
如果您不想使用外部库,则可以使用java.net.HttpURLConnection
或javax.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。 我会推荐泽西岛;
客户端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();
- mysql准备的语句错误:MySQLSyntaxErrorException
- 检测TableView JavaFX行上的doubleclick
- 如何告诉Eclipse当我比较string==而不是.equals()时提醒我
- 类是一个原始types。 genericstypes<T>的引用应该被参数化
- 如何删除Java Servlet中的Cookie
- 在Java中获取集合的powerset
- 事务隔离级别与表上的locking关系
- 在ArrayList上操作时,AbstractList.remove()中的UnsupportedOperationException
- 使用Jackson的ObjectMapper的JSON对象的顺序