La primera vez que uso faraday, por lo que podría estar haciendo las cosas incorrectamente, pero la codificación response.body
en lo siguiente es 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
En 1.9.2, esto hace que REXML arroje un Encoding::CompatibilityError
.
No pude encontrar una manera de obligar a Faraday a proporcionar response.body
en UTF-8.
¿Cuál es la solución preferida para esto?
Acabo de encontrar el mismo problema. ¿Algunas ideas?
La solución alternativa que utilicé es:
response.body.force_encoding('utf-8')
Yahuda tiene una disertación sobre el problema aquí .
Estoy bastante seguro de que Faraday simplemente pasa el cuerpo de respuesta del adaptador subyacente . No estoy seguro de querer generar errores o realizar conversiones con pérdida de datos en Faraday. Eso se puede hacer en un middleware personalizado si realmente lo necesita.
Lo suficientemente justo. Si el problema está en otra parte, como parece, supongo que se solucionará a tiempo. No es un obstáculo para mí.
Cerrando porque no es un error de Faraday.
No estoy seguro de que el adaptador subyacente, al menos net / http, realice alguna transformación de codificación. Puede configurar Ruby's Encoding.default_external en algo como 'US-ASCII', luego alcanzar un punto final con Content-Type = '...; charset = utf-8 '... net / http analizará la cadena del juego de caracteres y la pondrá a disposición, pero no modificará la codificación de la cadena del cuerpo. Quizás net / http debería ser responsable de eso, pero si no lo es, el middleware ParseJson (por ejemplo) puede explotar.
Investigué un poco más sobre esto: algunos de los adaptadores subyacentes manejan el juego de caracteres Content-Type, otros no:
EM-HTTP-Request lo hace. [ comprometerse ].
El patrón lo hace. [ comprometerse ].
HTTPClient hace [[commit] (https://github.com/nahi/httpclient/commit/e5efea5afb3b5cf6ead3a131644dee71be1ee5e9)] [[problema] (https://github.com/nahi/httpclient/issues/26)].
Typhoeus y Excon (y net / http) no parecen hacerlo.
Supongo que lo mejor que puede hacer sería ofrecer un middleware opcional para los adaptadores que no lo intentan, pero sí, estoy de acuerdo, esto probablemente no debería ser responsabilidad de Faraday.
@chrismo eres mi héroe. ¡Gracias por hacer esa investigación!
Comentario más útil
La solución alternativa que utilicé es:
Yahuda tiene una disertación sobre el problema aquí .