restclient rails ruby-on-rails http rest curl

ruby on rails - rails - Parámetros del modelo anidado durante una publicación en HTML



ruby curl (2)

He estado jugando con llamar a mi controlador de rieles utilizando HTTP POST. Puedo hacer que funcione con un comando curl como este, dado un modelo llamado elemento y un atributo en ese elemento llamado nombre:

curl -X POST -d "<item><name>myname</name></item>" -H "Content-Type: text/xml" http://localhost:3000/items.xml

Lo que me interesa es cómo hacer la misma llamada usando texto en lugar de xml como mi tipo de contenido ... Intenté:

curl -X POST -d "name=myname" http://localhost:3000/items.xml

pero parece que pasa el parámetro ''nombre'' como el alcance de nivel superior; por lo que no termina en mis parámetros en el controlador ...

Soy un novato en esto; solo quiero entender cómo hacerlo en ambos sentidos ...

¡Gracias!


Respuesta corta, necesitas

(a) enviarlo como -H "Tipo de contenido: application / x-www-form-urlencoded".

(b) especifique los parámetros como Objeto [campo] = valor - por ejemplo, Usuario [nombre] se referiría al campo de nombre en algún objeto de usuario.

(c) [No es obligatorio porque usa curl] codifica los parámetros y POST / PUT.


Codificando los parámetros

La codificación es lo suficientemente simple y aunque curl lo hará por ti, es útil entenderlo. He citado un extracto de la especificación W3C ... "

application / x-www-form-urlencoded

Este es el tipo de contenido predeterminado. Los formularios enviados con este tipo de contenido se deben codificar de la siguiente manera:

  1. Los nombres y valores de control se escapan. Los caracteres espaciales se reemplazan por +'', and then reserved characters are escaped as described in [RFC1738], section 2.2: Non-alphanumeric characters are replaced by % HH'', un signo de porcentaje y dos dígitos hexadecimales que representan el código ASCII del carácter. Los saltos de línea se representan como pares "CR LF" (es decir, `% 0D% 0A '').

  2. Los nombres / valores de control se enumeran en el orden en que aparecen en el documento. El nombre está separado del valor por ='' and name/value pairs are separated from each other by &''.

"

Ejemplo simple (formulario de usuario nuevo)

El siguiente ejemplo es cómo enviar un formulario simple de "Usuario nuevo".

Si tengo campos en el objeto de usuario para nombre, contraseña, correo electrónico, etc., los especifico así ...

user[firstname]=chris&user[login]=cmccauley&user[company_id]=8&user[email]=&user[surname]=mccauley

luego se les escapará el rizo para dar ...

user%5Bfirstname%5D=chris&user%5Blogin%5D=cmccauley&user%5Bcompany_id%5D=8&user%5Bemail%5D=&user%5Bsurname%5D=mccauley

... antes de publicarlos como este extracto de un vertedero de cables ...



Volcado de Wireshark


POST /users/19 HTTP/1.1 Host: localhost:3000 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://localhost:3000/users/19/edit Cookie: _my_session=048d330143de668e027c8cd52654e8c5 Content-Type: application/x-www-form-urlencoded Content-Length: 259 user%5Bfirstname%5D=chris&user%5Blogin%5D=cmccauley&user%5Bcompany_id%5D=8&user%5Bemail%5D=&user%5Bsurname%5D=mccauley&user_password=********&user%5Bjob_id%5D=14&user%5Bpassword%5D=dd793a64b74e108fcdc5d809040e24afcc21ad2c&authenticity_token=&id=19&_method=PUT


"Content-type: application / x-www-form-urlencoded" ya está predeterminado con curl -d, sin necesidad de ningún extra

-X POST es superfluo, como -d implica POST

-d no URL codifica los datos. Para que Curl haga eso por ti, debes usar --data-urlencode en su lugar