1

我必须构建一个 Angular js 应用程序作为客户端来使用 api。问题是 api 不支持 jsonp 调用。

所以我创建了一个 Rails 应用程序,它调用 api 并返回内容。我正在使用法拉第宝石

现在我有一个每次调用 api 的方法。但是由于每个方法只创建一个请求,触发请求并返回内容。

如果我可以创建一个代理控制器,它根据接收到的内容创建请求,然后使用法拉第创建一个请求并返回结果,我正在徘徊。像这样的东西:

 def proxy_request
    if request.method_symbol == :get || request.method_symbol == :delete
 line 7: response = faraday_conn.run_request(request.method_symbol, request.fullpath, nil, request.headers)
    elsif request.method_symbol == :post || request.method_symbol == :put || request.method_symbol == :patch
  response = faraday_conn.run_request(request.method_symbol, request.fullpath, request.body.read, request.headers)
end

render :text => response.body, :status => response.status, :content_type => response.headers["Content-Type"]

结尾

这是行不通的。我做错了什么?它总是失败

NoMethodError (undefined method `strip' for #<StringIO:0x3436848>):
app/controllers/api_proxy_controller.rb:7:in `proxy_request'
4

1 回答 1

0

回溯是不完整的(某些框架,例如 Rails/RSpec,默认情况下可能会隐藏来自项目外部的行)。错误实际上来自Net::HTTP( net/http/header.rb:17),至少在我的情况下(Ruby 2.1、Rails 4.0.2 和默认的法拉第适配器)。它期望标头中的所有值都是字符串(或至少响应strip)。

一种解决方法是排除任何具有非字符串值的标头。根据您想要做什么,这可能对您有用,也可能不适合您,例如:

faraday_conn.run_request(
  request.method_symbol,
  request.fullpath,
  request.body.read,
  request.headers.select{|k,v| v.respond_to?(:strip)}
)

请注意,由于这是在 Rails 控制器中,因此request.headers返回一个实例,ActionDispatch::Http::Headers该实例类似于 aHash但实际上不是 a Hash(您可以调用to_h它以将其转换为哈希)。

于 2014-01-08T05:07:23.283 回答