Archit Bhise
2012-Jan-16 20:38 UTC
how to send a post request and receive json back in rails
I''ve looked through a fair amount of the questions - yet, I am still confused. I am making a Rails app that connects with the Healthgraph API (here http://developer.runkeeper.com/healthgraph/registration-authorization). I am supposed to make a POST request via Rails - based on a parameter I recieve and then recieve the JSON. I have tried the outh2, runkeeper and other gems and they don''t work because of a certain dependency. However, I am lost on how to POST via Rails and recieve a response. I do get the code back in my controller - however, I still don''t know how to get an access token. def rktest respond_to if params[:code] require ''oauth2'' @code=params[:code] @cc_id=client_id @client_s=client_secret else @code="None" end I''m trying to also do it via Javascript - but I''d rather not - since it leaves my client secret exposed. Also, I don''t recieve data back either. <script type="text/javascript" src="javascripts/ jquery-1.7.1.min.js"></script> <script type="text/javascript"> function get_access_token(code,ccid,cc_s){ $.ajaxSetup({ ''beforeSend'': function(xhr){ xhr.setRequestHeader("Accept", "text/javascript") } }); var sent = { ''grant_type'': ''authorization_code'', ''code'': code, ''client_id'': ccid, ''client_secret'': cc_s, ''redirect_uri'': ''http://myurl.com/rktest'' }; document.write("<p>" + sent + "</p>"); $.ajax({ url: ''https://runkeeper.com/apps/token'', data: sent, type: ''POST'', dataType: ''json'', success: function(data, status, xhr){ if (status === ''error'' || !xhr.responseText){ handleError(); }else{ document.write("<p>" + data + "</p>"); document.write("<p>" + status + "</p>"); document.write("<p>" + xhr + "</p>"); } } }); } <%= ''get_access_token(\''''+@code+''\'',\''''+@cc_id+''\'',\''''+@cc_s +''\'');'' %> </script> Also, here is my routes file currently: match ''/rktest'', :to => ''main#rktest'', :via => [:get, :post] Even this does not work. RestClient.post ''https://runkeeper.com/apps/token'', {:params => { :grant_type => ''authorization_code'', :code => @code, :client_id => ''8e9b36478b764ac38ef1bdabc6d14d60'', :client_secret => ''fb66f35c944246588db30e1288501315'', :redirect_uri => "http%3A%2F%2Fopenhealthdesigns.com%2Frktest"}} -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Robert Walker
2012-Jan-17 19:13 UTC
Re: how to send a post request and receive json back in rails
Archit Bhise wrote in post #1041310:> I''m trying to also do it via Javascript - but I''d rather not - since > it leaves my client secret exposed. Also, I don''t recieve data back > either. > > ... > ... > $.ajaxSetup({ > ''beforeSend'': function(xhr){ > xhr.setRequestHeader("Accept", "text/javascript") > } > });Here''s an decent explanation of why you JavaScript solution will not work: http://www.jquery-tutorial.net/ajax/same-origin-policy/ The same origin policy will prevent your did sending a request directly to another domain. Look into JSONP for a workaround to the same origin policy. You should, however, be able to send the request from the server side using Ruby. See open-uri for more details. Here''s one example that I found via Google: http://juretta.com/log/2006/08/13/ruby_net_http_and_open-uri/ -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.