Как собрать прокси-контроллер и фарадея

Мне нужно создать приложение angular js в качестве клиента для использования API. Проблема в том, что API не поддерживает вызовы jsonp.

Итак, я создал приложение для рельсов, которое вызывает 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'

person Mihai    schedule 03.11.2013    source источник
comment
Я удалил угловой тег, поскольку JS-фреймворк, который вы используете для обработки данных на стороне клиента, совершенно не имеет отношения к проблеме.   -  person charlietfl    schedule 03.11.2013


Ответы (1)


Бэктрейс неполный (некоторые фреймворки, например 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, который крякает как Hash, но на самом деле не Hash (вы можете вызвать для него to_h, чтобы преобразовать его в хэш).

person Ronny Haryanto    schedule 08.01.2014