SOUNDCLOUD API:使用soundcloud-python获取错误429的响应正文

时间:2016-12-29 12:48:00

标签: python json api soundcloud

我在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)应用程序崩溃且responsenull

如何获得JSON响应正文?

1 个答案:

答案 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 abovein the requirements file

如果我们阅读python-requests fine manual,我们就会发现raise_for_status的作用 - 它会为客户端(4XX)和服务器(5XX)状态代码提出requests.exceptions.HTTPError

好的,现在我们知道我们有什么例外。 请注意,您的异常和追溯中已包含所有这些信息,如果您发布了这些信息,这将为我们带来很多痛苦。

但无论如何......看起来我们不会得到回复内容,是吗?好吧,等等,我们还没有完成 - python-requests是一个设计得相当好的软件包,所以很有可能仍然拯救我们的响应。事实上,如果我们查看requests.exceptions source code,我们会发现HttpErrorRequestException的子类,而RequestException是“Initialize(d)”with {{{} 1}}和request个对象。“

华友世纪,我们确实有我们的回应 - 例外。所以我们要做的就是捕获异常并检查它的response属性 - 它应该包含“附加信息”。

现在请理解,这花了我半个多小时来,但大约需要7分钟来整理没有追溯 - 回溯它会煮沸只需2分钟,是时候转到requests.exceptions源代码并确保它保持请求和响应。好吧我在作弊,我习惯于阅读源代码并且我经常使用python-requests,但仍然:你可以在不到一个小时内自己解决这个问题,特别是使用python的交互式shell,让你探索和测​​试实时对象。