Java中的RESTful调用
我将用Java进行一个RESTful调用。但是,我不知道怎么打电话。我需要使用URLConnection还是其他?有人能帮我吗。谢谢。有几个RESTful API。我推荐泽西 客户端API文档在这里 更新Java中的RESTful调用,java,rest,Java,Rest,我将用Java进行一个RESTful调用。但是,我不知道怎么打电话。我需要使用URLConnection还是其他?有人能帮我吗。谢谢。有几个RESTful API。我推荐泽西 客户端API文档在这里 更新 OAuth文档在下面评论中的位置是一个死链接,并且已经移动到了这在java中非常复杂,这就是为什么我建议使用Spring的抽象: String result = restTemplate.getForObject( "http://example.com/hotels/{hote
OAuth文档在下面评论中的位置是一个死链接,并且已经移动到了这在java中非常复杂,这就是为什么我建议使用Spring的抽象:
String result =
restTemplate.getForObject(
"http://example.com/hotels/{hotel}/bookings/{booking}",
String.class,"42", "21"
);
参考资料:
- Spring博客:
- 弹簧参考:
- JavaDoc:
/*
* 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();
}
}
如果您从服务提供商(如Facebook、Twitter)调用RESTful服务,您可以选择任何风格: 如果不想使用外部库,可以使用
java.net.HttpURLConnection
或javax.net.ssl.HttpsURLConnection
(对于ssl),但这是封装在java.net.URLConnection
中的工厂类型模式中的调用。
要接收结果,您必须使用connection.getInputStream()
,它将返回一个InputStream
。然后,您必须将输入流转换为字符串,并将字符串解析为其代表对象(例如XML、JSON等)
或者,(第4版是最新版本)。它比java默认的URLConnection
更稳定、更健壮,并且它支持大多数(如果不是全部的话)HTTP协议(并且可以设置为严格模式)。您的响应仍将在InputStream
中,您可以如上所述使用它
关于HttpClient的文档:您可以查看。您可以访问JAX-RS文章 调用就这么简单(引用):
更新:我写下面的答案已经快5年了;今天我有一个不同的观点 99%的时候,当人们使用REST这个术语时,他们实际上是指HTTP;他们可能不太关心“资源”、“表示”、“状态传输”、“统一接口”、“超媒体”或任何其他内容。因此,各种REST框架提供的抽象是混乱的,没有帮助的 所以:您希望在2015年使用Java发送HTTP请求。您需要一个清晰、富有表现力、直观、惯用、简单的API。使用什么?我不再使用Java,但在过去几年中,Java HTTP客户端库似乎是最有前途和最有趣的。看看吧
通过使用
URLConnection
或编写HTTP请求代码,您完全可以与restfulweb服务交互
然而,通常更希望使用一个库或框架,该库或框架提供了一个专门为此目的而设计的更简单、更语义的API。这使代码更易于编写、读取和调试,并减少了重复工作。这些框架通常实现了一些重要特性,这些特性在较低级别的库中不一定存在或不容易使用,例如内容协商、缓存和身份验证
一些最成熟的选择是,和
我最熟悉Restlet和Jersey,让我们看看如何使用这两个API发出POST
请求
泽西岛的例子
Restlet示例
当然,GET请求更简单,您还可以指定实体标记和Accept
头之类的内容,但希望这些示例非常有用,不琐碎,但也不太复杂
如您所见,Restlet和Jersey具有类似的客户端api。我相信它们是在同一时间发展起来的,因此相互影响
我发现restletapi更具语义,因此更清晰,但不太简单
正如我所说,我最熟悉Restlet,多年来我在许多应用程序中使用过它,我对它非常满意。它是一个非常成熟、健壮、简单、有效、活跃且支持良好的框架。我无法与Jersey或RESTEasy通话,但我的印象是,它们都是可靠的选择。我想分享我的个人经验,通过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 quote char, to form a correct JSON string
query=query.replace("'", "\"");
try{
//make connection
URLConnection urlc = url.openConnection();
//It Content Type is so important 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);
}
}
事实上,这“在Java中非常复杂”:
发件人:
您可以这样使用(库还支持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();
}
最简单的解决方案是使用ApacheHTTP客户端库。参考以下示例代码。。 此代码使用基本安全性进行身份验证 添加以下依赖项
我看到了很多答案,这是我们在2020年使用的,顺便说一句,我们将被弃用。(可以检查此项)这取决于您如何在应用程序中执行rest调用。您是否使用JaxRS实现?一个特别的?你是在手动处理请求吗?@Colin Hebert,谢谢你的回复。但我对宁静的呼唤一无所知。你能给我更多关于RESTful调用不同部分的信息吗?签出http RESTful客户端有一些非常好的REST API,我建议使用一个,而不是重新发明轮子。正如我所说:非常复杂。(不,我没有否决,这是一个完全有效的解决方案)@Qwerky客户端API库通常违反REST约束。它们引入了太多的耦合。从长远来看,使用一个好的HTTP库是一个更好的选择。OP不是在创建一个RESTful应用程序,而是在进行RESTful调用,例如调用Twitter API方法资源。@Qwerky-我认为在回答中包括您推荐Jersey的原因会很有帮助。不要重新发明轮子,使用一个现有的RESTful实现。这不是重新发明轮子,我是说你可以使用任何你想要的
flavor
。有些人想要默认的URLConnection
,有些人想要HttpClient
。“无论哪种方式,它都是供您使用的。”精英先生,谢谢您的回复。在检查了所有的
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());
}
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 quote char, to form a correct JSON string
query=query.replace("'", "\"");
try{
//make connection
URLConnection urlc = url.openConnection();
//It Content Type is so important 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);
}
}
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();
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();
}
<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);