Как вы регистрируете URL, который использует ActiveResource? - PullRequest
22 голосов
/ 08 сентября 2010

Rails ActiveResource потрясающий ... за исключением одного: насколько я могу судить, нет никакого способа узнать, какой URL он использует за кулисами.Например, допустим, у меня есть ActiveResource с именем Issue для веб-службы по адресу myIssues.com/issues.xml.Если я сделаю:

Issue.find(:all, :params => {:page => 2})

, я бы ожидал, что ActiveResource сделает вызов:

myIssues.com/issues.xml?page=2

... но на самом деле я этого не знаю.Насколько я знаю, ActiveResource мог бы решить, что ему не нравится слово «страница», поэтому он на самом деле использует:

myIssues.com/issues.xml?mod_page=2

Это затрудняет отладку.Прямо сейчас у меня есть ситуация, когда, если я перехожу по URL, который я думаю использует ActiveResource, он работает просто отлично.Однако, когда я на самом деле использую ActiveResource, он не работает.Просмотр URL-адреса, который он получает, был бы чрезвычайно полезен в этом, так что ...

Кто-нибудь знает способ записи (или иного вывода; если есть какой-то метод resource.url, который тоже будет работать)s) что ActiveResource использует для своей цели?

Ответы [ 3 ]

24 голосов
/ 11 ноября 2010

Если вы добавите следующую строку в ваш файл environment.rb, он будет по крайней мере регистрировать запросы, чтобы вы знали, что URL ActiveResource нажимает:

ActiveResource::Base.logger = ActiveRecord::Base.logger

Я все еще ищу лучшее решение, которое показывает мне ответ и данные, отправленные для обновления вызовов, но, по крайней мере, это шаг в правильном направлении. Я действительно не уверен, почему у ActiveResource есть отдельный регистратор, но это другой вопрос.

7 голосов
/ 15 октября 2011

Я только что столкнулся с той же самой проблемой, и наткнулся на этот пост, когда я искал ответы.Что я нашел, что оказалось полезным, так это метод collection_path в ActiveResource :: Base.Например, предположим, у вас есть следующий ресурс:

class UserPost < ActiveResource::Base
    self.site = "http://someApp.com/user/:user_id"
    self.element_name = "post"

Если вы перейдете к консоли rails, вот несколько примеров вывода:

>> UserPost.collection_path
"/user//post"
>> UserPost.collection_path(:user_id => 5)
"/user/5/post

Это должно предоставить вамименно то, что вам нужно, чтобы определить, как ActiveResource переводит ваш запрос в URL.

2 голосов
/ 16 августа 2018

enter image description here

Чтобы получить подробные данные для входа в систему для ActiveResource необходимо пропатчить метод запроса внутри гема ( method .

поместите приведенные ниже файлы внутрь config/initializers, вы получите http метод, путь, тело запроса, хедеры запроса

тело ответа и заголовок уже есть, есливам нужно. документ

config / initializers / activeresource_patch.rb

module ActiveResource
  class Connection
    private
      def request(method, path, *arguments)
        result = ActiveSupport::Notifications.instrument("request.active_resource") do |payload|
          payload[:method]      = method
          payload[:request_uri] = "#{site.scheme}://#{site.host}:#{site.port}#{path}"
          payload[:request_path] = path
          payload[:request_body] = arguments[0]
          payload[:request_headers] = arguments[1]
          payload[:result]      = http.send(method, path, *arguments)
        end
        handle_response(result)
      rescue Timeout::Error => e
        raise TimeoutError.new(e.message)
      rescue OpenSSL::SSL::SSLError => e
        raise SSLError.new(e.message)
      end
  end
end

config / initializers / activeresource_logger.rb

Rails.application.configure do

  def activeresource_logger
  @activeresource_logger ||= Logger.new("#{Rails.root}/log/activeresource_logger.log")
  end

  ActiveSupport::Notifications.subscribe('request.active_resource')  do |name, start, finish, id, payload|
   if Rails.env.development?
    activeresource_logger.info("====================== #{start} : #{payload[:method].upcase} ======================")
    activeresource_logger.info("PATH: #{payload[:request_path]}")
    activeresource_logger.info("BODY: #{payload[:request_body]}")
    activeresource_logger.info("HEADERS: #{payload[:request_headers]}")
    # activeresource_logger.info("STATUS_CODE: #{payload[:result].code}")
    # activeresource_logger.info("RESPONSE_BODY: #{payload[:result].body}")
   end
  end

end
...