Java中的RESTful调用

Java中的RESTful调用,java,rest,Java,Rest,我将用Java进行一个RESTful调用。但是,我不知道怎么打电话。我需要使用URLConnection还是其他?有人能帮我吗。谢谢。有几个RESTful API。我推荐泽西 客户端API文档在这里 更新 OAuth文档在下面评论中的位置是一个死链接,并且已经移动到了这在java中非常复杂,这就是为什么我建议使用Spring的抽象: String result = restTemplate.getForObject( "http://example.com/hotels/{hote

我将用Java进行一个RESTful调用。但是,我不知道怎么打电话。我需要使用URLConnection还是其他?有人能帮我吗。谢谢。

有几个RESTful API。我推荐泽西

客户端API文档在这里

更新

OAuth文档在下面评论中的位置是一个死链接,并且已经移动到了

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

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

  • Spring博客:
  • 弹簧参考:
  • JavaDoc:

如果您只需要从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();
    }
}

如果您从服务提供商(如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);