Forum: Ruby on Rails Sending a fire&forget http request in a model class.

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
73c04e9ef9ca435c5b19a2e765ae6d20?d=identicon&s=25 Max Williams (max-williams)
on 2008-11-19 15:23
I know this is bad mvc, but i have a model class that needs to send a
request off to a web service.  At the moment i'm building a request
string with url and params, and then doing a 'system' call to call curl
with the url.  This feels pretty dirty though.  Is there a nicer way to
just fire off an http request?

thanks
max
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2008-11-19 15:37
(Received via mailing list)
On 19 Nov 2008, at 14:23, Max Williams wrote:

>
> I know this is bad mvc, but i have a model class that needs to send a
> request off to a web service.  At the moment i'm building a request
> string with url and params, and then doing a 'system' call to call
> curl
> with the url.  This feels pretty dirty though.  Is there a nicer way
> to
> just fire off an http request?
>
net/http or similar ?

Fred
4ddf8432a838f716cc499e43131e5e58?d=identicon&s=25 James Englert (Guest)
on 2008-11-20 02:13
(Received via mailing list)
Hey,
   I would check this out:
http://www.ruby-doc.org/stdlib/libdoc/net/http/rdo...

Syntax looks something like:

http = Net::HTTP.new("www.google.com")
headers, body = http.get()


Hope that help
Jim Englert
http://www.jim-rants.com/coding-blog/

On Wed, Nov 19, 2008 at 9:36 AM, Frederick Cheung <
73c04e9ef9ca435c5b19a2e765ae6d20?d=identicon&s=25 Max Williams (max-williams)
on 2008-11-20 10:38
Thanks Fred

I'm not having any luck with it so far - this is the curl call i was
making (with some changes to protect the innocent):

curl http://www.l-mail.biz/scripts/lia/lia.php \
-d l_cid='1106' \
-d l_key='cg3608898b74a4c688787ab479b8bb9f' \
-d
l_content='http://ir.chazanga.com/letter/show?encoded=MTE4MiZ...
\
-d l_pb_url='http://ir.chazanga.com/letter/confirm' \
-d l_sname='chazanga' \
-d l_rname='Max Williams' \
-d l_rcname='chazanga' \
-d l_raddress1='Suites 17 & 18' \
-d l_raddress2='9-12 Middle Street' \
-d l_rcity='Brighton' \
-d l_rpostcode='BN1 3TN' \
-d l_rcountry='3' \
-d l_email='maxilliams@chazanga.com' \
-d l_fb_emails='1' \
-d p_user_id='2054'

So, when i tried to use Net::HTTP i was trying to deal with this massive
params string.  I split it up like so:

domain = "www.l-mail.biz"

path = "/scripts/lia/lia.php"

params =
"l_cid=1106&l_key=cg3608898b74a4c688787ab479b8bb9f&l_content=http://ir.chazanga.com/letter/show?encoded=MTE4MiZ...

The params string had spaces and & signs in it, so i just replaced them
with safe characters temporarily while i played with Net::HTTP (with
escaping them properly down for a later task).

I tried this:

http = Net::HTTP.new("#{domain}")
headers, body = http.get("#{path}?#{params}")

and got a 401 (Authorisation required) error back.  I think maybe my
params weren't going through properly.
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2008-11-20 11:15
(Received via mailing list)
On 20 Nov 2008, at 09:38, Max Williams wrote:

> l_content='http://ir.chazanga.com/letter/show?encoded=MTE4MiZ...
> -d l_email='maxilliams@chazanga.com' \
>
>
> http = Net::HTTP.new("#{domain}")
> headers, body = http.get("#{path}?#{params}")

Yuck. would be a lot easier to take a hash of params (ie  {'l_cid' =>
'1106', 'l_key' => 'cg3608898b74a4c688787ab479b8bb9f', ...} and then
call to_query on it.

Net::HTTP will also do that for you, with something like

response = Net::HTTP.start(host, port) do |http|
   get = Net::HTTP::Get.new path
   get.form_data = some_hash
   get.content_type = "application/x-www-form-urlencoded"
   http.request get
end


Fred
73c04e9ef9ca435c5b19a2e765ae6d20?d=identicon&s=25 Max Williams (max-williams)
on 2008-11-20 11:57
Thanks Fred...

I totally agree, i actually build up all the params in a hash anyway.

Here it is in your recommended format.  One of the params has the
complication of actually being a full url with params itself.  Curl
seems to deal happily with this, i'm guessing it escapes everything
nicely.  But trying this, i get the same 401 error back
(#<Net::HTTPUnauthorized 401 Authorization Required readbody=true>).

host = "www.l-mail.biz"
port = 80
path = "/scripts/lia/lia.php"

param_hash = {
  :l_cid => '1106',
  :l_key => 'cg3608898b74a4c688787ab479b8bb9f',
  :l_content =>
'http://ir.chazanga.com/letter/show?encoded=MTE4MiZ...,
  :l_pb_url => 'http://ir.chazanga.com/letter/confirm',
  :l_sname => 'chazanga',
  :l_rname => 'Max Williams',
  :l_rcname => 'chazanga',
  :l_raddress1 => 'Suites 17 & 18',
  :l_raddress2 => '9-12 Middle Street',
  :l_rcity => 'Brighton',
  :l_rpostcode => 'BN1 3TN',
  :l_rcountry => '3',
  :l_email => 'maxwilliams@chazanga.com',
  :l_fb_emails => '1',
  :p_user_id => '2054'
}

response = Net::HTTP.start(host, port) do |http|
   get = Net::HTTP::Get.new path
   get.form_data = param_hash
   get.content_type = "application/x-www-form-urlencoded"
   http.request get
end
This topic is locked and can not be replied to.