当前位置: 首页 > 知识库问答 >
问题:

加快REST客户端调用的提示

戈睿识
2023-03-14

我一直在尝试使用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();
}

共有3个答案

胡飞舟
2023-03-14

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

<dependency>
  <groupId>org.asynchttpclient</groupId>
  <artifactId>async-http-client</artifactId>
</dependency>.
方恺
2023-03-14

使用ASyncTask和URLConnection显然比使用其他库慢。考虑使用截击或改装。

看看这篇文章。

越飞翮
2023-03-14

在开始优化客户机之前,您应该确保时间确实花在那里。首先,您需要测量服务器响应请求所需的时间。您的网络往返时间是多少?这将为您提供一个更完整的时间方向图。

我无法评论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

  • 在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