开发者

Ruby/HTTParty: Timing out when adding feed to Google Reader using its API

I'm attempting to add a subscription to Google Reader, using it's API, however I'm getting the following error:

execution expired

I've had no problems reading (using 'get') a list of subscriptions or tags. But it times out when I attempt to add a sub (using 'post')

The code is written in Ruby on Rails and I'm using HTTParty to handle the communication with the web service.

My code is as follows (I'm still new to Ruby/Rails so sorry for any bad practices included below. I'm more than happy to have them pointed out to me):

class ReaderUser

    # Include HTTParty - this handles all the GET and POST requests.
    include HTTParty

    ...

    def add_feed(feed_url)

      # Prepare the query
      url = "http://www.google.com/reader/api/0/subscription/quickadd?client=scroll"
      query = { :quickadd => feed_url, :ac => 'subscribe', :T => @token }
      query_as_string = "quickadd=#{CGI::escape(feed_url)}&ac=subscribe&T=#{CGI::escape(@token.to_s)}"
      headers = { "Content-type" => "application/x-www-form-urlencoded; charset=UTF-8", "Content-Length" => query_as_string.length.to_s, "Authorization" => "GoogleLogin auth=#{@auth}" }

      # Execute the query
      self.class.post(url, :query => query, :headers => headers)

    end

    ...

end

For reference, this is how I'm obtaining the token:

# Obtains a token from reader
# This is required to 'post' items
def get_token

    # Populate @auth
    get_auth

    # Prepare the query
    url = 'http://www.google.com/reader/api/0/token'
    headers = {"Content-type" => "application/x-www-form-urlencoded", "Authorization" => "GoogleLogin auth=#{@auth}" }

    # Execute the query
    @token = self.class.get(url, :headers => headers)

end

# Obtains the auth value.
# This is required to obtain the token and for other queries.
def get_auth

    # Prepare the query
    url = 'https://www.google.com/accounts/ClientLogin'
    query = { :service => 'reader', :Email => @username, :Passwd => @password }

    # Execute the query
    data = self.class.get(url, :query => query)

    # Find the string positions of AUTH
    auth_index = data.index("Auth=") + 5

    # Now extract the values of the auth
    @auth = data[auth_index,data.length]

end
开发者_开发百科

I'd be happy to provide any additional information required.

Thanks in advance!


After a great deal of messing around, I've found the solution!

I simply had to set the Content-Length to "0". Previously I was setting it to the length of the 'query' as per the PHP class I was basing it on (greader.class.php). I mention this just in case someone else has the same problem.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜