# Newbie question about POSTing xml file to RESTful rails app

**URL:** <https://www.ruby-forum.com/t/newbie-question-about-posting-xml-file-to-restful-rails-app/83910>\
**Category:** Rails\
**Created:** [January 30, 2007, 6:52pm UTC](https://www.ruby-forum.com/t/newbie-question-about-posting-xml-file-to-restful-rails-app/83910 "2007-01-30T18:52:30Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![tomPorter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/71e660/32.png) [@tomPorter](https://www.ruby-forum.com/u/tomPorter)\
**Post date:** [January 30, 2007, 6:52pm UTC](https://www.ruby-forum.com/t/newbie-question-about-posting-xml-file-to-restful-rails-app/83910/1 "2007-01-30T18:52:30Z")

</div>

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.

1. I browse ‘[http://localhost:3000/widgets.xml](http://localhost:3000/widgets.xml)’ I get a nice xml file  
out:

2. 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](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   
“foobarfoobar-ness\</  
widget\>”   
[http://localhost:3000/widgets](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?

---

<div class="post-metadata">

**Author:** ![tomPorter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/71e660/32.png) [@tomPorter](https://www.ruby-forum.com/u/tomPorter)\
**Post date:** [September 25, 2007, 11:00pm UTC](https://www.ruby-forum.com/t/newbie-question-about-posting-xml-file-to-restful-rails-app/83910/2 "2007-09-25T23:00:20Z")

</div>

> 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.

–  
Rick O.  
[http://weblog.techno-weenie.net](http://weblog.techno-weenie.net)  
[http://mephistoblog.com](http://mephistoblog.com)

---

<div class="post-metadata">

**Author:** ![tomPorter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/71e660/32.png) [@tomPorter](https://www.ruby-forum.com/u/tomPorter)\
**Post date:** [September 25, 2007, 11:04pm UTC](https://www.ruby-forum.com/t/newbie-question-about-posting-xml-file-to-restful-rails-app/83910/3 "2007-09-25T23:04:07Z")

</div>

On 1/30/07, tomPorter [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> description:string’  
> out:  
> foo  
> 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   
> “foobarfoobar-ness\</  
> widget\>”   
> [http://localhost:3000/widgets](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](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.

–  
Rick O.  
[http://weblog.techno-weenie.net](http://weblog.techno-weenie.net)  
[http://mephistoblog.com](http://mephistoblog.com)

---

<div class="post-metadata">

**Author:** ![tomPorter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/71e660/32.png) [@tomPorter](https://www.ruby-forum.com/u/tomPorter)\
**Post date:** [September 25, 2007, 11:05pm UTC](https://www.ruby-forum.com/t/newbie-question-about-posting-xml-file-to-restful-rails-app/83910/4 "2007-09-25T23:05:10Z")

</div>

On Jan 30, 11:14 am, “Zack C.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 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 POSThttp://localhost:3000/widgets
> 
> –  
> Zack C.http://depixelate.com- Hide quoted text -

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!

---

<div class="post-metadata">

**Author:** ![tomPorter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/71e660/32.png) [@tomPorter](https://www.ruby-forum.com/u/tomPorter)\
**Post date:** [September 25, 2007, 11:10pm UTC](https://www.ruby-forum.com/t/newbie-question-about-posting-xml-file-to-restful-rails-app/83910/5 "2007-09-25T23:10:15Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![tomPorter](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/71e660/32.png) [@tomPorter](https://www.ruby-forum.com/u/tomPorter)\
**Post date:** [September 25, 2007, 11:09pm UTC](https://www.ruby-forum.com/t/newbie-question-about-posting-xml-file-to-restful-rails-app/83910/6 "2007-09-25T23:09:41Z")

</div>

On 1/30/07, Rick O. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > ```
> > 'cd mra'
> > 
> > <description>foo-ness</description>
> > 
> > ```
> > 
> > POST an XML file and generate a new widget? I do not think the  
> > If I need to add code to parse the input XML file, where is the best  
> > formats (atom, svn xml, json, whatever), you’ll have to write your own  
> > param parser.
> 
> –  
> Rick O.  
> [http://weblog.techno-weenie.net](http://weblog.techno-weenie.net)  
> [http://mephistoblog.com](http://mephistoblog.com)
> 
> >

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](http://localhost:3000/widgets)

–  
Zack C.  
[http://depixelate.com](http://depixelate.com)
