在我的 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)
到目前为止我尝试过但对我不起作用的方法:
- 我已经使用 API 的接口(覆盖)来处理 HttpConnection 并手动创建 InputStream。通过此接口,可以将一些代理选项添加到 HttpConnection。 (接口名为 GSAClientDelegate,方法为 getResponseStream)
- 我检查了 API 的代码,以防发现导致代理问题等的问题。我找不到类似的东西。
- 如回答所述,我检查了集合、前端、代理样式表名称,它们都没有问题。否则我无法通过网络浏览器或独立的 Java 项目获得结果,对吗?
已经将近 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,但它可能会在不询问的情况下正确编码。
我在基于 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)
到目前为止我尝试过但对我不起作用的方法:
- 我已经使用 API 的接口(覆盖)来处理 HttpConnection 并手动创建 InputStream。通过此接口,可以将一些代理选项添加到 HttpConnection。 (接口名为 GSAClientDelegate,方法为 getResponseStream)
- 我检查了 API 的代码,以防发现导致代理问题等的问题。我找不到类似的东西。
- 如回答所述,我检查了集合、前端、代理样式表名称,它们都没有问题。否则我无法通过网络浏览器或独立的 Java 项目获得结果,对吗?
已经将近 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,但它可能会在不询问的情况下正确编码。