في المرة الأولى التي أستخدم فيها faraday ، ربما أكون أفعل الأشياء بشكل غير صحيح ، لكن ترميز response.body
في ما يلي هو 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
في 1.9.2 ، يتسبب هذا في قيام REXML برمي Encoding::CompatibilityError
.
لم أتمكن من العثور على طريقة لإجبار faraday على تقديم response.body
في UTF-8.
ما هو الحل المفضل لهذا؟
فقط واجهت نفس المشكلة. أيه أفكار؟
أنا متأكد تمامًا من أن فاراداي يمرر جسم الاستجابة من المحول الأساسي . لست متأكدًا من أنني أريد رفع الأخطاء أو إجراء تحويلات ضائعة للبيانات في فاراداي. يمكن القيام بذلك في برنامج وسيط مخصص إذا كنت في حاجة إليه حقًا.
عادل بما يكفي. إذا كانت المشكلة في مكان آخر ، كما تظهر ، أعتقد أنه سيتم تنظيفها في الوقت المناسب. إنه ليس سدادة عرض بالنسبة لي.
يتم الإغلاق لأنه ليس خطأ مع فاراداي.
لست متأكدًا من أن المحول الأساسي - على الأقل net / http - يقوم بأي تحويل ترميز. يمكنك تعيين Ruby's Encoding.default_external إلى شيء مثل "US-ASCII" ، ثم الوصول إلى نقطة نهاية مع Content-Type = '...؛ charset = utf-8 '... net / http سيحلل سلسلة الأحرف ويجعلها متاحة ، لكنه لا يفعل شيئًا لتشفير سلسلة النص الأساسي. ربما يجب أن يكون net / http مسؤولاً عن ذلك ، ولكن إذا لم يكن كذلك ، يمكن أن تتفجر برمجية ParseJson الوسيطة (على سبيل المثال).
أجر المزيد من البحث حول هذا الموضوع - بعض المحولات الأساسية تتعامل مع مجموعة أحرف نوع المحتوى ، والبعض الآخر لا:
طلب EM-HTTP يفعل. [ ارتكاب ].
الراعي يفعل. [ الالتزام ].
HTTPClient [[الالتزام] (https://github.com/nahi/httpclient/commit/e5efea5afb3b5cf6ead3a131644dee71be1ee5e9)] [[المشكلة] (https://github.com/nahi/httpclient/issues/26)].
لا يبدو أن Typhoeus و Excon (و net / http).
أعتقد أن أفضل ما يمكن فعله هو تقديم برمجيات وسيطة اختيارية للمحولات التي لا تحاول ، لكن ، نعم ، أوافق ، ربما لا ينبغي أن تكون هذه مسؤولية فاراداي.
@ كريزمو أنت بطلي. شكرا للقيام بهذا البحث!
التعليق الأكثر فائدة
الحل الذي استخدمته هو:
يهودا لديه أطروحة حول المشكلة هنا .