如何使用 Rails JSON API 从 Google Calendar API 获取事件

问题描述 投票:0回答:1

现在我收到一个错误:

缺少必需的参数:grant_type

使用

retrieve_events
控制器操作时。

 module Api
  module V1
    class EventsController < ApplicationController

      require 'google/apis/calendar_v3'
      require 'googleauth'
      require 'googleauth/stores/file_token_store'
      require 'openssl'
      require 'fileutils'


      def index
        # @events = Event.all
        # render json: @events
      end


      OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

      def retrieve_events
        client = Signet::OAuth2::Client.new({
          client_id: Rails.application.secrets.google_client_id,
          client_secret: Rails.application.secrets.google_client_secret,
          token_credential_uri: 'https://accounts.google.com/o/oauth2/token'
        })

        client.update!(session[:authorization])

        service = Google::Apis::CalendarV3::CalendarService.new
        service.authorization = client

        @event_list = service.list_events(params[:calendar_id])
        # @event_list = service.list_events(1)

        @event_list.items.each do |event|

          unless event.start.nil?
            e = Event.find_or_initialize_by(title: event.summary)
            if event.start.date
              e.start_time = DateTime.parse(event.start.date).beginning_of_day
              e.end_time = DateTime.parse(event.start.date).end_of_day
            else
              e.start_time = event.start.date_time
              e.end_time = event.end.date_time
            end
            e.approved = true
            e.save!
          end
        end
        render json: @event_list
      end

      def new_event
        client = Signet::OAuth2::Client.new({
          client_id: Rails.application.secrets.google_client_id,
          client_secret: Rails.application.secrets.google_client_secret,
          token_credential_uri: 'https://accounts.google.com/o/oauth2/token'
        })

        client.update!(session[:authorization])

        service = Google::Apis::CalendarV3::CalendarService.new
        service.authorization = client

        today = Date.today

        event = Google::Apis::CalendarV3::Event.new({
          start: Google::Apis::CalendarV3::EventDateTime.new(date: today),
          end: Google::Apis::CalendarV3::EventDateTime.new(date: today + 1),
          summary: 'New event!'
        })

        service.insert_event(params[:calendar_id], event)

        redirect_to events_url(calendar_id: params[:calendar_id])
      end

      def redirect
        client = Signet::OAuth2::Client.new({
          client_id: Rails.application.secrets.google_client_id,
          client_secret: Rails.application.secrets.google_client_secret,
          authorization_uri: 'https://accounts.google.com/o/oauth2/auth',
          scope: Google::Apis::CalendarV3::AUTH_CALENDAR,
          redirect_uri: callback_url
        })

        redirect_to client.authorization_uri.to_s
      end

      def callback
        client = Signet::OAuth2::Client.new({
          client_id: Rails.application.secrets.google_client_id,
          client_secret: Rails.application.secrets.google_client_secret,
          token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
          redirect_uri: callback_url,
          code: params[:code]
        })

        response = client.fetch_access_token!

        session[:authorization] = response

        redirect_to calendars_url
      end

      def calendars
        client = Signet::OAuth2::Client.new({
          client_id: Rails.application.secrets.google_client_id,
          client_secret: Rails.application.secrets.google_client_secret,
          token_credential_uri: 'https://accounts.google.com/o/oauth2/token'
        })

        client.update!(session[:authorization])

        service = Google::Apis::CalendarV3::CalendarService.new
        service.authorization = client

        @calendar_list = service.list_calendar_lists
      end
    end
  end
end

所经过的路线:

collection do
  post :retrieve_events
end

一旦它在不处于 API 模式的 Rails 应用程序中运行。然后你通过谷歌控制台并获得授权返回。

如何使用 JSON API 访问 URL 使其变得同样顺利:

api/v1/events/retrieve_events

ruby-on-rails ruby authorization google-calendar-api
1个回答
0
投票

你做错了一点,你必须这样做

@event_list = client.list_events(params[:calendar_id])

因为你正在尝试获取谷歌用户事件

© www.soinside.com 2019 - 2024. All rights reserved.