Net :: HTTP не удалось получить доступ к API данных Списка документов Google - PullRequest
0 голосов
/ 08 сентября 2011

Я пытаюсь использовать API данных Списка документов Google версии 3.0, используя Net :: HTTP в ruby, используя следующий код.

require 'net/http'

spreadsheets_uri = 'http://spreadsheets.google.com/feeds/spreadsheets/private/full'
docs_uri = "https://docs.google.com/feeds/default/private/full?v=3"

def get_feed(uri, headers=nil)
  uri = URI.parse(uri)
  Net::HTTP.start(uri.host, uri.port) do |http|
    return http.get(uri.path, headers)
  end 
end

def get_headers(service)
  http = Net::HTTP.new('www.google.com', 443)
  http.use_ssl = true
  path = '/accounts/ClientLogin'
  data = "accountType=HOSTED_OR_GOOGLE&Email=#{EM}&Passwd=#{PW}&service=#{service}"
  headers = { 'Content-Type' => 'application/x-www-form-urlencoded'}
  resp, data = http.post(path, data, headers)

  headers["Authorization"] = "GoogleLogin auth=#{data[/Auth=(.*)/, 1]}"
  headers["GData-Version"] = "3.0"
  headers
end

puts get_feed(spreadsheets_uri, get_headers("wise")) 
puts get_feed(docs_uri, get_headers("writely"))

Это работает для

'http://spreadsheets.google.com/feeds/spreadsheets/private/full' 

но не для

 "https://docs.google.com/feeds/default/private/full?v=3"

который выдает следующую ошибку

/usr/local/lib/ruby/1.9.1/net/protocol.rb:135:in `read_nonblock': end of file reached (EOFError)


from /usr/local/lib/ruby/1.9.1/net/protocol.rb:135:in `rbuf_fill'
    from /usr/local/lib/ruby/1.9.1/net/protocol.rb:116:in `readuntil'
    from /usr/local/lib/ruby/1.9.1/net/protocol.rb:126:in `readline'
    from /usr/local/lib/ruby/1.9.1/net/http.rb:2219:in `read_status_line'
    from /usr/local/lib/ruby/1.9.1/net/http.rb:2208:in `read_new'
    from /usr/local/lib/ruby/1.9.1/net/http.rb:1191:in `transport_request'
    from /usr/local/lib/ruby/1.9.1/net/http.rb:1177:in `request'
    from /usr/local/lib/ruby/1.9.1/net/http.rb:888:in `get'
    from ./gd.rb:9:in `block in get_feed'
    from /usr/local/lib/ruby/1.9.1/net/http.rb:627:in `start'
    from /usr/local/lib/ruby/1.9.1/net/http.rb:490:in `start'
    from ./gd.rb:8:in `get_feed'
    from ./gd.rb:29:in `<main>'

Ответы [ 2 ]

1 голос
/ 08 апреля 2012

Вам необходимо включить опцию verify_mode в ваш запрос. Я изменил ваш метод get_feed, и он работает для меня.

def get_feed(uri, headers=nil)
  uri = URI.parse(uri)
  https = Net::HTTP.new(uri.host, uri.port)  
  https.use_ssl = true
  https.verify_mode = OpenSSL::SSL::VERIFY_NONE

  https.start do |http|
    return http.get(uri.request_uri, headers)
  end 
end
1 голос
/ 09 сентября 2011

Вы должны указать правильное имя службы для API DocsList при выполнении аутентификации с использованием ClientLogin. Вы используете service = wise для API Spreadsheet, попробуйте использовать service = writely для DocsList API.

Список названий услуг доступен по адресу http://code.google.com/apis/gdata/faq.html#clientlogin

...