在我的 Spring 项目中尝试获取 InputStream 时出现 Http 502 错误

Http 502 Error when trying to get InputStream in my Spring Project

我在基于 Spring 的 Web 项目中使用第三方 Java API 从 Google Search Appliance 获取结果。 URL API 构造似乎是正确的。我已经通过 API 生成的 URL 在 Web 浏览器上发送了一个请求并且它有效(搜索结果正确返回)。此外,我已经尝试使用 URL 和我创建的独立 Java 项目来获取 InputStream,它也能正常工作。当我尝试在我的项目中获得结果时,问题就出现了。它在创建 InputStream 阶段崩溃并给出此错误:

java.io.IOException: Server returned HTTP response code: 502 for URL: http://myIP:80/search?access=p&output=xml&client=default_frontend&lr=lang_en&num=100&requiredfields=gsaentity_language%3AEnglish&site=default_site
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626)
    at java.net.URL.openStream(URL.java:1037)
    at net.sf.gsaapi.GSAClient.search(Unknown Source)
    at net.sf.gsaapi.GSAClient.getGSAResponse(Unknown Source)
    at net.sf.gsaapi.GSAClient.getGSAResponse(Unknown Source)

到目前为止我尝试过但对我不起作用的方法:

已经将近 1 周了,我一直面对这个恼人而神秘的错误,我开始发疯了。

关于这个问题我能做些什么?

首先,这是一个 5xx error,因此问题(通常)不在您控制的任何系统上。如果您一直收到此错误,则说明与您交互的第三方 API 提供商存在技术问题,您应该尽快与他们联系。

由于您可能正在经历 a gateway or proxy,请考虑使用直接连接到您需要的资源。

您很可能在查询的参数中输入了错误。

502 错误通常意味着您尝试加载前端(因此请检查客户端/proxystylesheet 参数)或集合(检查参数站点。default_site?真正的默认值是 default_collection 如果您没有t made a new one) that doesn't exist.

我终于弄清楚了问题的根源。就是因为java.net.HttpUrlConnectionAPI。它使用共享连接工厂,这可能会导致这样的错误。我已将其替换为 Apache HttpClient。没有出现问题:

    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    .........
public InputStream getConnectionStream(String fullUrl){
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(fullUrl);
        HttpResponse response = client.execute(request);
        InputStream is = response.getEntity().getContent();

        return is;
}

我也遇到了这个问题,结果证明我只是忘记在 URL 中编码 space(浏览器会自动为您完成)。将 space 替换为 %20 就可以了…… 我没有尝试使用 HttpClient,但它可能会在不询问的情况下正确编码。