Ho testato le mie api con curl e funziona tutto, ora le devo utilizzare
con un’applicazione rails ed utilizzo la gemma in oggetto con la quale
però ho qualche problema con la richiesta put (e delete solo che di
questo non ricordo i dettagli). Get e post funzionano, col metodo
put non vengono utilizzati i parametri forniti alla chiamata:
i parametri vengono passati ma è come se put non li utilizzasse, non
arriva il token e giustamente ritorna un 401
Started PUT “/api/v1/pippe/2” for 127.0.0.1 at Wed Jun 27 17:31:23 +0200
2012
Processing by Api::V1::PippeController#update as JSON
Parameters: {“id”=>“2”}
WARNING: Can’t verify CSRF token authenticity
User Load (0.0ms) SELECT “users”.* FROM “users” WHERE “users”.“id” =
1 LIMIT 1
(0.0ms) begin transaction
(0.0ms) commit transaction
Completed 401 Unauthorized in 4ms
non ho spulciato il codice ma apparentemente sembra simile:
File ‘lib/httpclient.rb’, line 595
def post(uri, body = ‘’, extheader = {}, &block)
request(:post, uri, nil, body, extheader, &block)
end
File ‘lib/httpclient.rb’, line 600
def put(uri, body = ‘’, extheader = {}, &block)
request(:put, uri, nil, body, extheader, &block)
end
ora i parametri vengono passati.
Non so se è un problema noto, io non ho trovato nulla. In questi casi si
avvisa l’autore o si crea una patch? (non sono molto pratico)
…non ho capito perchè non è stato previsto il body.
Il warning l’avevo notato ma non ho capito chi lo generava.
Ho usato la documentazione di HTTPClient anche se non è proprio
aggiornatissima, indica l’ordine che ho usato io.
Ora devo scappare, domani controllo meglio, grazie comunque
Nel codice tu fai il merge del body con gli header e li passi come primo
parametro. Questo mi fa pensare che l’errore stia nel tuo uso di
HTTPClient. L’output della console pare essere d’accordo
WARNING: Can’t verify CSRF token authenticity
User Load (0.0ms) SELECT “users”.* FROM “users” WHERE “users”.“id” =
1 LIMIT 1
(0.0ms) begin transaction
(0.0ms) commit transaction Completed 401 Unauthorized in 4ms
Apparentemente, la tua richiesta non viene mai eseguita poich quella
chiamata bloccata dall’autenticazione. Sono propenso a pensare che il
bug
non sia in HTTPClient ma nella tua chiamata.
params[request_forgery_protection_token] ||
form_authenticity_token == request.headers[‘X-CSRF-Token’]
end
verified_request? ritorna true (quindi autorizza l’esecuzione) in
diversi
casi, compreso nel caso in cui l’header http X-CSRF-Token sia presente e
corrisponda al token.
In altre parole, sufficiente nelle tue chiamate API passare il token
come
header HTTP per autorizzare la chiamata all’API, non serve simulare il
passaggio via parametro.
Quindi, almeno nel caso della DELETE, non ti serve body.
Devise salva il token in un cookie che utilizza in automatico per cui è
sufficiente il login dell’api e non serve più quindi passarlo come
parametro. Con questa soluzione però deve essere fornita user e password
per il login:
ma la chiamata è priva di quell’header ed infatti non funziona. Sto
cercando di capire se sbaglio qualcosa, la sequenza di parametri della
get coincide con l’esempio: