有关更快地进行REST客户端调用的提示

时间:2016-02-26 14:02:19

标签: java rest resttemplate urlconnection

我一直在尝试使用Spring的RestTemplate和Java的URLConnection来对外部API进行REST客户端调用。令我感到沮丧的是,循环100次执行相同的REST GET调用(返回一个小的JSON响应),RestTemplate大约需要60秒,URLConnection大约需要53秒。我正在测试这个,因为我的网络应用程序需要通过HTTP GET,PUT& amp; POST所以我试着写这些调用尽可能高效。

我能做些什么来提高下面任何一个代码片段的效率吗?或者是否有另一个被认为是REST客户端高效的库?我想使用RestTemplate,但如果它意味着更快的客户端REST调用,我也可以通过URLConnection更低级别。

也许这是我的错误假设,但我认为对返回小JSON响应的端点进行100次HTTP GET调用将花费不超过10秒。

以下是我一直在尝试的方法(credsProviderrequestFactory& restTemplate在方法之外初始化,并认为这些反复的“新”导致性能问题)

public static String performGetRestRequest(String host, int port, String user, String pass, String endPoint) throws Exception {
    credsProvider.setCredentials(
            new AuthScope(host, port),
            new UsernamePasswordCredentials(user, pass));
    CloseableHttpClient httpclient = HttpClients.custom()
            .setDefaultCredentialsProvider(credsProvider)
            .build();
    requestFactory.setHttpClient(httpclient);

    return restTemplate.getForObject("http://" + host + ":" + port + endPoint, String.class);
}

public static String performGetRestRequestWithPureJava(String host, int port, String endPoint) throws Exception {
    URLConnection connection = new URL("http://" + host + ":" + port + endPoint).openConnection();
    connection.setRequestProperty("Accept-Charset", CHARSET);
    connection.setRequestProperty("Accept", "application/json");

    String inputLine;
    StringBuilder sb = new StringBuilder();

    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), CHARSET));
    while ((inputLine = in.readLine()) != null) {
        sb.append(inputLine);
    }
    in.close();

    return sb.toString();
}

3 个答案:

答案 0 :(得分:1)

在开始优化客户端之前,您应确保实际花费时间。首先,您需要测量服务器花费多少时间来获取请求的答案。你的网络往返次数是多少?这将为您提供更全面的时间图片。

我无法评论Spring的REST模板,因为我从未使用它。但是从URLConnection::getInputStream()返回的流中读取将阻塞,直到服务器端实际发送数据。因此,对performGetRestRequestWithPureJava(..)的呼叫测量“客户端时间”包括网络往返以及服务器提出响应请求所需的时间。

附注:如果您对同一目的地重复发出请求,请不要重复创建新的URLConnection实例并调用openConnection()。而是在连接已经打开的情况下重复使用单个实例。

答案 1 :(得分:0)

使用ASyncTask和URLConnection显然比使用其他库更慢。考虑使用Volley或Retrofit。

查看this文章。

答案 2 :(得分:0)

在库下面使用。它更快,更容易使用

<dependency>
  <groupId>org.asynchttpclient</groupId>
  <artifactId>async-http-client</artifactId>
</dependency>.