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

HttpURLConnection getInputStream太慢

巫马令
2023-03-14

我有一个带有API的网站,我用它来获取JSON数据。我有一个ConnectClass类,每次发送请求时都会创建该类的一个实例。创建ConnectClass的实例时,将创建一个新的HttpURLConnection对象,。setup()ed和。connect()ed:

class ConnectClass  {
        private HttpURLConnection connection;

        private String link;
        private REQUEST_TYPE requestType;
        private URL url;
        private AccessToken accessToken;  

        public String send() throws Exception  {
                connection.connect();
                System.out.println("start get input stream");  //from this
                InputStream input = connection.getInputStream();

                System.out.println("end get input stream");  //to this takes too long

                System.out.println("Start scanner");
                String inputString = new Scanner(input, "UTF-8").useDelimiter("\\Z").next();
                System.out.println("End scanner");
                input.close();

                return inputString;  //returns response JSON string
        }

        public ConnectClass(String link, AccessToken accessToken, REQUEST_TYPE requestType)  throws Exception {
            this.link = link;
            this.accessToken = accessToken;
            this.requestType = requestType;

            this.url = new URL(link);
            connection = (HttpURLConnection)  url.openConnection();
            setup();
        }

        private void setup() throws Exception {
            //connection.setDoOutput(true);
            connection.setConnectTimeout(100);  //doesn't really change things 
            //connection.setChunkedStreamingMode(1024);
            connection.setRequestProperty("charset", "utf-8");
            connection.setRequestProperty("User-Agent", "some description v2.0");

            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            connection.setRequestProperty("Authorization", "Bearer " + accessToken.ACCESS_TOKEN_LONG);
            connection.setRequestMethod("GET");

            connection.setInstanceFollowRedirects(false);
        }
    }

然而,我需要在一个循环中发送10个这样的请求。每个请求大约需要1.3秒,而所有10个请求加起来不应超过1-2秒。我发现大部分时间都花在获取输入流和处理它上:InputStream input=connection。getInputStream() -大约需要0.6-1秒,String inputString=新扫描仪(输入,“UTF-8”)。使用分隔符(\\Z”)。next() 大约需要0.1-0.2秒。

我能做些什么来降低每个请求的时间吗?

我尝试将连接超时设置为100,但没有明显效果。

编辑:响应JSON相当大。connection.set请求属性(“接受编码”,“gzip”);然后使用输入流输入=新的GZIPInputStream(connection.get输入流());有帮助,但它只节省了大约4-5总共三十秒。

我不能使用并发请求——每个新请求都依赖于前一个请求(从以前的输入JSON中获取一个参数,并在一个链接中将其传递到一个新请求中)。


共有1个答案

东门秦迟
2023-03-14

Bellow是您的代码,删除了位以允许编译。Main在Google上执行GET。在我的机器上,发送需要300毫升才能完成。如果你得到一个类似的时间我会建议你检查你的帐户已被设置正确和不被限制例如

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

class ConnectClass {
    private HttpURLConnection connection;

    private String link;
    private URL url;

    public String send() throws Exception {
        connection.connect();
        System.out.println("start get input stream");  //from this
        InputStream input = connection.getInputStream();

        System.out.println("end get input stream");  //to this takes too long

        System.out.println("Start scanner");
        String inputString = new Scanner(input, "UTF-8").useDelimiter("\\Z").next();
        System.out.println("End scanner");
        input.close();


//        System.out.println(inputString);
        return inputString;  //returns response JSON string
    }

    public ConnectClass(String link) throws Exception {
        this.link = link;

        this.url = new URL(link);
        connection = (HttpURLConnection) url.openConnection();
        setup();
    }

    private void setup() throws Exception {
        connection.setDoOutput(true);
        connection.setConnectTimeout(100);  //doesn't really change things
        connection.setRequestProperty("charset", "utf-8");
        connection.setRequestProperty("User-Agent", "some description v2.0");
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

        connection.setRequestMethod("GET");
        connection.setInstanceFollowRedirects(false);
    }


    public static void main(String[] args) throws Exception {

        ConnectClass cc = new  ConnectClass("https://www.google.com");

        long start = System.currentTimeMillis();
        cc.send();
        System.out.println("Done in " + (System.currentTimeMillis() - start));
    }
}

另一种可能性是,你正在收到一个大的响应。如果是这样,您可能希望使用支持压缩的HTTP客户端

 类似资料:
  • 自从我安装了android studio,它从来没有Eclipse快。每当我开始调试时,在设备上开始调试和运行应用程序通常需要1-2分钟。 问题:我想知道如何解决这个问题(安装windows 64位或安装其他类型的android studion或...) 我的系统配置如下所示: 配备Core i5 cpu的笔记本电脑, Windows 8.1 32位 3GB可用RAM Android Studio

  • 以太坊(Ethereum)是一个支持智能合约的区块链平台,它与比特币最大的不同是,以太坊通过一个虚拟机(EVM)可以运行智能合约。 以太坊是Vitalik Buterin(维塔利克·布特林,人称V神)在2013年提出的概念,Vitalik最早参与了比特币社区的开发,并希望比特币把功能受限的脚本扩展成图灵完全的编程环境,但没有得到比特币开发社区的认同,于是他决定另起炉灶,打造一个新的区块链平台,目标

  • 问题内容: 我正在构建JavaFX应用程序,我想知道是否有关于如何尽快加载当前新内容的建议(最佳实践)。 当前我正在做的(或多或少)是这样的: 对于加载简单的s,es等的复杂场景而言,上面的方法对于简单的s BUT 来说足够好且快速。 我在的方法中进行的所有初始化。 在那里,我将项目添加到框中,进行初始化等,但是正如我所说的,这花费了太多时间。 难道我做错了什么?我应该在其他地方初始化吗? 谢谢。

  • 我在新的spring boot应用程序中遇到了一个奇怪的缓慢现象,当我获取一个表用于报告时。 这是一个简单的表,没有对其他表的引用,它有5列。行数为50k。因此,我使用了简单的findAll()方法,该方法在JpaRepository中提供。 当“目标”结果是实体时,findAll()执行需要5分钟。当我设置DTO类投影或接口投影时,执行需要1-2分钟。 我相信对于那么多的数据来说,这仍然太多了。

  • tomcat启动太慢(启动要起半个小时没有打断点)

  • 问题内容: 嗨,我很难理解为什么这不起作用 莫尔斯电码只是一串数字。问题是它说Integer number太大:4545454545,但是我确定Long可以更长。 问题答案: 您需要使用或将其限定为。默认情况下,是文字,超出的范围。 建议使用大写字母以避免混淆,因为和看起来很相似 你可以做 : 要么 根据JLS 3.10.1 : 如果整数文字 以ASCII字母L或l(ell) 为后缀,则其类型为l