Faraday: NoMethodError: método indefinido `bytesize' para #<0x007fb881de2c90 i="4"/>

Criado em 25 mai. 2012  ·  7Comentários  ·  Fonte: lostisland/faraday

vestígio:

NoMethodError: undefined method `bytesize' for #<Hash:0x007fb881de2c90>
    from /Users/chall/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:1932:in `send_request_with_body'
    from /Users/chall/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:1919:in `exec'
    from /Users/chall/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:1317:in `block in transport_request'
    from /Users/chall/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:1316:in `catch'
    from /Users/chall/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:1316:in `transport_request'
    from /Users/chall/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:1293:in `request'
    from /Users/chall/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:1286:in `block in request'
    from /Users/chall/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:745:in `start'
    from /Users/chall/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:1284:in `request'
    from /Users/chall/.rvm/gems/ruby-1.9.3-p194@my_api/gems/faraday-0.8.0/lib/faraday/adapter/net_http.rb:72:in `perform_request'
    from /Users/chall/.rvm/gems/ruby-1.9.3-p194@my_api/gems/faraday-0.8.0/lib/faraday/adapter/net_http.rb:35:in `call'
    from /Users/chall/.rvm/gems/ruby-1.9.3-p194@my_api/gems/faraday-0.8.0/lib/faraday/connection.rb:226:in `run_request'
    from /Users/chall/.rvm/gems/ruby-1.9.3-p194@my_api/gems/faraday-0.8.0/lib/faraday/connection.rb:99:in `put'
    from /Users/chall/.rvm/gems/ruby-1.9.3-p194@my_api/gems/fulcrum-0.0.1/lib/my_api/form.rb:31:in `update'
    from (irb):5
    from /Users/chall/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>'

parâmetros de solicitação:

params = {"form"=>{"id"=>"4fbce262ab0a5d57f600022f", "name"=>"POI", "description"=>"", "created_at"=>"2012-05-23T13:13:06Z", "updated_at"=>"2012-05-23T13:13:06Z", "elements"=>[{"disabled"=>false, "hidden"=>false, "key"=>"b9195f6c-d9ff-9b61-838a-6f66a00b683f", "type"=>"TextField", "data_name"=>"name", "required"=>false, "label"=>"Name"}, {"disabled"=>false, "hidden"=>false, "allow_other"=>true, "key"=>"9e1d6d5e-157b-2992-d93f-aa65e4c8d2ff", "type"=>"ClassificationField", "classification_set_id"=>"4fbce262ab0a5d57f6000005", "data_name"=>"classification", "required"=>true, "label"=>"Classification"}, {"disabled"=>false, "hidden"=>false, "key"=>"b9829d7b-ed94-ca8a-3f28-9e063f959cb3", "type"=>"TextField", "data_name"=>"address_1", "required"=>false, "label"=>"Address 1"}, {"disabled"=>false, "hidden"=>false, "key"=>"07cc253d-56da-2f29-eaae-693b2bf4be5c", "type"=>"TextField", "data_name"=>"address_2", "required"=>false, "label"=>"Address 2"}, {"disabled"=>false, "hidden"=>false, "key"=>"4922bfbf-291a-047f-2273-6512cc0eb959", "type"=>"TextField", "data_name"=>"city", "required"=>false, "label"=>"City"}, {"disabled"=>false, "hidden"=>false, "key"=>"6d14d444-f5bc-6231-ac66-bb1e7d613f6a", "type"=>"TextField", "data_name"=>"state_province", "required"=>false, "label"=>"State / Province"}, {"disabled"=>false, "hidden"=>false, "multiple"=>false, "allow_other"=>false, "key"=>"c2bd0c84-967d-fe53-081e-530ef8e4e7bb", "type"=>"ChoiceField", "choice_list_id"=>"4fbce262ab0a5d57f600016c", "default_value"=>"United States", "data_name"=>"country", "required"=>false, "label"=>"Country"}, {"disabled"=>false, "hidden"=>false, "key"=>"a5c58cd8-fa3e-dc03-be15-60c6b3e5954d", "type"=>"TextField", "data_name"=>"phone", "required"=>false, "label"=>"Phone"}, {"disabled"=>false, "hidden"=>false, "key"=>"8d80bb77-0ff1-98ae-ffc5-e55f4c67f539", "type"=>"TextField", "data_name"=>"fax", "required"=>false, "label"=>"Fax"}, {"disabled"=>false, "hidden"=>false, "key"=>"fd10014d-c685-a953-a39b-9e466f8af884", "type"=>"TextField", "data_name"=>"email", "required"=>false, "label"=>"Email"}, {"disabled"=>false, "hidden"=>false, "key"=>"e1ca2a47-89ca-91cd-fbcd-9a7c36486cf9", "type"=>"TextField", "description"=>"If building is a notable, named building.", "data_name"=>"building_name", "required"=>false, "label"=>"Building Name"}, {"disabled"=>false, "hidden"=>false, "key"=>"1992b6b7-bf2f-6878-eacb-6b84a80992dd", "type"=>"PhotoField", "data_name"=>"photos", "required"=>false, "label"=>"Photos"}]}}

código de conexão:

class MyApi

  URI = nil #base api uri
  attr :connection

  def initialize(opts = {})
    <strong i="6">@uri</strong> = opts[:uri] || URI
    <strong i="7">@key</strong> = opts[:key] || get_key(opts[:username], opts[:password])
    raise ConnectionError, 'no api key' unless <strong i="8">@key</strong>

    <strong i="9">@connection</strong> = Faraday.new(@uri) do |b|
      b.adapter Faraday.default_adapter
      b.request :json
      b.response :logger
      b.response :raise_error
      b.response :json, :content_type => "application/json"
    end
    @connection.headers['X-ApiToken'] = <strong i="10">@key</strong>
  end
end

então se eu fizer:

api = MyApi.new(key)
api.connection.put("forms/#{id}.json", params)

eu recebo o erro acima e backtrace. originalmente, eu tinha a configuração da solicitação como

b.request :url_encode
b.request :multipart

Comentários muito úteis

Para qualquer outra pessoa com esse problema, eu simplesmente tinha que chamar .to_json no hash que estava enviando como corpo.

Todos 7 comentários

Você precisa colocar o adaptador por último na lista de middleware.

obrigado mislav!

Para qualquer outra pessoa com esse problema, eu simplesmente tinha que chamar .to_json no hash que estava enviando como corpo.

Por que Faraday não chama to_json/to_x_www_form_urlencoded automático de acordo com o tipo de conteúdo da solicitação?

@a0s sim, se você usar um dos middlewares de solicitação.
Se você definir manualmente o cabeçalho Content-Type para qualquer valor, faraday não tocará seu corpo.
Veja o exemplo abaixo para definir E codificar o corpo:

connection = Faraday.new(@uri) do |b|
    b.request :json # This will set the "Content-Type" header to application/json and call .to_json on the body
    b.adapter Faraday.default_adapter
end

Se preferir usar x_www_form_urlencoded , basta trocar b.request :json por b.request :url_encoded

@iMacTia acredito que seja b.request :url_encoded

@danajackson2 você está muito certo! Editei meu comentário acima, obrigado por apontar e desculpe o erro de digitação 🙏!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

aleksb86 picture aleksb86  ·  3Comentários

jordansissel picture jordansissel  ·  5Comentários

subvertallchris picture subvertallchris  ·  5Comentários

mvastola picture mvastola  ·  4Comentários

ioquatix picture ioquatix  ·  4Comentários