Newbie question about POSTing xml file to RESTful rails app

I have a newbie question about creating a new item using REST in rails 1.2.

1. I created my project:     'rails mra -d sqlite3'

2. I generate all I can:     'cd mra'     'script/generate scaffold_resource widget name:string description:string'

3. I create database stuff:     'rake db:migrate'

4. I now have a basic app:     'script/server'

I create a couple of widgets using the basic scaffolding forms.

5. I browse 'http://localhost:3000/widgets.xml’ I get a nice xml file out:     <?xml version="1.0" encoding="UTF-8" ?>       <widgets>         <widget>           <description>baz-ness</description>           <id type="integer">1</id>           <name>baz</name>         </widget>         <widget>           <description>foo-ness</description>           <id type="integer">2</id>           <name>foo</name>         </widget>       </widgets>

6. I can use curl to POST a new widget to the app:     'curl -d "widget[name]=bar" -d "widget[description]=bar-ness" \           http://localhost:3000/widgets

With a default app generated this way, is there a way to use curl to POST an XML file and generate a new widget? I do not think the 'create' method in widgets_controller.rb distinguishes between the two URL's used for a POST (/widgets and /widgets.xml) as far as how input is handled, and I am not sure how params[:widget] is populated (other than knowing that it is not populated correctly when I try something like this:   'curl -X POST -d \   "<widget><name>foobar</name><description>foobar-ness</description></

" \

  http://localhost:3000/widgets

If I need to add code to parse the input XML file, where is the best place to code this, as a helper method?

No code needed, check out Beast for a simple, working example.

http://weblog.techno-weenie.net/2006/12/12/taking-ares-out-for-a-test-drive

map.resources automatically recognizes urls with formats (extensions like xml and js by default). XML has a default param parser that uses the xmlsimple lib to parse that xml into a hash in params[:widget]. Your controller code should stay the same then. If you have custom formats (atom, svn xml, json, whatever), you'll have to write your own param parser.

You also might use the filename notation with curl to avoid having to type the xml message on the command line. Just create a file new_widget.xml and then send it using curl:

curl -H "Content-Type: text/xml" -d @new_widget.xml -X POST http://localhost:3000/widgets

Thanks to both Zack and Rick.

I found that I was not indicating that my Content-Type as 'text/xml' in my curl command, and that is what is needed to trigger the XML parsing.

Pretty cool stuff!

Thanks to both Zack and Rick.

I found that I was not indicating that my Content-Type as 'text/xml' in my curl command, and that is what is needed to trigger the XML parsing.

Pretty cool stuff!

Just adding .xml to the filename works too. You don't have to specificially set content-type or accepts AFAIK.

I will have to experiment with just submitting an XML file, but i _thought_ when I tried this w/o the Content-Type header ,it created a null widget: ID only blank attributes.