Curl工作,但不是Python请求

yduiuuwa  于 12个月前  发布在  Python
关注(0)|答案(5)|浏览(118)

我试图从http://erdos.sdslabs.co/users/shagun.json获取JSON响应。使用浏览器/Python的Requests库会导致身份验证错误,但curl似乎工作正常。

curl http://erdos.sdslabs.co/users/shagun.json

字符串
返回JSON响应。
为什么curl请求可以正常工作,而普通浏览器或基于请求的请求会失败?

kh212irz

kh212irz1#

使用telnet检查:

$ telnet erdos.sdslabs.co 80
Trying 62.141.37.215...
Connected to erdos.sdslabs.co.
Escape character is '^]'.
GET http://erdos.sdslabs.co/users/shagun.json HTTP/1.0

HTTP/1.1 302 Found
Date: Sat, 26 Jul 2014 11:18:58 GMT
Server: Apache
Set-Cookie: PHPSESSID=juvg7vrg3vs4t00om3a95m4sc7; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: /login
Access-Control-Allow-Origin: http://erdos.sdslabs.co
X-Powered-By: PleskLin
Content-Length: 1449
Connection: close
Content-Type: application/json

{"email":"sshagun.so[email protected]","username":"shagun","name":"Shagun      
[...]

字符串
我们看到web服务器响应一个302 - a重定向到Location /login。请求和web浏览器都遵守这个命令,并到达登录提示符。然而,我们看到web服务器 * 也 * 响应你想要的json,curl(和telnet)足够简单,只接受这些数据。
最佳做法是修复Web服务器,使其不需要您登录,或者在要求用户登录的同时不给予受密码保护的数据。
如果你不能改变web服务器,你可以告诉requests模块忽略重定向:

import requests
result = requests.get('http://erdos.sdslabs.co/users/shagun.json', allow_redirects=False)
print result.content

qjp7pelc

qjp7pelc2#

对于像我这样的谷歌人来说:
在我的例子中,问题是我使用requests.get(url, data={...})提供了url参数。在将其更改为requests.get(url, params={...})后,问题就解决了。

vltsax25

vltsax253#

如果您在环境中配置了代理,请在会话/请求中也定义它。
以session为例:

my_proxies = {  
        'http': 'http://myproxy:8080',  
        'https': 'https://myproxy:8080'  
    }

    session = requests.Session()  
    request = requests.Request('POST', 'http://my.domain.com', data=params_template, headers=req_headers, proxies=my_proxies)  
    prepped = session.prepare_request(request)  
    response = session.send(prepped)

字符串
参见文档:
请求http://docs.python-requests.org/en/master/user/quickstart/
会话http://docs.python-requests.org/en/master/user/advanced/

jbose2ul

jbose2ul4#

我有过这样的经历,一些python请求代码在前一天工作了,第二天却没有回来,而curl仍然工作。这不是代码,也不是服务器,阅读这篇讨论让我意识到连接中的某些东西可能发生了变化。我禁用并重新启用了我的Wifi,你看,它又工作了。
我没有进一步调查,请求可能已经缓存了一些不再有效的东西。很抱歉这个不合格的输入,但也许它会帮助那里的人。

kokeuurv

kokeuurv5#

为了将来的参考,同样的问题,但由于netrc文件。Python请求库决定覆盖授权头,如果找到一个netrc匹配条目。https://requests.readthedocs.io/en/latest/user/authentication/#netrc-authentication

相关问题