我正在尝试使用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's official 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
答案 0 :(得分:4)
你真的应该使用google-api-ruby-client库而不是构建自己的REST调用。该库为您提取了大量OAuth内容和参数格式。
话虽如此,您可以enable debugging for your RestClient并发布RestClient调用的输出以及Google官方PUT制造商的输出(我喜欢你的技术术语)吗?比较两者应该显示它们之间的差异以及Google与您的不同之处。
答案 1 :(得分:4)
在回答你关于在没有Rails的情况下设置记录器的问题时,在@Jay Lee回答的评论中......
这是一个设置为输出到标准输出的记录器:
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
你应该得到一些有用的信息输出到终端。有关可用级别的更多信息,请参阅the documents for the Logger class。
答案 2 :(得分:4)
我认为问题在于您没有将内容类型设置为application / json。尝试做这样的事情:
RestClient.put(table_url, update, {"Authorization" => "Bearer #{token}", "Content-type" => "application/json"})
在这种情况下,有效负载需要是json,因此您可以使用示例中的json-string或在数据结构上运行to_json。
答案 3 :(得分:2)
可能是因为你的哈希
update = '{"polygonOptions": {"strokeColor":"#ffffff"}}'
应该是
update = {"polygonOptions" => {"strokeColor" => "#ffffff"}}
祝你好运!
答案 4 :(得分:1)
FYI,
尝试的替代方法:
1)删除项目设置和令牌重新生成中的HTTPS请求。
2)在这种情况下尝试使用SSL。
3)有时,如果值超过255个字符,则可能会出现此错误。某人在某个时候发生了同样的问题并在调试后得到了解决。有关详细信息,请查看link。
答案 5 :(得分:0)
我遇到了相同的400 Bad Request问题,特别是在发布样式时。我能够通过确保样式中“kind”的任何值都是命名空间来解决问题,而文档中的示例并不总是正确的 - 例如:
{
...
"kind": "fusiontables#buckets"
...
}
而不只是“桶”。