2013-10-03 4 views
5

Ich verwende das Ruby-Juwel rest-client (1.6.7), um Daten mit HTTP-GET-Anforderungen abzurufen. Manchmal sind die Antworten jedoch größer, als ich behandeln möchte. Daher möchte ich, dass die RestClient den Lesevorgang stoppt, sobald sie eine von mir festgelegte Größenbeschränkung überschreitet. Die documentation sagtBegrenzte Größe der Antwort gelesen von Rest-Client

Für Fälle nicht durch die allgemeine API abgedeckt sind, können Sie die Anfrage Klasse :: RestClient verwenden, die einen niedrigeren Level-API zur Verfügung stellen.

aber ich sehe nicht, wie das mir hilft. Ich sehe nichts, was aussieht wie ein Haken, um den eingehenden Datenstrom zu verarbeiten, nur Operationen, die ich ausführen könnte, nachdem das Ganze gelesen wurde. Ich möchte keine Zeit und keinen Speicher verschwenden, um eine große Antwort in einen Puffer zu schreiben, nur um sie zu verwerfen.

Wie kann ich einen Grenzwert für die Datenmenge festlegen, die von RestClient in einer GET Anfrage gelesen wird? Oder gibt es einen anderen Client, den ich verwenden kann, der es einfach macht, ein solches Limit festzulegen?

+1

Können Sie nicht einfach 'Content-Length' Header verwenden, um die Antwortgröße zu überprüfen, und dann entscheiden, ob Sie fortfahren möchten? – EdvardM

Antwort

2

rest-Client verwendet Ruby Net :: HTTP unter: https://github.com/rest-client/rest-client/blob/master/lib/restclient/request.rb#L303

Leider ist es nicht wie Net scheinen :: HTTP finden Sie Antwort auf der Grundlage ihrer Länge verlassen lassen, wie es verwendet wird, nachdem alle, diese Methode um alle Anforderungen ausgeben: http://docs.ruby-lang.org/en/2.0.0/Net/HTTP.html#method-i-transport_request

wie Sie sehen können, verwendet es Httpresponse eine HTTP-Antwort vom Server zu lesen: http://ruby-doc.org/stdlib-2.0.0/libdoc/net/http/rdoc/Net/HTTPResponse.html#method-i-read_body

Httpresponse scheint der Ort, wo Sie kontrollieren können, ob alle Antwort und sto lesen re in Erinnerung, oder lesen und wegwerfen. Ich möchte nicht einmal die Antwort lesen, ich denke, Sie müssen den Sockel schließen.

Ich weiß nicht, ob es Rest-Clients mit Funktionalität gibt, die Sie benötigen. Ich schätze, du musst deinen eigenen kleinen Rest-Client schreiben, wenn du so eine feinkörnige Kontrolle haben willst.

+0

Ich habe etwas mehr Zeit, um den Code zu lesen. Sie können ': raw_response => true' verwenden und in diesem Fall können Sie den Körper der Antwort in Blöcken verarbeiten. https://github.com/rest-client/rest-client/blob/883903f5e5ae6c894db4e1271b3236301d881ee1/lib/restclient/request.rb#L553 Beachten Sie, dass der Körper trotzdem gespeichert wird. Wenn Sie aufhören wollen, die Antwort zu lesen, müssen Sie die 'fetch_body' Methode hacken, um Stücke wegzuwerfen, ohne sie irgendwo zu schreiben. – Timmy

Verwandte Themen