调试请求错误
我有一个应用程序,它使用请求来访问一个叫Discogs的API数据库。我想知道在执行.get
命令时,Requests到底请求了哪个网址,这样我就能解决我遇到的问题:
当我手动使用HTTP请求,通过输入以下网址从Discogs获取数据时:
http://api.discogs.com/database/search?type=master&year=2007&format=album&artist=Radiohead
我能收到JSON格式的结果。但是,当我用以下方式使用Requests时:
uri = http://api.discogs.com/database/search
parameters = {'format': 'album', 'year': '2008', 'type': 'master', 'page': 1, 'artist': 'Radiohead'}
headers = (personal information redacted)
requests.get(uri, params=parameters, headers=self._headers)
我没有收到任何结果(这是通过一个Discogs客户端封装器来解析结果并将其返回为对象的——解析部分我没有包含在这段代码中,似乎运行得很好,所以我把问题锁定在Requests上)。
有没有人能告诉我我的.get
请求哪里出错,或者告诉我如何使用Requests来生成它实际请求的网址(包括参数),这样我就可以自己调试了?
2 个回答
1
requests
库是用来发送网络请求的,它内部使用了urllib3
库,而urllib3
又使用了Python自带的logging
库来记录调试信息。下面的配置可以让你看到具体发送了哪些请求:
import logging
logging.basicConfig(level=logging.DEBUG)
这个配置是为了让logging
模块在标准错误输出(stderr)上显示调试级别的信息(以及更高级别的信息)。
当我运行你提供的示例网址和参数时,我看到:
>>> import logging
>>> import requests
>>> logging.basicConfig(level=logging.DEBUG)
>>> uri = 'http://api.discogs.com/database/search'
>>> parameters = {'format': 'album', 'year': '2008', 'type': 'master', 'page': 1, 'artist': 'Radiohead'}
>>> r = requests.get(uri, params=parameters)
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): api.discogs.com
DEBUG:requests.packages.urllib3.connectionpool:"GET /database/search?artist=Radiohead&year=2008&type=master&page=1&format=album HTTP/1.1" 200 379
>>> r.json()
{u'pagination': {u'per_page': 50, u'items': 1, u'pages': 1, u'urls': {}, u'page': 1}, u'results': [{u'style': [u'Experimental', u'Indie Rock'], u'thumb': u'http://api.discogs.com/image/R-90-1379425-1214572945.jpeg', u'format': [u'File', u'MPEG-4', u'Album', u'Copy Protected'], u'country': u'UK', u'title': u'Radiohead - In Rainbows - From The Basement', u'uri': u'/Radiohead-In-Rainbows-From-The-Basement/master/97298', u'label': [u'_Xurbia_Xendless Limited'], u'catno': u'none', u'year': u'2008', u'genre': [u'Electronic', u'Rock'], u'resource_url': u'http://api.discogs.com/masters/97298', u'type': u'master', u'id': 97298}]}
所以对我来说,在没有额外设置请求头的情况下,这个网址确实是按预期工作的。
2
在发送请求之前,你可以先对它进行准备
,这样你就可以检查一下请求的内容。
req = requests.Request(url=uri, params=params, headers=headers)
prep = req.prepare()
print(prep.url)
打印出
http://api.discogs.com/database/search?year=2008&type=master&page=1&format=album&artist=Radiohead´