我在UbuntuServer16.04.1(与soundcloud-python一起安装)上使用用于Soundcloud的https://github.com/soundcloud/soundcloud-python。
Soundcloud速率限制官方页面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响应体?
发布于 2016-12-29 13:54:07
你为什么不自己读软件包的源代码,自己找出来呢?
让我看看..。您没有解释您得到了那个client对象,但是我们可以看到有一个"client.py“模块定义了一个Client类。这个类没有明确地定义put方法,但是它定义了钩子:
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(...)返回一个部分对象包装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开始。大量的数据格式化/传递显然是最终的有趣的部分:对response.raise_for_status()的调用。这是一个提示,我们实际上将委托给著名的套餐,它实际上已确认为上面几条线和在需求文件中。
如果我们阅读python-请求精细手册,我们就会发现raise_for_status做了什么--它为客户机(4XX)和服务器(5XX)状态代码引发了一个requests.exceptions.HTTPError。
好了,现在我们知道我们有什么例外。注意到,您的异常和追溯中已经包含了所有这些信息,如果您将其发布在这里,这将为我们节省很多痛苦。
但不管怎样..。看来我们不会得到响应内容了,是吗?嗯,等等,我们还没有完成--python-请求是一个设计得相当好的包,所以我们仍然可以拯救我们的响应。事实上,如果我们查看requests.exceptions源代码,我们会发现HttpError是RequestException的一个子类,而RequestException是带有"request和response对象“的"Initialize(d)”。
万岁,我们确实有自己的反应--例外。因此,我们所要做的就是捕捉异常并检查它的response属性--它应该包含“附加信息”。
现在请理解,这需要我花半个多小时的时间来编写,但是在没有跟踪的情况下,大约要花7分钟的时间--如果有了回溯,它只需要2分钟的时间,就可以转到requests.exceptions源代码,并确保它保持请求和响应。好吧,我作弊了,我习惯于阅读源代码,我经常使用python--请求很多,但是仍然:你可以在不到一个小时的时间内解决这个问题,特别是使用python的交互式shell,它让您能够实时地探索和测试活动对象。
https://stackoverflow.com/questions/41380049
复制相似问题