6

我正在尝试使用 Ruby gem RestClient 更新我的一个 Fusion Tables 的样式。

这是我的代码:

require 'rest_client'

tableId = '<STRING CONTAINING TABLEID>'
styleId = '<STRING CONTAINING STYLEID>'
key = '<STRING CONTAINING MY FUSION TABLES API KEY>'

table_url = "https://www.googleapis.com/fusiontables/v1/tables/#{tableId}/styles/#{styleId}?key=#{key}"
update = '{"polygonOptions": {"strokeColor":"#ffffff"}}'

token = 'STRING CONTAINING AUTHORIZATION TOKEN'

RestClient.put table_url,update,{"Authorization" => "Bearer #{token}"}

当我运行该代码时,我收到此错误:

C:/Ruby193/lib/ruby/gems/1.9.1/gems/rest-client-1.6.7/lib/restclient/abstract_response.rb:48:in `return!': 400 Bad Request (RestClient::BadRequest)
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/rest-client-1.6.7/lib/restclient/request.rb:230:in `process_result'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/rest-client-1.6.7/lib/restclient/request.rb:178:in `block in transmit'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:745:in `start'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/rest-client-1.6.7/lib/restclient/request.rb:172:in `transmit'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/rest-client-1.6.7/lib/restclient/request.rb:64:in `execute'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `execute'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/rest-client-1.6.7/lib/restclient.rb:80:in `put'

当我将update代码输入Google 的官方 Style request PUT maker thingie时,更新工作。但是当我运行我的 Ruby 代码时它不起作用。

有谁知道我做错了什么?

编辑:我从添加中获得的额外输出RestClient.log = logger

RestClient.put "https://www.googleapis.com/fusiontables/v1/tables/<MY TABLE ID HERE>/styles/4?key=<AND HERE'S WHERE MY FUSION TABLE API KEY GOES>", "{\"polygonOptions\":{\"strokeColor\":\"#ffffff\"}}", "Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate", "Authorization"=>"Bearer <THIS CONTAINS THE BEARER STRING>", "Content-Length"=>"44"
# => 400 BadRequest | application/json 255 bytes
4

6 回答 6

4

您确实应该使用google-api-ruby-client库,而不是构建自己的 REST 调用。该库为您抽象了许多 OAuth 内容和参数格式。

话虽如此,您能否为您的 RestClient 启用调试并发布 RestClient 调用的输出以及 Google 官方 PUT 制造商的输出(我喜欢您那里的技术术语)?比较两者应该可以显示它们的不同之处以及谷歌不喜欢你的地方。

于 2013-02-03T13:21:05.917 回答
4

在回答您关于在没有 Rails 的情况下设置记录器的问题时,请在@Jay Lee 回答的评论中......</p>

这是一个设置为输出到标准输出的记录器:

logger = Logger.new STDOUT
logger.level = Logger::WARN # INFO/DEBUG… whatever level you find is needed
logger.datetime_format = '%a %d-%m-%Y %H%M '

然后将其余代码放入控制台(例如 IRB)并在最后一行之前添加:

RestClient.log = logger

你应该得到一些有用的信息输出到终端。有关可用级别的更多信息,请参阅Logger 类的文档。

于 2013-02-06T00:58:23.113 回答
4

我认为问题在于您没有将内容类型设置为 application/json。尝试做这样的事情:

RestClient.put(table_url, update, {"Authorization" => "Bearer #{token}", "Content-type" => "application/json"})

在这种情况下,有效负载需要是 json,因此您可以使用示例中的 json-string 或在数据结构上运行 to_json。

于 2013-02-07T17:17:29.983 回答
2

可能是因为你的哈希在这里

update = '{"polygonOptions": {"strokeColor":"#ffffff"}}'

应该是

update = {"polygonOptions" => {"strokeColor" => "#ffffff"}}

祝你好运!

于 2013-02-06T01:23:08.540 回答
1

供参考,

尝试的替代方案:

1)在项目设置和令牌再生中删除HTTPS请求。

2) 在这种情况下尝试使用 SSL。

3) 有时当值超过 255 个字符时会发生此错误,这可能与您有关。同样的问题在某个时候发生在某人身上,并在调试后得到解决。检查链接以获取更多信息。

于 2013-02-07T12:57:21.337 回答
0

我遇到了同样的 400 Bad Request 问题,特别是在发布样式时。我能够通过确保样式中“种类”的任何值都被命名空间来解决这个问题,文档中的示例并不总是正确的——例如:

{
     ...
     "kind": "fusiontables#buckets"
     ...
}

而不仅仅是“桶”。

于 2013-04-30T00:22:42.917 回答