6

Ruby gem RestClient を使用して、フュージョン テーブルの 1 つのスタイルを更新しようとしています。

これが私のコードです:

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'

Google の公式 Style request PUT maker thingieupdateにコードを入力すると、更新が機能します。しかし、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

問題は、content-typeを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 に答える
4

独自の REST 呼び出しを作成する代わりに、 google-api-ruby-clientライブラリを使用する必要があります。このライブラリは、多くの OAuth とパラメーターのフォーマットを抽象化します。

そうは言っても、RestClient のデバッグを有効にして、RestClient 呼び出しの出力を Google の公式 PUT メーカーのもの (技術用語が好きです) からの出力と一緒に投稿できますか? この 2 つを比較すると、両者の違いと、Google が気に入らない点がわかるはずです。

于 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 に答える
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 に答える