You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Ruby Gem Faraday发送PDF类型POST请求时遇bytesize错误求助

使用Faraday发送application/pdf类型POST请求的错误解决

问题场景

需要用Ruby的Faraday Gem发送Content-Type为application/pdf的POST请求,代码如下:

client = Faraday.new(endpoint) do |client|
  client.request :retry
  client.headers['Content-Type'] = "application/pdf"
  client.headers['Authorization'] = auth_token
  client.adapter Faraday.default_adapter
end

response = client.public_send(:post, endpoint, params)

运行后触发错误:

undefined method `bytesize' for {:title=>"0722 14 ID:14"}:Hash

错误原因

Faraday的post方法第三个参数默认作为请求体处理。当你设置Content-Type: application/pdf时,请求体必须是PDF文件的二进制字符串,但你传入的是Hash类型的params,而Hash没有bytesize方法(该方法用于字符串计算字节数),因此触发报错。

解决方案

1. 直接传递PDF二进制内容作为请求体

如果使用本地PDF文件,先读取其二进制内容,再作为请求体发送:

# 读取本地PDF文件的二进制内容
pdf_binary = File.binread('/path/to/your/document.pdf')

client = Faraday.new(endpoint) do |client|
  client.request :retry
  client.headers['Content-Type'] = "application/pdf"
  client.headers['Authorization'] = auth_token
  client.adapter Faraday.default_adapter
end

# 将二进制内容作为请求体发送
response = client.post(endpoint, pdf_binary)

2. 附带额外参数的处理

如果需要传递title这类额外参数,需根据API要求调整:

  • 参数放在URL查询字符串:
pdf_binary = File.binread('/path/to/your/document.pdf')

response = client.post do |req|
  req.url endpoint, { title: "0722 14 ID:14" } # 把参数拼到URL查询串
  req.body = pdf_binary
end
  • 参数放在请求头(若API支持自定义头传递):
pdf_binary = File.binread('/path/to/your/document.pdf')

client = Faraday.new(endpoint) do |client|
  client.request :retry
  client.headers['Content-Type'] = "application/pdf"
  client.headers['Authorization'] = auth_token
  client.headers['X-Title'] = "0722 14 ID:14" # 自定义头传递参数
  client.adapter Faraday.default_adapter
end

response = client.post(endpoint, pdf_binary)

内容的提问来源于stack exchange,提问作者user3812919

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:24:32