2016-12-29 3 views
0

Ich benutze soundcloud-pythonhttps://github.com/soundcloud/soundcloud-python für Soundcloud API auf Ubuntu Server 16.04.1 (installiert mit pip install soundcloud). Die offizielle Seite https://developers.soundcloud.com/docs/api/rate-limits#play-requests von Soundcloud API Rate Limits besagt, dass der Körper der 429 Client Error Antwort ein JSON-Objekt ist, das einige zusätzliche Informationen enthält, falls eine App die API-Ratenbeschränkungen überschreitet.SOUNDCLOUD API: get Körper der Antwort für Fehler 429 mit Soundcloud-Python

Ich bin daran interessiert, reset_time Feld, um den Benutzer zu informieren, wenn der Block vorbei sein wird.

Das Problem ist, dass wenn z. B. wie Ratengrenzen überschritten wird, response = client.put('/me/favorites/%d' % song_id) die App stürzt und response ist null.

Wie kann ich den JSON-Antworttext erhalten?

Antwort

0

Warum lesen Sie nicht den Quellcode des Pakets und finden es selbst heraus?

Mal sehen ... Sie nicht erklären bekommen, dass client Objekt, sondern browsing the source code wir ein „client.py“ es gibt Modul, das eine Client Klasse definiert sehen können. Diese Klasse does'nt keine put Methode explizit definieren, aber es definiert die __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) 

Ok, so gibt ein Client.put(...)partial objectClient._request Einwickeln, der ein ziemlich nutzlos gewundener Weg ist Client.put(**kwargs) als return self._request("put", **kwargs) zu definieren.

Nun schauen wir uns Client._request an: es macht im Grunde ein paar Plausibilitätsprüfungen, aktualisiert **kwargs und gibt wrapped_resource(make_request(method, url, kwargs)) zurück.

Wenn Sie die Importe am Anfang des Moduls nachschlagen, können Sie sehen, dass make_request von "request.py" und wrapped_resource von "resources.py" kommt.

Sie erwähnen, dass ein API-Aufruf zu tun, während sie über die Ratenbegrenzung „stürzt die Anwendung“ - ich nehme an, Sie bedeuten „löst eine Exception“ (BTW bitte Post Ausnahmen und Rückverfolgungen, wenn es um solche Probleme saking) - so unter der Annahme dieses Wird auf der unteren Ebene behandelt, beginnen wir mit request.make_request. Eine Menge Daten Formatierung/Massieren natürlich und schließlich the interesting part: ein Anruf an response.raise_for_status(). Dies ist ein Hinweis darauf, dass wir delegieren tatsächlich an den berühmten python-requests package, die eigentlich a few lines above bestätigt und in the requirements file

Wenn wir python-requests fine manual lesen, finden wir heraus, was raise_for_status tut - es hat eine requests.exceptions.HTTPError für Client erhöht (4XX) und Server (5XX) Statuscodes.

Ok jetzt wissen wir, welche Ausnahme wir haben. Beachten Sie, dass Sie alle diese Informationen bereits in Ihrer Exception und Traceback hatten, was uns eine Menge Schmerzen erspart hätte, wenn Sie es gepostet hätten.

Aber wie auch immer ... Es sieht so aus, als würden wir den Antwort-Inhalt nicht bekommen, oder? Nun, warte, wir sind noch nicht fertig - Python-Anfragen sind ein ziemlich gut entworfenes Paket, also sind wir wahrscheinlich immer noch retten unsere Antwort.Und wenn wir requests.exceptions source code ansehen, finden wir heraus, dass HttpError eine Unterklasse von RequestException ist und dass RequestException "Initialize (d)" mit "request und response Objekten" ist.

Hurra, wir haben unsere Antwort - in der Ausnahme. Alles, was wir tun müssen, ist die Exception zu fangen und das response Attribut zu überprüfen - welches die "zusätzlichen Informationen" enthalten sollte.

Jetzt verstehen Sie bitte, dass diese mir mehr nahm als eine halbe Stunde zu Schreib, aber ca. 7 Minuten ausohne Zurückverfolgungs zu sortieren - mit dem Zurückverfolgungs hätte es auf nur 2 Minuten eingekocht, die Zeit um zum Quellcode von requests.exceptions zu gelangen und sicherzustellen, dass die Anfrage und die Antwort eingehalten wurden. Ok, ich betrüge, ich bin gewohnt, Quellcode zu lesen, und ich benutze Python-Anfragen viel, aber immer noch: Sie könnten dies in weniger als einer Stunde selbst gelöst haben, speziell mit Python's interaktiver Shell, die Sie erforschen und testen lassen Live-Objekte in Echtzeit.

+0

es war genau dort in 'response.json()'; reset_time ist in 'response.json() ['errors'] [0] ['release_at']'. Danke für die vollständige Antwort. –