Net::Http multiple parameters with the same name.

S

Scott Archer

I'm trying to use the Net::Http libraries to do a post request to a
java servlet.
I need to submit multiple parameters with the same name.

test=1
test=2
test=3

if I were submitting the form in html it would look something like this.
<html>
<body>
<form method="POST" action="test.servlet">
<input type="hidden" name="test" value="1" />
<input type="hidden" name="test" value="2" />
<input type="hidden" name="test" value="3" />
<input type="submit" name="submit">
</form>
</body>
</html>

This is the ruby code I am using currently.

url = URI.parse("http://localhost/test/test.servlet")
req = Net::HTTP::post.new(url.path)
req.set_form_data({'test'=>['1','2']})
res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
case res
when Net::HTTPSuccess, Net::HTTPRedirection
xml = res.body
else
res.error!
end
puts xml

In the servlet I'm doing the following
String[] values = request.getParameterValues("test");
This should return an array with the String values ["1","2","3"]
It's returning an array with one value ["123"]

I know the java code is correct. I'm trying to migrate an existing
program to ruby, however this is the only stumbling block I've come
across.

I found this reference on the mailing list but there were no replies.

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/246557

Any help would be appreciated.
 
S

Scott Archer

I updated a method in http.rb
It seems to have fixed the problem I was having.

There may be a more elegant solution. I'd love for some criticism if
someone wants to look at this.

I'd also be interested in getting this code into the ruby distribution
if it looks good. I'm new to ruby, and I don't know much about the
process.

# Set header fields and a body from HTML form data.
# +params+ should be a Hash containing HTML form data.
# Optional argument +sep+ means data record separator.
#
# This method also set Content-Type: header field to
# application/x-www-form-urlencoded.
def set_form_data(params, sep = '&')
temp = []
params.map do |k,v|
if(v.is_a? Array)
for value in v
temp << "#{urlencode(k.to_s)}=#{urlencode(value.to_s)}"
end
else
temp << "#{urlencode(k.to_s)}=#{urlencode(v.to_s)}"
end
end
self.body = temp.join(sep) #= params.map {|k,v|
"#{urlencode(k.to_s)}=#{urlencode(v.to_s)}" }.join(sep)
puts self.body
self.content_type = 'application/x-www-form-urlencoded'
end
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,534
Members
45,008
Latest member
Rahul737

Latest Threads

Top