2013-01-28 10 views
6

Sto tentando di aggiornare uno stile per uno dei miei Fusion Tables utilizzando la gemma Ruby RestClient.Fusion Tables: Perché continuo a ricevere un errore "400 Bad Request" quando provo ad aggiornare uno stile di tabella tramite Ruby's RestClient gem

Ecco il mio codice:

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}"} 

Quando eseguo che il codice, ottengo questo errore:

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' 

Quando ho immettere il codice update in Google's official Style request PUT maker thingie, l'aggiornamento funziona. Ma non funziona quando eseguo il mio codice Ruby.

Qualcuno sa cosa sto facendo male?

EDIT: uscita Extra ottengo di aggiungere in 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

Quale messaggio torni da Google? – Pafjo

+0

Il tuo token è ancora valido? Esempio di come convalidare un token OAuth: https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=your_token – Pafjo

+0

@Pafjo, sì ho controllato, e l'oggetto JSON che l'URL ha restituito ha mostrato che il token era ancora valido – user1626730

risposta

4

Si dovrebbe utilizzare la biblioteca google-api-ruby-client invece di costruire le proprie chiamate REST. La libreria astrae molte cose di OAuth e la formattazione dei parametri per te.

Detto questo, puoi enable debugging for your RestClient e postare l'output della chiamata RestClient insieme all'output di Google thing maker ufficiale di Google PUT (mi piace il tuo gergo tecnico lì)? Confrontando i due si dovrebbe mostrare come si differenziano e ciò che Google non piace con il tuo.

+0

Hm, quell'esempio usa Ruby on Rails. Devo fare la stessa cosa in Ruby regolare per abilitare il debug? – user1626730

+0

Per quanto riguarda 'google-api-ruby-client', non riesco a capirlo esattamente (ancora), anche se suppongo che questo sia ciò che StackOverflow è per. Ogni volta che inizializzo un nuovo client, ottengo un 'W, [2013-02-04T16: 21: 40.128897 # 4680] WARN -: Google :: APIClient - Fornire: nome_applicazione e: application_version durante l'inizializzazione del client', anche quando specificherò il nome dell'API e il numero di versione, per esempio. – user1626730

4

In risposta alla tua domanda circa la creazione di un logger, senza Rails, nei commenti alla risposta di @Jay Lee ...

Ecco un registratore istituito per output in maniera standard:

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 ' 

Poi mettere il resto del codice in una console (ad esempio, IRB) e prima l'ultima riga aggiungere:

RestClient.log = logger 

e si dovrebbe ottenere un output informazioni utili al terminale. Vedi the documents for the Logger class per ulteriori informazioni sui livelli disponibili.

+0

Ho aggiornato la mia domanda con questo – user1626730

+0

@ user1626730 hai provato ad alzare il livello del registro da 'WARN' a' INFO' o 'DEBUG' per ottenere maggiori informazioni? (scusa, avrei dovuto chiarire che potevi farlo, l'ho aggiunto alla risposta). – iain

2

Potrebbe essere perché il vostro hash qui

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

dovrebbe probabilmente essere

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

Buona fortuna!

+0

Nah, non funziona. 'update' dovrebbe essere letto da Fusion Tables API come JSON. – user1626730

+0

@ user1626730 anche così, potresti provare a usare l'hash di engineerDave e poi chiamare '.to_json' su di esso invece di scrivere il tuo come non sei un parser JSON :) cioè non fare cose che il computer può fare per te è un buon modo per introdurre bug. '{" polygonOptions "=> {" strokeColor "=>" #ffffff "}}. to_json' – iain

+0

Hm ... dang, non ha funzionato. Ho modificato la riga in 'update = {" polygonOptions "=> {" strokeColor "=>" # ffffff "}}. To_json', ma otteniamo comunque un errore" 400 Bad Request "... – user1626730

1

FYI,

Alternative da provare:

1) Rimuovere richiesta HTTPS nelle impostazioni del progetto e la rigenerazione token.

2) Provare a utilizzare SSL in questo caso.

3) A volte questo errore si verifica quando i valori superano più di 255 caratteri che potrebbero essere la possibilità qui con voi. Lo stesso problema si è verificato qualche volta con qualcuno ed è stato risolto dopo il debug. Controlla il link per ulteriori informazioni.

+0

# 1: Sostituzione 'https 'con' http ', o semplicemente rimuovendo' http (s): // ', mi viene restituito un errore '403 Proibito'. – user1626730

+0

# 2: Sai come lo farei con Ruby? – user1626730

+0

# 3: in base al nuovo output del registro 'RestClient', la lunghezza del contenuto sembra essere di 44 caratteri ... – user1626730

3

Penso che il problema è che non si sta impostando il tipo di contenuto su application/json. Provare a fare qualcosa di simile:

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

Il carico utile in questo caso deve essere JSON modo è possibile utilizzare il JSON-stringa dal vostro esempio o eseguire to_json su di voi struttura di dati.

+0

Hm, no, aggiungendo che mi ha appena dato un errore '401 Non autorizzato ', sfortunatamente ... – user1626730

+0

Strano! Ha funzionato quando l'ho provato. Con quale messaggio ha risposto Google? – Pafjo

+0

A proposito, quando ho provato, ho usato ClientLogin invece di usare un token OAuth in modo che il mio Authorization-header fosse così: GoogleLogin auth = a-really-long-auth-token – Pafjo

0

Stavo avendo lo stesso 400 problema di richiesta errata, in particolare durante la pubblicazione degli stili. Sono stato in grado di risolvere il problema facendo in modo qualsiasi valore per "genere" in stile sono stati namespace, che gli esempi nella documentazione non sempre ottenere il diritto - per esempio:

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

Invece di limitarsi a " secchi".