【问题标题】:API endpoint link is working in Postman but not in Ruby on Rails with ActiveResourceAPI 端点链接在 Postman 中有效,但在带有 ActiveResource 的 Ruby on Rails 中无效
【发布时间】:2020-06-18 16:04:30
【问题描述】:

我正在开发 Ruby on Rails 应用程序,该应用程序需要通过 GET 请求访问外部 API。请求需要随请求一起发送一些参数。我使用 Activeresource gem 来访问 API。 API 请求在 Postman 中运行良好并提供了预期的记录,但在 Rails 应用程序中给了我 400 错误。

以下是代码

class PayRunEmploymentHeroBase < ActiveResource::Base
  self.site = "https://api.yourpayroll.com.au"
  self.user = ENV['EMPLOYMENT_HERO_USERNAME']
  self.element_name = ""
  self.include_format_in_path = false
  self.prefix = "/api/v2/business/:business_id/payrun?$filter=DateFinalised gt datetime':finalised_date'"
end

我在此处粘贴从 Rails 应用程序访问链接时出现 400 错误的详细信息。

Reloading...
 => true
2.3.0 :006 > PayRunEmploymentHeroBase.find(:all, params: {:business_id => business_id, :finalised_date =>  finalised_date})
##############################################INFO##############################################
{
  "method": "get",
  "request_uri": "https://api.yourpayroll.com.au:443/api/v2/business/48058/payrun?$filter=DateFinalised gt datetime'2017-11-16'",
  "http_status": "400",
  "http_message": "Bad Request"
}
##############################################INFO##############################################
ActiveResource::BadRequest: Failed.  Response code = 400.  Response message = Bad Request.
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activeresource-5.1.0/lib/active_resource/connection.rb:141:in `handle_response'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activeresource-5.1.0/lib/active_resource/connection.rb:126:in `request'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activeresource-5.1.0/lib/active_resource/connection.rb:85:in `block in get'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activeresource-5.1.0/lib/active_resource/connection.rb:220:in `with_auth'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activeresource-5.1.0/lib/active_resource/connection.rb:85:in `get'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activeresource-5.1.0/lib/active_resource/base.rb:1073:in `find_every'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activeresource-5.1.0/lib/active_resource/base.rb:974:in `find'
    from (irb):6
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/railties-5.0.3/lib/rails/commands/console.rb:65:in `start'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/railties-5.0.3/lib/rails/commands/console_helper.rb:9:in `start'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/railties-5.0.3/lib/rails/commands/commands_tasks.rb:78:in `console'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/railties-5.0.3/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/railties-5.0.3/lib/rails/commands.rb:18:in `<main>'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/bootsnap-1.0.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:17:in `require'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/bootsnap-1.0.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:17:in `require'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:293:in `block in require'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:259:in `load_dependency'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:293:in `require'
    from /Users/bebble1/work/awe/bin/rails:9:in `<main>'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/bootsnap-1.0.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `load'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/bootsnap-1.0.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `load'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:287:in `block in load'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:259:in `load_dependency'
    from /Users/bebble1/.rvm/gems/ruby-2.3.0/gems/activesupport-5.0.3/lib/active_support/dependencies.rb:287:in `load'
    from /Users/bebble1/.rvm/rubies/ruby-2.3.0/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /Users/bebble1/.rvm/rubies/ruby-2.3.0/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:54:in `require'

我还附上了一张来自 Rails 应用程序的结果图片

【问题讨论】:

  • 您能否在邮递员中提供请求标头和正文(如果存在)?
  • 嗨,@KSDPutra 我已经用一张在 Postman 中显示标题的图像更新了请求。我目前没有遇到授权问题,因为我有其他工作正常的请求。我认为这个问题与过滤器参数有关。

标签: ruby-on-rails rest api postman activeresource


【解决方案1】:

您似乎没有使用 Rails 应用程序进行身份验证。而且我确定您已经在 Postman 中设置了身份验证用户名/密码。

self.password = "password"(使用您自己的密码)设置为PayRunEmploymentHeroBase,它将起作用。

更新: 其实是你的url没有编码,这样做就可以解决问题了:

self.prefix = "/api/v2/business/:business_id/payrun?$filter=" + URI::encode("DateFinalised gt datetime':finalised_date'")

【讨论】:

  • 您好 Kien,我没有任何授权问题,因为我能够获得其他 API 链接的结果。由于我在用户名中提供了 API 密钥,所以我们不需要用户名和密码。
  • 嗨@cvibha,很抱歉它不起作用。我看到了你的截图,希望 api 密钥不是真实的,否则你需要审查它。也许问题出在过滤器上,您可以尝试对其进行编码吗? self.prefix = URI.encode_www_form_component("/api/v2/business/:business_id/payrun?$filter=DateFinalised gt datetime':finalised_date'") 看看是否有效
  • API 密钥是真正的 Kien,因为我能够让其他 API 请求正常工作。我尝试使用您提供的编码,但它也不起作用。在对请求进行编码后,我收到了以下 URL。 "api.yourpayroll.com.au:443%2Fapi%2Fv2%2Fbusiness%2F%3Abusiness_…"
  • 抱歉,对整个部分进行编码不好。我只对过滤器参数进行了编码测试,但它没有给我 400:self.prefix = "/api/v2/business/:business_id/payrun?$filter=" + URI.encode_www_form_component("DateFinalised gt datetime':finalised_date'")。这使得最终的 url 是https://api.yourpayroll.com.au:443/api/v2/business/48058/payrun?$filter=DateFinalised+gt+datetime%272017-11-16%27。请尝试让我知道
  • @cvibha 500 表示服务器出现异常,无法处理请求,优于 400(客户端错误)。我认为我推荐的编码方法不起作用。请尝试URI::encode:像这样:self.prefix = "/api/v2/business/:business_id/payrun?$filter=" + URI::encode("DateFinalised gt datetime':finalised_date'"),这使得api.yourpayroll.com.au:443/api/v2/business/48058/…'。请试一试
猜你喜欢
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2020-04-28
  • 2020-04-06
  • 1970-01-01
相关资源
最近更新 更多