【发布时间】:2017-01-06 13:29:23
【问题描述】:
我使用 PyQt4 开发了一个桌面客户端,它通过requests lib 连接到我的 Web 服务。你知道,requests 可能是最有用的 http 客户端之一,我想应该没问题。我的桌面客户端工作正常,直到发生奇怪的事情。
我使用以下代码向我的服务器发送请求。
response = requests.get(url, headers = self.getHeaders(), timeout=600, proxies = {}, verify = False)
其中标头仅包含身份验证令牌。
def getHeaders(self, additional = None):
headers = {
'Auth-Token' : HttpBasicClient.UserAuthToken,
}
if additional is not None:
headers.update(additional)
return headers
我无法连接到我的网络服务,所有的 http 请求都弹出相同的错误“'无法连接到代理。',错误(10061,'')”。例如:
获取网址:http://api.fangcloud.com/api/v1/user/timestamp HTTPSConnectionPool(host='api.fangcloud.com', port=443): 最大重试次数超过 url: /api/v1/user/timestamp (由 ProxyError('Cannot connect to proxy.', error(10061, '' )))
这个 API 只返回我服务器的时间戳。当我将 url 复制到具有相同环境的同一台机器上的 Chrome 中时,它会返回正确的响应。但是,我的桌面客户端只能返回错误。请求库有什么问题吗?
我搜索了这个连接错误 10061 的问题(“无法建立连接,因为目标机器主动拒绝了它”)。这可能是由于 Web 服务器的 TCP 连接拒绝造成的。
客户端向服务器发送一个 SYN 数据包,目标是端口(HTTP 为 80)。在端口 80 上运行服务的服务器将以 SYN ACK 响应,但如果不是,它将以 RST ACK 响应。您的客户端到达服务器,但没有到达预期的服务。这是服务器“主动拒绝”连接尝试的一种方式。
但是为什么呢?我的客户端以前可以正常工作,Chrome 仍然可以工作。我的机器上没有使用代理。有什么我想念的吗?
【问题讨论】:
-
分享python代码
-
主要 10061 来自操作系统(不是 Python)——但您提到的 api 在浏览器中运行良好是值得研究的。您是否使用同一系统对其进行了测试?和相同的请求参数?
-
是的,我使用 Postman(Chrome 的 http 客户端插件),填写相同的参数,它也可以正常工作。这是因为操作系统的安全策略吗?
-
您是否使用任何代理?如果不尝试不使用空代理 = {} 参数,也可以使用 urlib2 尝试 - 解决问题
标签: python tcp connection python-requests