我一直在尝试使用Spring的RestTemplate
和Java的URLConnection
对外部API进行REST客户端调用。我感到沮丧的是,使用RestTemplate
循环100次执行相同的REST GET调用(返回一个小的JSON响应)大约需要60秒,使用URLConnection
大约需要53秒。我正在测试这个,因为我的Web应用程序需要通过HTTP GET、PUT对这个外部API进行多次调用
我可以做些什么来提高下面代码片段的效率吗?或者,是否有另一个库被认为与REST客户机一样高效?我想使用<code>RestTemplate
也许这是我一个错误的假设,但是我认为对一个返回一个小JSON响应的endpoint进行100次HTTP GET调用不会超过10秒。
以下是我一直在尝试的方法(< code>credsProvider,< code>requestFactory
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();
}
使用下面的库。它更快,更容易使用
<dependency>
<groupId>org.asynchttpclient</groupId>
<artifactId>async-http-client</artifactId>
</dependency>.
使用ASyncTask和URLConnection显然比使用其他库慢。考虑使用截击或改装。
看看这篇文章。
在开始优化客户机之前,您应该确保时间确实花在那里。首先,您需要测量服务器响应请求所需的时间。您的网络往返时间是多少?这将为您提供一个更完整的时间方向图。
我无法评论Spring的REST模板,因为我从未使用过它。但是从<code>URLConnection::getInputStream()测量调用<code>PerformGetRequest的“客户端时间”包括网络往返以及服务器响应请求所需的时间。
附带说明:如果您向同一目的地发出重复请求,请不要重复创建新的URLConnection实例并调用openConnection()
。相反,重新使用连接已打开的单个实例。
问题内容: 有了JSR 311及其实现,我们有了一个强大的标准,可以通过REST公开Java对象。但是,在客户端,似乎缺少与SOAP的Apache Axis类似的东西-隐藏了Web服务并将数据透明地封送回Java对象的东西。 您如何创建Java RESTful客户端?使用HTTPConnection和手动解析结果?还是专业客户(例如Jersey或Apache CXR)? 问题答案: 这是一个古老的
我注意到Rest客户端上有两个指南:MicroProfile和Vertx。既然微文件支持异步,那么使用基于Vertx的Rest客户端有什么好处?
我正在尝试创建RESTful web服务,但无法使删除生效,我不确定问题在哪里。我认为问题在客户端项目中,但也可能在服务器项目的资源类中。 我有一个使用这种方法的学生道课,我不认为这是一个问题,因为它适用于其他项目。 我有一个StudentResource类,它是我从包含这段代码的模式中创建的RESTful资源 然后,我创建了一个java项目,并使用此方法创建了名为OneStudent的RESTf
一面5.20 八股: 自我介绍 问项目难点 问项目优化方向 android开发fragment 面向对象编程特点 类和对象区别 重载和重写区别 实现线程安全的方法 读者锁 数组和链表区别 hashmap冲突解决办法 tcp三次握手 tcp如何保证通信稳定 http状态码 手撕: 链表是否有环
在https://KeyCloak.gitbooks.io/server-developer-guide/content/v/2.2/topics/admin-rest-api.html中使用CURL的示例适用于从其Docker映像运行KeyCloak。 为了实现应用程序的最终目标形状,我希望使用客户端ID和机密而不是用户名+密码进行身份验证。 该令牌会导致对admin REST API的调用出现
我有一个运行在Tomcat 8(Windows 10,JRE 1.8.0_111)上的web应用程序,它实现了一个REST客户端,用于与第三部分REST服务(ADLNET xAPI LRS)通信 当我最近在不同的服务器(CentOS、Tomcat8、Java1.8.0.11)上部署该WAR文件时,应用程序会给出一个ClassNotFound异常: java.lang.ClassNotFoundEx