2015-04-03 4 views
4

Я пытаюсь преобразовать код из HTTParty в Faraday. Раньше я использовал:Faraday JSON post 'undefined method bytesize' for имеет тела

HTTParty.post("http://localhost/widgets.json", body: { name: "Widget" }) 

Новый фрагмент является:

faraday = Faraday.new(url: "http://localhost") do |config| 
    config.adapter Faraday.default_adapter 

    config.request :json 
    config.response :json 
end 
faraday.post("/widgets.json", { name: "Widget" }) 

Какие результаты в: NoMethodError: undefined method 'bytesize' for {}:Hash. Возможно ли, что Faraday автоматически сериализует тело запроса в строку?

+1

Попробуйте поместить адаптер в список промежуточного программного обеспечения - см. [Расширенное использование промежуточного программного обеспечения] (https://github.com/lostisland/faraday). –

+0

@ l'L'l Это определенно ошибка. Можете ли вы добавить ответ вместо комментария, чтобы я мог принять + щедрость? –

ответ

3

Список промежуточного программного обеспечения требует, чтобы он был сконструирован/сложен в определенном порядке, иначе вы столкнетесь с этой ошибкой. Первый промежуточный слой считается наиболее удаленным, который оборачивает все остальные, поэтому адаптер должен быть внутренние один (или последним):

Faraday.new(url: "http://localhost") do |config| 
    config.request :json 
    config.response :json 
    config.adapter Faraday.default_adapter 
end 

Смотрите Advanced middleware usage для получения дополнительной информации.

+1

Спасибо! Это был определенно порядок. Оцените ответ. –

-1

Вы всегда можете создать свое собственное промежуточное ПО для Фарадея.

require 'faraday' 

class RequestFormatterMiddleware < Faraday::Middleware 
    def call(env) 
    env = format_body(env) 
    @app.call(env) 
    end 

    def format_body(env) 
    env.body = 'test' #here is any of needed operation 
    env 
    end 
end 

conn = Faraday.new("http://localhost") do |c| 
    c.use RequestFormatterMiddleware 
end 

response = conn.post do |req| 
req.url "http://localhost" 
req.headers['Content-Type'] = 'application/json' 
req.body = '{ "name": "lalalal" }' 
end 

p response.body #=> "test" 
+0

Почему вы проголосовали? Благодаря собственному промежуточному программному обеспечению вы можете легко сериализовать. – dolgishev

+2

Я проголосовал за то, что это было плохим решением. @ Замечание I'L'I - правильное решение. Рекомендации по написанию специального промежуточного программного обеспечения для исправления проблемы с параметрированием (что было единственной проблемой) абсурдно. –

 Смежные вопросы

  • Нет связанных вопросов^_^