Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何构建代理控制器和法拉第_Ruby On Rails_Ruby_Ruby On Rails 4_Faraday - Fatal编程技术网

Ruby on rails 如何构建代理控制器和法拉第

Ruby on rails 如何构建代理控制器和法拉第,ruby-on-rails,ruby,ruby-on-rails-4,faraday,Ruby On Rails,Ruby,Ruby On Rails 4,Faraday,我必须构建一个angular js应用程序作为客户端来使用api。 问题是api不支持jsonp调用 因此,我创建了一个rails应用程序,它调用api并返回内容。 我在用电话 现在,我为每个api调用都提供了一个方法。但由于每个方法只创建一个请求,因此会触发请求并返回内容 我想知道是否可以创建一个代理控制器,根据它接收到的内容创建请求,然后用法拉第创建一个请求并返回结果。大概是这样的: def proxy_request if request.method_symbol == :ge

我必须构建一个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'

回溯是不完整的一些框架,例如Rails/RSpec,默认情况下可能会隐藏来自项目外部的行。这个错误实际上来自Net::httpnet/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的一个实例,它像散列一样嘎嘎作响,但实际上不是一个散列,您可以调用它来将其转换为散列。

我丢弃了Angle标记,因为您用于使用数据客户端的JS框架与问题完全无关