使用Faraday发送POST请求报错:undefined method `bytesize' for Hash
解决Faraday POST请求中
undefined method 'bytesize' for Hash的问题 这个错误的核心原因很明确:当你设置了Content-Type: application/json后,Faraday期望请求体是能被转换为字节流的字符串,但你直接传入了Hash对象——而Hash并没有bytesize方法(这个方法是String类的专属方法)。哪怕你尝试了to_json,如果没正确让Faraday识别请求体格式,问题也会持续。下面给你两种可靠的解决办法:
方法一:使用Faraday的JSON请求中间件(推荐)
这种方法最简洁省心,Faraday会自动帮你把Hash序列化为JSON字符串,同时确保请求头和请求体的格式完全匹配。
操作步骤:
确保依赖安装:如果你的Faraday版本是v1.x及以上,部分功能内置,但保险起见可以在Gemfile中添加
faraday_middleware:gem 'faraday_middleware'执行
bundle install完成安装。修改Faraday初始化代码,添加
:json请求中间件:conn = Faraday.new(url: BASE) do |faraday| faraday.response :logger faraday.request :url_encoded # 保留这个不影响,它主要处理表单编码请求,和JSON请求无冲突 faraday.request :json # 添加此中间件,自动将Hash序列化为JSON 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) # 直接传Hash即可,中间件会自动处理序列化
方法二:手动设置JSON请求体
如果不想依赖中间件,你可以手动把Hash转为JSON字符串,通过块的方式明确设置请求体:
conn = Faraday.new(url: BASE) do |faraday| faraday.response :logger 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") do |req| req.body = form_data.to_json # 手动转为JSON字符串,明确传入请求体 end
这两种方法都能解决bytesize错误,因为它们都确保了请求体是字符串类型,完全符合Faraday处理JSON请求的要求。
内容的提问来源于stack exchange,提问作者bav ko ten
相关产品推荐
相关产品推荐

