【问题标题】:Connection Failed: Timeout for Testing API using Java, Apache HTTP Client连接失败:使用 Java、Apache HTTP 客户端测试 API 超时
【发布时间】:2017-04-12 14:37:53
【问题描述】:

我正在尝试使用 Java 测试 API。我正在使用 Java 8、Apache HTTP 客户端 4.5.3 来测试它。我尝试了许多不同的方法来使用 Java .net 类、Apache HTTP 客户端进行测试,但每次都是同样的问题;

线程“main”中的异常 org.apache.http.conn.HttpHostConnectException:连接到 api.github.com:443 [api.github.com/192.30.253.116, api.github.com/192.30.253.117] 失败:连接超时:连接 在 org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:159)

每次我都抽空。但如果我在浏览器中使用相同的 URL,我会得到结果。

有人可以帮我指出问题吗?是设置问题还是代码问题?

尝试了互联网上几乎所有可用的代码。我是 API 测试的初学者,对 HTTP 工作流程没有深入了解。

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.HttpClientBuilder;

import java.io.IOException;
import java.net.*;

public class API {


    public static void main(String args[]) throws IOException, URISyntaxException {


        HttpUriRequest request = new HttpGet( "https://api.github.com" );

        // When
        HttpResponse response = HttpClientBuilder.create().build().execute( request );

        System.out.println(response.getStatusLine().getStatusCode());
    }
}

使用 Java .net 包

import java.io.IOException;
import java.net.*;

public class API {


    public static void main(String args[]) throws  IOException, URISyntaxException {


        URL url = new URL("http://maps.googleapis.com/maps/api/geocode/json?address=chicago&sensor=false");
        //URL url = uri.toURL();

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Accept", "application/xml");

        if (conn.getResponseCode() != 200) {
            throw new RuntimeException("HTTP error code : "
                    + conn.getResponseCode());
        }

    }
}

【问题讨论】:

    标签: java apache api httpclient


    【解决方案1】:

    如果相同的 URL 在浏览器中有效,那么只有三种可能性。

    1. URL 需要像 User-Agent 这样的标头。您可以像这样设置所需的请求标头: request.setHeader("User-Agent", "Mozilla");

    2. 您处于公司或受限环境中,需要代理才能连接到外部 URL。您的浏览器可能已经设置为使用代理服务器。在这种情况下,您需要将代理凭据传递给 http 客户端 API。

      示例:https://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientProxyAuthentication.java

    3. 您的环境中的所有传出请求都被防火墙或其他东西阻止。在这种情况下,您需要让您的网络管理员允许网络连接。

    【讨论】:

    • 我尝试了 SetHeader 方法但没有用,我得到同样的错误信息。我在 Apache HttpClient 4.5.3 中找不到 getCredentialsProvider 方法。我的公司不允许更改网络连接,但我稍后会在我的个人机器上尝试。希望这会起作用,但前两个选项不起作用。
    • 编辑使用http代理的例子。但是您知道您的环境是否需要代理才能连接到外部 URL?
    • 我检查了我的浏览器设置,我们没有使用任何代理连接外部网络。
    • 如果您使用的是 chrom,请打开开发者控制台,转到网络选项卡。然后试试你的网址。从网络选项卡中,选择您尝试过的网址并复制标题并粘贴到您的问题中。这样我们可以比较浏览器是如何发送请求的。
    • 请求 URL:maps.googleapis.com/maps/api/geocode/… 请求方法:GET 状态码:200 OK 远程地址:170.137.249.117:80 推荐人策略:no-referrer-when-downgrade
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    相关资源
    最近更新 更多