我想向 API 发送 POST 请求。这是我的代码:
conn = Faraday.new(url: BASE) do |faraday|
faraday.response :logger
faraday.request :url_encoded
faraday.headers['Content-Type'] = 'application/json'
faraday.headers["Authorization"] = "bearer #{AppConfig.instance.access_token}"
faraday.adapter Faraday.default_adapter
end
form_data = {a: 1, b: 2}
conn.post("/api/test", form_data)
但是我得到这个错误:
NoMethodError (undefined method `bytesize' for {:a=>1, :b=>2}:Hash)
我也试过:
conn.post("/api/test", form_data.to_json)
但它也不起作用。
最佳答案
官方faraday repo 提供下一个描述:
# post payload as JSON instead of "www-form-urlencoded" encoding:
conn.post do |req|
req.url '/nigiri'
req.headers['Content-Type'] = 'application/json'
req.body = '{ "name": "Unagi" }'
end
因此,内容类型“application/json”无法解析哈希。 Gem 不会自行将正文数据转换为所需的格式。
您需要将 form_data 转换为 string(json
) 格式:
form_data = {a: 1, b: 2}.to_json
注意。使用符号键格式时,不要按.to_s
转换,否则会导致解析错误。
通过你提供的法拉第配置,我在将 format_data 转换为 json 后不会导致任何错误。因此,新错误与法拉第 gem 或提供的代码无关。
关于ruby-on-rails - 法拉第 gem 未定义方法 'bytesize' =' for Hash`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50523995/