HttpURLConnection 通过代理访问时返回 503 错误

Posted

技术标签:

【中文标题】HttpURLConnection 通过代理访问时返回 503 错误【英文标题】:HttpURLConnection returns 503 error when accessed through proxy 【发布时间】:2012-08-29 05:18:55 【问题描述】:

我正在为在 Brightcove 视频云上托管视频的网站创建视频站点地图。为了从网站上获取所有视频信息,Brightcove 建议从以下表单的 url 中读取响应

http://api.brightcove.com/services/library?token="+accountToken+"&page_size=1&command=find_all_videos&output=JSON&get_item_count=true

url 的输出是 JSON,其中accountToken 只是帐户的标识符。

当我在浏览器中使用 Token 访问上述 url 时,它给了我正确的响应。

我在下面写了程序 sn-p 来读取那个 url

URL jsonURL = new URL("http://api.brightcove.com/services/library?token="+accountToken+"&page_size=1&command=find_all_videos&output=JSON&get_item_count=true");
        HttpURLConnection connection = (HttpURLConnection) jsonURL.openConnection();
        connection.setRequestMethod("GET");
        connection.connect();
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(connection.getInputStream()));
        String lineRead = "";
        while (reader.ready()) 
            lineRead = lineRead + reader.readLine();
        

由于我的浏览器使用代理,我添加了以下代码以包含代理设置

        System.setProperty("http.proxyHost", "my.proxyurl.com");
        System.setProperty("http.proxyPort", "80");

不使用代理设置,它返回java.net.ConnectException: Connection refused: connect,使用代理它给我java.io.IOException: Server returned HTTP response code: 503

所以我的问题是,为什么它给我一个 503(服务不可用)错误?从浏览器看它工作正常。

更新 1: 这似乎是网络的问题。我 ping 了域,它说“请求超时”。虽然通过 HTTP 工作。看起来是防火墙的问题。

【问题讨论】:

@jtahlborn:反向代理。你在什么背景下问这个? 能否提供临时测试账号Token? 可能是袜子代理吗?其他类型的代理? 另外,我会尝试使用像 Wireshark 这样的工具来查看传入和传出的 HTTP 消息——也许它们甚至没有到达代理,或者没有通过它的身份验证等 我已经尝试了您的代码(我也是代理后面的)并且它工作正常,考虑到 Jamshid 的回答中的这两行。再次检查您是否输入了正确的地址和端口,以及您的代理是否已正确配置、没有安全限制等。 【参考方案1】:

我想,这可能是由于您的互联网连接,我已经尝试了您的代码,但没有得到任何 503(Service Unavailable)。检查不同的连接连接(没有代理),它应该可以工作。或者您可以尝试使用稍微不同的方法:

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("host", "port));
conn = new URL(jsonURL).openConnection(proxy);

如果您有 SOCKS 类型代理,请将 Proxy 的构造函数参数更改为 Proxy.Type.SOCKS

【讨论】:

我已经为代理尝试过这种方法......虽然没有尝试使用 Proxy.Type.SOCKS 类型......让我试试,我会告诉你...... 不工作。我得到了java.net.SocketException: Malformed reply from SOCKS server。在没有代理的情况下在不同的连接中尝试它没有意义。我必须让它在需要代理的客户端环境中工作..:( 正如你所说,它看起来像一个网络问题。我已经为我的问题添加了更新。你的答案肯定值得这个赏金。谢谢。【参考方案2】:

对 Jamas 代码的小幅修正

String host="myproxy.com";
int port=8080;
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port));

【讨论】:

以上是关于HttpURLConnection 通过代理访问时返回 503 错误的主要内容,如果未能解决你的问题,请参考以下文章

搭建tomcat服务器,分别通过HttpURLConnection和OkHttp的方式进行网络访问

JavaEE实战——Tomcatweb程序结构Http协议HttpUrlConnection

JavaEE实战——Tomcatweb程序结构Http协议HttpUrlConnection

Android(或者Java)通过HttpUrlConnection向SpringMVC请求数据(数据绑定)

JAVA HTTP连接(HttpURLConnection)中使用代理(Proxy)及其验证(Authentication)

java中常见http client配置代理