Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Ruby to post an XML request to a webserver

I'm afraid I've not got much experience with posting documents (e.g. XML) over web-servers, so I apologise if my understanding of HTTP is lacking.

I have a basic Mongrel web server set up in a ruby app on 127.0.0.1 port 2000. (The server).

I am running a separate Ruby app on the same computer. (The client).

I need the client to POST an XML document to the server.

I have tried using Net::HTTP to do this, but I can't find a clear example which tells me what I should do. I've had a go, but encountered errors. I have broken the request down to make it as basic as possible:

http = Net::HTTP.new("127.0.0.1", 2000)
http.post('file', 'query=foo') #xc.rb line 6

but it results in the following error

    C:/Ruby193/lib/ruby/1.9.1/net/protocol.rb:141:in `read_nonblock': An existing connection was forcibly closed by the remote host. (Errno::ECONNRESET)
    from C:/Ruby193/lib/ruby/1.9.1/net/protocol.rb:141:in `rbuf_fill'
    from C:/Ruby193/lib/ruby/1.9.1/net/protocol.rb:122:in `readuntil'
    from C:/Ruby193/lib/ruby/1.9.1/net/protocol.rb:132:in `readline'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:2562:in `read_status_line'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:2551:in `read_new'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1319:in `block in transport_request'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1316:in `catch'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1316:in `transport_request'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1293:in `request'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1286:in `block in request'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:745:in `start'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1284:in `request'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1307:in `send_entity'
    from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1096:in `post'
    from W:/Ruby/A/xc.rb:6:in `<main>'

I imagine I'm doing it totally wrong. Please can you give me an example (or point me to a tutorial) that should allow me to post some basic data, like "<tag1>text</tag1>". Hopefully, I will then be able to work out setting the appropriate headers and handling the response.

Also, I don't need to use net/http; any free method that doesn't come with extra commercial-use licencing restrictions is fine.

like image 770
SimonMayer Avatar asked Jan 31 '12 23:01

SimonMayer


1 Answers

This is incredibly easy, when using the rest-client gem

require 'rest-client'

response = RestClient.post "http://127.0.0.1:2000", "<tag1>text</tag1>", :content_type => "text/xml"
like image 163
SimonMayer Avatar answered Oct 13 '22 05:10

SimonMayer