# HTTPClient, problemi con put e delete

**URL:** <https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012>\
**Category:** IT\
**Created:** [June 27, 2012, 5:53pm UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012 "2012-06-27T17:53:34Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![aris](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/258eb7/32.png) [@aris](https://www.ruby-forum.com/u/aris)\
**Post date:** [June 27, 2012, 5:53pm UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/1 "2012-06-27T17:53:34Z")

</div>

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:

@clnt = HTTPClient.new  
res = @clnt.put(“[http://localhost:3001/api/v1/pippe/#{options[:id]}](http://localhost:3001/api/v1/pippe/#%7Boptions%5B:id%5D%7D)”,  
{:auth\_token =\> @auth\_token}.merge(options[:dati]))

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

Qualcuno ha qualche idea?

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 27, 2012, 6:36pm UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/2 "2012-06-27T18:36:04Z")

</div>

E’ un baco di HTTPClient:

#lib\httpclient.rb  
#ho modificato il metodo create\_request (riga 965)  
aggiungendo questo codice:

```
  elsif ['DELETE', 'PUT'].include? method
    header << ['Content-Type', 'application/x-www-form-urlencoded']

```

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)

Comunque ho risolto, ciao

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 27, 2012, 7:15pm UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/3 "2012-06-27T19:15:34Z")

</div>

Ciao Simone, in effetti ho dovuto modificare anche la chiamata del  
delete:

def delete(uri, \*args, &block)  
request(:delete, uri, argument\_to\_hash(args, :body, :header),  
&block)  
end

…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

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 27, 2012, 6:49pm UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/4 "2012-06-27T18:49:03Z")

</div>

Dando un veloce sguardo alla libreria che hai usato, ci sono due  
problemi  
con la tua soluzione:

1. HTTPClient non accetta body per le chiamate DELETE (quindi  
quell’header  
inutile e potenzialmente errato)

# Sends DELETE request to the specified URL. See request for

arguments.

def delete(uri, \*args, &block)  
request(:delete, uri, argument\_to\_hash(args, :header), &block)  
end

1. Secondo l’implementazione, l’ordine dei parametri uri, body, header

# Sends PUT request to the specified URL. See request for arguments.

def put(uri, \*args, &block)  
request(:put, uri, argument\_to\_hash(args, :body, :header), &block)  
end

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.

– Simone

2012/6/27 Marco M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> Non so se un problema noto, io non ho trovato nulla. In questi casi si

–  
Simone C.  
Application Developer

Site & Blog: [http://www.simonecarletti.com/](http://www.simonecarletti.com/)  
LinkedIn: [http://linkedin.com/in/weppos](http://linkedin.com/in/weppos)  
Skype: weppos

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 27, 2012, 7:28pm UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/5 "2012-06-27T19:28:48Z")

</div>

2012/6/27 Marco M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> …non ho capito perch non stato previsto il body.

Le specifiche HTTP 1.0 n lo vietano n lo consentono. Non saprei le 1.1.  
Di norma viene omesso (la maggior parte dei server HTTP lo ignora).

Mi viene da chiedere a cosa ti serva un body per cancellare una risorsa.  
Quali parametri hai necessit di passare?

–  
Simone C.  
Application Developer

Site & Blog: [http://www.simonecarletti.com/](http://www.simonecarletti.com/)  
LinkedIn: [http://linkedin.com/in/weppos](http://linkedin.com/in/weppos)  
Skype: weppos

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 28, 2012, 9:44am UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/6 "2012-06-28T09:44:09Z")

</div>

Per utilizzare l’api è necessario fornire il token di autenticazione: il  
parametro che devo allegare a tutte le chiamate compresa la delete.

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 28, 2012, 10:45am UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/7 "2012-06-28T10:45:58Z")

</div>

Grazie, stavo diventando matto a trovare quel warning!  
Comunque non devo passare il token di rails ma quello per  
l’autenticazione in devise.

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 28, 2012, 9:53am UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/8 "2012-06-28T09:53:16Z")

</div>

Non necessario. Se vai a vedere il sorgente del modulo  
RequestForgeryProtection[https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action\_controller/metal/request\_forgery\_protection.rb](https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_controller/metal/request_forgery_protection.rb),  
nello  
specifico il metodo  
verify\_authenticity\_token[https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action\_controller/metal/request\_forgery\_protection.rb#L75](https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_controller/metal/request_forgery_protection.rb#L75)  
noterai  
che dipende dal controllo

```
  def verified_request?

    !protect_against_forgery? || request.get? ||
      form_authenticity_token == 

```

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.

– Simone

2012/6/28 Marco M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> Per utilizzare l’api necessario fornire il token di autenticazione: il  
> parametro che devo allegare a tutte le chiamate compresa la delete.
> 
> –  
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).
> 
> * * *
> 
> Ml mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–  
Simone C.  
Application Developer

Site & Blog: [http://www.simonecarletti.com/](http://www.simonecarletti.com/)  
LinkedIn: [http://linkedin.com/in/weppos](http://linkedin.com/in/weppos)  
Skype: weppos

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 28, 2012, 10:56am UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/9 "2012-06-28T10:56:24Z")

</div>

Sono quasi sicuro che anche devise accetti authenticazione via header o  
querystring. 🙂

2012/6/28 Marco M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> 

–  
Simone C.  
Application Developer

Site & Blog: [http://www.simonecarletti.com/](http://www.simonecarletti.com/)  
LinkedIn: [http://linkedin.com/in/weppos](http://linkedin.com/in/weppos)  
Skype: weppos

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 28, 2012, 12:25pm UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/10 "2012-06-28T12:25:49Z")

</div>

Ecco, come non detto 🙂  
Grazie

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [June 28, 2012, 12:38pm UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/11 "2012-06-28T12:38:50Z")

</div>

Simone, ho letto il tuo blog e ti ho mandato una mail, l’indirizzo con  
.name finale

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [July 16, 2012, 4:24pm UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/12 "2012-07-16T16:24:22Z")

</div>

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:

@clnt.post(“#{@server}/api/users/sign\_in”, {“user\_login[email]” =\>  
@user\_login, “user\_login[password]” =\> password})

E’ un alternativa ma forse preferivo la precedente dove bastava fornire  
il token.

Comunque, stavo provando ad accedere con token nell’header seguendo gli  
esempi della documentazione:

> <https://github.com/nahi/httpclient/blob/master/sample/howto.rb>

puts clnt.get(target, nil, { “auth\_token” =\> “eFRv9Jh5j6dzVxLxjQ6D”  
}).content

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:

def get(uri, \*args, &block)  
request(:get, uri, argument\_to\_hash(args, :query, :header,  
:follow\_redirect), &block)  
end

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [July 17, 2012, 2:19pm UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/13 "2012-07-17T14:19:43Z")

</div>

Sembra che devise che non supporti l’autenticazione con token su header,  
non ho indagato molto, ho risolto così:

> <https://gist.github.com/marcomd/3129118>

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [July 19, 2012, 9:23am UTC](https://www.ruby-forum.com/t/httpclient-problemi-con-put-e-delete/221012/14 "2012-07-19T09:23:41Z")

</div>

Giusto per completare il quadro, quà si parla di devise e token su  
header:  
[https://groups.google.com/forum/?fromgroups#!topic/plataformatec-devise/o3Gqgl0yUZo](https://groups.google.com/forum/?fromgroups#!topic/plataformatec-devise/o3Gqgl0yUZo)
