首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UrlConnection API调用在第一次调用时花费的时间要多得多,然后它可以与curl.exe或postman进行比较。

UrlConnection API调用在第一次调用时花费的时间要多得多,然后它可以与curl.exe或postman进行比较。
EN

Stack Overflow用户
提问于 2022-01-12 12:56:49
回答 2查看 256关注 0票数 0

我已经注意到,如果第一次通过Java (URLConnection、Apache或OKHttp)调用api,需要花费更多的时间。对于随后的电话,时间要短得多。

虽然邮递员或curl.exe花费的时间非常少(与java的第二次迭代相比)

对我的机器来说,第一次的开销大约是2秒。但是在一些机器上,这是第一次上升到5-6秒左右。此后,往返时间约为300 ms。

下面是我的示例代码:

代码语言:javascript
复制
public static String DoPostUsingURLConnection(String s_uri) throws Exception {
        try {
            URL uri = new URL(s_uri);
            HttpURLConnection connection = (HttpURLConnection) uri.openConnection();
            // Logger.log("Opened Connection");
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            connection.setRequestProperty("Authorization", authorizationHeader);

            // Create the Request Body
            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonRequestBody.getBytes("utf-8");
                os.write(input, 0, input.length);
            }

            // Logger.log("Written Output Stream");

            int responseCode = connection.getResponseCode();
            InputStream is = null;
            if (responseCode == HttpURLConnection.HTTP_OK)
                is = connection.getInputStream();
            else
                is = connection.getErrorStream();

            BufferedReader in = new BufferedReader(new InputStreamReader(is));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine).append("\n");
                ;
            }
            in.close();

            return response.toString();

        } catch (Exception ex) {
            return ex.getMessage();
        } finally {
            // Logger.log("Got full response");
        }
EN

回答 2

Stack Overflow用户

发布于 2022-01-13 13:22:31

您可以通过记录OkHttp连接事件来调查所花费的时间。https://square.github.io/okhttp/events/

如果您正在获得一个IPv4地址和IPv6,而其中一个是超时,另一个是成功的,则这将特别重要。

票数 1
EN

Stack Overflow用户

发布于 2022-01-12 14:22:19

这只是猜测而已。但是Http连接的工作方式是,当您第一次调用它时,连接就建立了,这需要时间。在此之后,Http协议在一段时间内不会真正关闭连接,因为期望会有更多的请求出现,并且连接可以被重用。实际上,在您的情况下,您发送的后续请求重用先前创建的连接,而不是重新建立连接,这是扩展性的。我已经编写了自己的开源库,其中包含了一个简单的Http客户端。我注意到了同样的效果,第一次请求比随后的请求花费更长的时间。但这并不能解释为什么在邮递员和卷发中我们看不到同样的效果。无论如何,如果你想解决这个问题,而且你事先知道你的URL,在你的应用程序初始化时发送一个请求(你甚至可以在单独的线程中这样做)。这会解决你的问题。

如果您有兴趣看我的库,这里是Javadoc链接。您可以在github 这里和github 这里上找到它。关于这里部分特性列表的库的文章

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70681962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档