如何在java中以有效的方式进行多个API调用

Posted

技术标签:

【中文标题】如何在java中以有效的方式进行多个API调用【英文标题】:How to make multiple API calls in a efficient way in java 【发布时间】:2017-10-14 05:27:55 【问题描述】:

我有一个 10 万用户的列表。我必须遍历列表并对服务器进行 API 调用以获取结果。每次我创建一个新的 URL 连接并进行 APi 调用,然后在我读取输入流后关闭连接,但这会花费太多时间。

有没有优化的方法,比如多次使用同一个 URL 连接实例而不是关闭它?还是换个第三方库会提高执行速度?

我在循环中调用以下方法来获取输出。

private String getOutput(String loginName) 
    String responseStatus = null;
    HttpURLConnection connection = null;

    try 
        URL url= new URL(<<https://api.junk.123.com/output>>);

        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("apikey", "authentication key");
        connection.setUseCaches(false);
        connection.setDoOutput(true);

        //Send request
        try(DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()))
            JsonObject jsonParam = new JsonObject();
            jsonParam.putString("loginName", "loginName");
            outputStream.writeBytes(jsonParam.toString());
            outputStream.flush();
        

        //Get response

        InputStream inputStream;
        if(connection.getResponseCode() == HttpURLConnection.HTTP_OK)
            inputStream = connection.getInputStream();
         else 
            inputStream = connection.getErrorStream();
        
        if(null == inputStream)
            return String.valueOf(connection.getResponseCode());
        

        StringBuilder response = new StringBuilder();
        try (BufferedReader inputBuffer = new BufferedReader(new InputStreamReader(inputStream))) 
            String line;
            while (null != (line = inputBuffer.readLine())) 
                response.append(line);
                response.append("\r");
            
        

        JsonObject jsonObject = new JsonObject(response.toString());
        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) 
            responseStatus = "success";
         else 
            responseStatus = String.valueOf(connection.getResponseCode()) + jsonObject.getString("errorMessage") ;
        
     catch (MalformedURLException e) 
        logger.error("Malformed URL exception occurred while calling the API", entry.getKey(), e);
     catch (IOException e) 
        logger.error("Creation of connection failed while calling the API", entry.getKey(), e);
     catch (Exception e) 
        logger.error("Error occurred  while calling the API", entry.getKey(),  e);
     finally 
        if (null != connection)
            connection.disconnect();
        
    
    return responseStatus;

【问题讨论】:

您必须使用后台任务。 James Z 感谢您的编辑。 【参考方案1】:

本问答说明 HTTP 持久连接是由 HttpURLConnection 在幕后实现的:

Persistent HttpURLConnection in Java

但是,这可能还不够。如果您使用单个客户端线程进行获取,您将受到请求的往返时间的限制;即,在第一个请求的结果返回给您之前,您不能开始第二个请求。您可以通过使用多个客户端线程来解决这个问题……在一定程度上……。

但是(#2)并行发送多个请求也有其局限性。超过某个点,您将使客户端、服务器或网络饱和。此外,一些服务器具有限制机制来限制客户端可以发出的请求数。

获得最大吞吐量的方法是重新设计 API,以便单个请求可以获取多个用户的信息。

【讨论】:

以上是关于如何在java中以有效的方式进行多个API调用的主要内容,如果未能解决你的问题,请参考以下文章

我需要构建一个休息客户端,以便在 Java 中以最佳性能进行 10k 次休息 api 调用/执行应用程序。任何有用的链接都会有所帮助

在 Python 的 REST API 程序中以多进程方式调用方法而苦苦挣扎

在整个应用程序中以角度进行连续 api 调用的最佳位置

如何使用 FOR json API 调用将图像保存在 mysql 数据库中以进行移动应用程序开发?

如何在 Java 中以编程方式合并 EMF 模型?

如何使用 redux 和 redux-promise 将多个 axios 调用合并到一个有效负载中?