Вложенные параметры модели во время публикации HTML - PullRequest
8 голосов
/ 04 июня 2009

Я играю с вызовом моего контроллера rails, используя HTTP POST. Я могу заставить его работать с такой командой curl, учитывая модель с именем item и атрибут в этом элементе с именем name:

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

Что меня интересует, так это то, как сделать тот же вызов, используя текст вместо xml, как мой тип содержимого ....

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

но это, кажется, передает параметр 'name' как область верхнего уровня; так что это не заканчивается в моих параметрах в контроллере ....

Я новичок в этом; просто хочу понять как это сделать в обе стороны ....

Спасибо!

Ответы [ 2 ]

12 голосов
/ 04 июня 2009

Краткий ответ, нужно

(a) отправьте его как -H «Тип содержимого: application / x-www-form-urlencoded».

(b) указать параметры как Object [field] = value - например, User [name] будет ссылаться на поле имени в некотором пользовательском объекте.

(c) [Не требуется, потому что вы используете curl] кодировать параметры и POST / PUT их.


Кодирование параметров

Кодировка достаточно проста, и, хотя curl сделает это за вас, полезно разобраться. Я процитировал выдержку из спецификации W3C ... «

application / x-www-form-urlencoded

Это тип содержимого по умолчанию. Формы, представленные с этим типом содержимого, должны быть закодированы следующим образом:

  1. Имена и значения элементов управления экранированы. Символы пробела заменяются на +', and then reserved characters are escaped as described in [RFC1738], section 2.2: Non-alphanumeric characters are replaced by% HH ', знак процента и две шестнадцатеричные цифры, представляющие код символа ASCII. Разрывы строк представляются в виде пар "CR LF" (т. Е. `% 0D% 0A ').

  2. Имена / значения элементов управления перечислены в порядке их появления в документе. Имя отделяется от значения =' and name/value pairs are separated from each other by & '.

"

Простой пример (форма нового пользователя)

В приведенном ниже примере показано, как отправить простую форму «Новый пользователь».

Если в объекте пользователя есть поля для имени, пароля, адреса электронной почты и т. Д., Я указываю их следующим образом ...

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

тогда керл избежит их, чтобы дать ...

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

... прежде чем публиковать их как этот отрывок из свалки ...



Свалка проволочной акулы


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
2 голосов
/ 07 июня 2009

«Content-type: application / x-www-form-urlencoded» уже используется по умолчанию с curl -d, больше ничего не нужно

-X POST является излишним, так как -d подразумевает POST

-d не URL кодирует данные. Чтобы заставить curl сделать это для вас, вам нужно использовать --data-urlencode вместо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...