使用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
相关产品推荐
相关产品推荐

