升级至Rails 5后使用qbo_api无法创建QuickBooks发票
我之前也碰到过类似的Rails版本升级后OAuth相关gem兼容性问题,结合你提到的依赖栈(qbo_api 1.8.1、simple_oauth 0.3.1、oauth 0.5.4、faraday 0.14.0),大概率是Rails 5.0对HTTP请求的处理逻辑、或是旧gem的签名逻辑和新版本框架不兼容导致的。下面是几个排查和解决的方向:
1. 先检查请求头的Content-Type配置
Rails 5.0对HTTP请求头的校验更严格,qbo_api在发起create请求时可能没有正确设置Content-Type: application/json,或者OAuth签名时没有包含这个头部信息,导致QuickBooks API拒绝请求。
你可以尝试在初始化qbo_api客户端时手动添加这个请求头:
# 初始化qbo_api客户端时自定义faraday连接 qbo_client = QboApi.new(your_config_hash) do |conn| conn.headers['Content-Type'] = 'application/json' end
2. 升级依赖gem的版本
qbo_api 1.8.1是比较老的版本,大概率没有适配Rails 5.0的变化。建议尝试升级到兼容Rails 5的qbo_api版本,同时同步升级它的依赖gem:
- 修改Gemfile:
gem 'qbo_api', '~> 2.0' # 确认该版本支持Rails 5(可查看gem的release notes) gem 'simple_oauth', '~> 0.4.0' gem 'oauth', '~> 0.6.0' gem 'faraday', '~> 0.17.0'
- 然后运行:
bundle update qbo_api simple_oauth oauth faraday
升级后再测试create接口,大部分兼容性问题都能通过版本更新解决。
3. 开启请求日志排查签名问题
如果升级后还是报错,建议开启faraday的请求日志,对比Rails 4.2下的正常请求,看看create请求的payload格式、OAuth签名参数是否有差异:
# 初始化客户端时添加日志中间件,输出完整请求细节 qbo_client = QboApi.new(your_config_hash) do |conn| conn.response :logger, Logger.new(STDOUT), bodies: true end
运行create请求后,重点看:
- 请求payload是否是标准的JSON格式
- OAuth签名的参数排序、编码是否符合QuickBooks API要求
- 请求头是否包含所有必要的字段
4. 排除Rails 5.0的CSRF保护干扰(可能性较低)
如果你的调用逻辑是在Rails控制器里,Rails 5.0的CSRF保护规则有细微变化,虽然对外部API请求影响不大,但可以临时关闭对应控制器的CSRF保护测试:
class YourController < ApplicationController skip_before_action :verify_authenticity_token, only: [:your_create_action] end
内容的提问来源于stack exchange,提问作者mpipkorn
相关产品推荐
相关产品推荐

