Faraday: response.body ist ASCII-8BIT, wenn Content-Type text/xml ist; Zeichensatz=utf-8

Erstellt am 16. Apr. 2012  ·  9Kommentare  ·  Quelle: lostisland/faraday

Ich benutze Faraday zum ersten Mal, also mache ich vielleicht Dinge falsch, aber die response.body Codierung im Folgenden ist ASCII-8BIT:

  def self.search(term)
    connection = Faraday.new(url: 'https://en.wikipedia.org')
    response = connection.get do |req|
      req.options = { :timeout => 5, :open_timeout => 3 }
      req.url '/w/api.php' , action: 'opensearch', format: 'xml', search: term
    end
    puts response.body.encoding
  end

In 1.9.2 führt dies dazu, dass REXML ein Encoding::CompatibilityError ausgibt.

Ich konnte keine Möglichkeit finden, Faraday zu zwingen, response.body in UTF-8 bereitzustellen.

Was ist die bevorzugte Lösung dafür?

bug

Hilfreichster Kommentar

Von mir verwendete Problemumgehung ist:

response.body.force_encoding('utf-8')

Yahuda hat eine Dissertation über das Problem hier .

Alle 9 Kommentare

Habe gerade das gleiche Problem festgestellt. Irgendwelche Ideen?

Von mir verwendete Problemumgehung ist:

response.body.force_encoding('utf-8')

Yahuda hat eine Dissertation über das Problem hier .

Ich bin mir ziemlich sicher, dass Faraday nur den Antworttext des zugrunde liegenden Adapters weitergibt . Ich bin mir nicht sicher, ob ich Fehler auslösen oder verlustbehaftete Konvertierungen der Daten in Faraday durchführen möchte. Dies kann in einer benutzerdefinierten Middleware erfolgen, wenn Sie sie wirklich benötigen.

Meinetwegen. Wenn das Problem, wie es scheint, woanders liegt, denke ich, dass es rechtzeitig behoben wird. Es ist kein Showstopper für mich.

Schließen, weil es bei Faraday kein Fehler ist.

Ich bin mir nicht sicher, ob der zugrunde liegende Adapter - zumindest net/http - eine Codierungstransformation durchführt. Sie können Rubys Encoding.default_external auf etwas wie 'US-ASCII' setzen und dann mit Content-Type = '...; charset=utf-8' ... net/http parst den Zeichensatz und macht ihn verfügbar, ändert aber nichts an der Kodierung des Textkörpers. Vielleicht sollte net/http dafür verantwortlich sein, aber wenn dies nicht der Fall ist, kann die ParseJson-Middleware (zum Beispiel) explodieren.

Habe dazu noch etwas recherchiert - einige der zugrunde liegenden Adapter verarbeiten den Content-Type-Zeichensatz, andere nicht:

EM-HTTP-Request tut es. [ verpflichten ].
Patron tut. [ verpflichten ].
HTTPClient macht [[commit](https://github.com/nahi/httpclient/commit/e5efea5afb3b5cf6ead3a131644dee71be1ee5e9)] [[issue](https://github.com/nahi/httpclient/issues/26)].
Typhoeus und Excon (und net/http) erscheinen nicht.

Ich denke, das Schönste wäre, vielleicht eine optionale Middleware für Adapter anzubieten, die es nicht versuchen, aber ja, ich stimme zu, dies sollte wahrscheinlich nicht in der Verantwortung von Faraday liegen.

@chrismo du bist mein Held. Danke für diese Recherche!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen