我一直在尝试使用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秒。
以下是我一直在尝试的方法(credsProvider
,requestFactory
& 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();
}
答案 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>.