我在Ubuntu Server 16.04.1上使用soundcloud-python
https://github.com/soundcloud/soundcloud-python用于Soundcloud API(与pip install soundcloud
一起安装)。
Soundcloud API速率限制官方页面https://developers.soundcloud.com/docs/api/rate-limits#play-requests表示,如果应用超出API速率限制,429 Client Error
响应的正文将是一个JSON对象,其中包含一些其他信息。
我有兴趣获取reset_time
字段,以便在阻止结束时通知用户。
问题是,例如,当超出速率限制时,执行response = client.put('/me/favorites/%d' % song_id)
应用程序崩溃且response
为null
。
如何获得JSON响应正文?
答案 0 :(得分:0)
您为什么不阅读软件包的源代码并自行查找?
让我们看看......你没有解释你得到了client
个对象,但browsing the source code我们可以看到有一个定义Client
类的“client.py”模块。这个类没有明确定义put
方法,但它定义了__getattr__
hook:
def __getattr__(self, name, **kwargs):
"""Translate an HTTP verb into a request method."""
if name not in ('get', 'post', 'put', 'head', 'delete'):
raise AttributeError
return partial(self._request, name, **kwargs)
好的,Client.put(...)
返回partial object包裹Client._request
,这是将Client.put(**kwargs)
定义为return self._request("put", **kwargs)
的一种非常无用的复杂方式。
现在让我们看看Client._request
:它基本上会进行一些健全性检查,更新**kwargs
并返回wrapped_resource(make_request(method, url, kwargs))
。
在模块开头查看导入,我们可以看到make_request
来自“request.py”而wrapped_resource
来自“resources.py”。
你提到在超过速率限制时进行api调用“崩溃了应用程序” - 我认为你的意思是“引发异常”(BTW 请在发现此类问题时发布异常和追溯) - 假设这是在较低级别处理的,那么让我们从request.make_request
开始。很多数据格式化/按摩显然最后the interesting part:调用response.raise_for_status()
。这是一个提示,我们实际上委托给着名的python-requests
package,实际上已确认a few lines above和in the requirements file
如果我们阅读python-requests fine manual,我们就会发现raise_for_status
的作用 - 它会为客户端(4XX)和服务器(5XX)状态代码提出requests.exceptions.HTTPError
。
好的,现在我们知道我们有什么例外。 请注意,您的异常和追溯中已包含所有这些信息,如果您发布了这些信息,这将为我们带来很多痛苦。
但无论如何......看起来我们不会得到回复内容,是吗?好吧,等等,我们还没有完成 - python-requests是一个设计得相当好的软件包,所以很有可能仍然拯救我们的响应。事实上,如果我们查看requests.exceptions source code,我们会发现HttpError
是RequestException
的子类,而RequestException
是“Initialize(d)”with {{{} 1}}和request
个对象。“
华友世纪,我们确实有我们的回应 - 例外。所以我们要做的就是捕获异常并检查它的response
属性 - 它应该包含“附加信息”。
现在请理解,这花了我半个多小时来写,但大约需要7分钟来整理没有追溯 - 回溯它会煮沸只需2分钟,是时候转到requests.exceptions源代码并确保它保持请求和响应。好吧我在作弊,我习惯于阅读源代码并且我经常使用python-requests,但仍然:你可以在不到一个小时内自己解决这个问题,特别是使用python的交互式shell,让你探索和测试实时对象。