代码之家  ›  专栏  ›  技术社区  ›  D.Nogueira

如何在Ruby on Rails中向服务器发送get并在我的应用程序中等待get

  •  -1
  • D.Nogueira  · 技术社区  · 8 年前

    我正在使用Zapier在谷歌表单中搜索一些信息。我使用Webhocks向他的服务器发送一个GET,其中包含JSON信息。GET的响应是“OK”,我不能自定义这个。 所以,他们会执行一个任务,找到我想要的并返回一个值,但响应必须是我服务器中的GET,我不知道如何在我的路由中拦截这个响应。 我试图研究Rails Rack以在我的应用程序中拦截de请求,但我不知道如何发送对发送第一个GET的事件的响应。

    我的中间件如何:

    class DeltaLogger
        def initialize app
            @app = app
        end
    
        def call env
            Rails.logger.debug "#{env['QUERY_STRING']}"        
            @status, @headers, @response = @app.call(env)
            [@status, @headers, @response]
        end
    end
    

    谢谢

    Example

    1 回复  |  直到 8 年前
        1
  •  0
  •   D.Nogueira    8 年前

    因此,为了获得从Zapier返回的值,我创建了两个路由和一个全局类缓存。

    class Zapier
    require 'httparty'
        def initialize
            @answer = ""
            @id = 0
        end
    
        def request(uri, task)
            last_event = Event.last
            puts last_event.inspect
            if last_event.nil? 
                last_id = 0
            else
                last_id = last_event.event_id
            end
            event_id = last_id + 1
            Event.find_or_create_by(event_id: event_id)
            result = HTTParty.post(uri.to_str,
            :body => {id: event_id, task: task}.to_json,
            :headers => {'content-Type' => 'application/json'})
            @answer = ""
            @id = event_id
        end
    
        def response(event_id, value)
            if event_id != @id
                @answer = ""
            else
                @answer = value
            end       
        end
    
        def get_answer
            @answer
        end
    end
    

    和我的控制器:

    class ZapierEventsController < ApplicationController
      require 'zapier_class'
      before_action :get_task, only: [:get]
      before_action :get_response, only: [:set]
      @@zapier ||= Zapier.new
      def get
        @@zapier.request('https://hooks.zapier.com',@task)
        sleep 10 #Wait for response
        @value = @@zapier.get_answer
        render json: { 'value': @value }, status: 
      end
    
      def set  
        @@zapier.response(@id, @value)
        render json: { 'status': 'ok' }, status: 200
      end
    
      def get_task
        @task = params["task"]
      end
      def get_response
        @id = Integer(params["id"])
        @value = params["value"]
      end
    end
    

    现在我要做一个任务管理员