Недопустимая ошибка json при попытке запроса API-интерфейса google calendar с токеном доступа из приложения Ruby on Rails - PullRequest
1 голос
/ 08 ноября 2011

Я пытаюсь настроить приложение Rails для подключения к API календаря Google.Я следую документации по Oauth2 здесь:

http://code.google.com/apis/accounts/docs/OAuth2.html#SS

и инструкциям по созданию отдельного события в личном календаре пользователя здесь:

http://code.google.com/apis/calendar/data/2.0/developers_guide_protocol.html#CreatingSingle

Мне удалось сгенерировать токены доступа и обновления Oauth2, используя стратегию на стороне сервера, но всякий раз, когда я запрашиваю API, я получаю следующую ошибку:

{"apiVersion": "2.6", "error": {" code ": 400," message ":" Invalid JSON "," errors ": [{" domain ":" GData "," code ":" invalidJson "," internalReason ":" Invalid JSON "}]}}

(Это та же ошибка, что и в этой теме http://groups.google.com/group/google-calendar-help-dataapi/browse_thread/thread/2171226629b28c3b, за исключением того, что я передаю GData-Version: 2 в заголовок сообщения http, поэтому apiVersion отличается)

Json, который я использую, является примером данных о событиях, приведенных в документе протокола во второй ссылочной ссылке выше.Насколько я могу судить, это обычно происходит после второго раза, когда я запрашиваю API после получения перенаправления 302.Буду очень признателен, если кто-нибудь объяснит, что означает эта ошибка и как ее обойти.Я включил соответствующий код из моего приложения ниже:

EventController.rb

event_hash = { :data => {
                 :title => "Tennis with Beth",
                 :details => "Meet for a quick lesson.",
                 :transparency => "opaque",
                 :status => "confirmed",
                 :location => "Rolling Lawn Courts",
                 :when => [{
                   :start => "2012-04-17T15:00:00.000Z",
                   :end => "2012-04-17T17:00:00.000Z"
                   }]
                }
              }

event_data = event_hash.to_json

auth_string = "Bearer " + google_oauth2_credential.access_token # gets access token for user
header_hash = { 'Content-Type' => 'application/json', 'Authorization' => auth_string, 'GData-Version' => '2' }

response = post_to_https('https://www.google.com/calendar/feeds/default/private/full', event_data, header_hash) # note see ApplicationController paste below to see the post_to_https method

if response.code == '302'
  uri_string = response.response['Location']
  response = post_to_https(uri_string, event_data, header_hash)
  render :text => "302 " + response.body
else
    render :text => "not 302 " + response.body)
end

ApplicationController.rb

def post_to_https(url_string, params_hash, header_hash = {})
  uri = URI.parse(url_string)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  request = Net::HTTP::Post.new(uri.request_uri)
  request.set_form_data(params_hash)

  unless header_hash.empty?
    header_hash.each { |key, value| request[key] = value }
  end
  return http.request(request)
end

1 Ответ

1 голос
/ 17 декабря 2011

Большинство проблем, которые вы здесь обсуждаете, не должны возникать, если вы используете последнюю версию API и клиентскую библиотеку Ruby, как описано здесь:

http://code.google.com/apis/calendar/v3/using.html#setup

page_token = nil
result = result = client.execute(:api_method => service.events.list,
                                 :parameters => {'calendarId' => 'primary'})
while true
  events = result.data.items
  events.each do |e|
    print e.summary + "\n"
  end
  if !(page_token = result.data.next_page_token)
    break
  end
  result = result = client.execute(:api_method => service.events.list,
                                   :parameters => {'calendarId' => 'primary', 'pageToken' => page_token})
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...