2010-06-08 8 views
4

J'essaye d'envoyer une donnée JSON à une application Sinatra par RestClient ruby ​​API.Envoyer et recevoir JSON en utilisant RestClient et Sinatra

Au client (client.rb) (en utilisant l'API RESTClient)

response = RestClient.post 'http://localhost:4567/solve', jdata, :content_type => :json, :accept => :json 

au serveur (Sinatra)

require "rubygems" 
require "sinatra" 


post '/solve/:data' do 

    jdata = params[:data] 

    for_json = JSON.parse(jdata) 

end 

Je reçois l'erreur suivante

/Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient/abstract_response.rb:53:in `return!': Resource Not Found (RestClient::ResourceNotFound) 
    from /Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient/request.rb:193:in `process_result' 
    from /Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient/request.rb:142:in `transmit' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/http.rb:543:in `start' 
    from /Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient/request.rb:139:in `transmit' 
    from /Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient/request.rb:56:in `execute' 
    from /Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient/request.rb:31:in `execute' 
    from /Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient.rb:72:in `post' 
    from client.rb:52 

Tout ce que je veux est d'envoyer des données JSON et de recevoir une donnée JSON en utilisant RestClient et Sinatra..mais tout ce que j'essaie, je reçois l'erreur ci-dessus. Je suis coincé avec ça pendant 3 heures. S'il vous plaît aider

Répondre

14

Votre application sinatra, ne correspond pas à http://localhost:4567/solve URL, de sorte qu'il renvoie un 404 à partir de votre serveur.

Vous devez modifier votre application par exemple sinatra:

require "rubygems" 
require "sinatra" 


post '/solve/?' do 
    jdata = params[:data] 
    for_json = JSON.parse(jdata) 
end 

Vous avez un problème avec votre demande de RESTClient aussi. Vous devez définir le nom de params de jdata.

response = RestClient.post 'http://localhost:4567/solve', {:data => jdata}, {:content_type => :json, :accept => :json} 
+0

Je l'ai fait avec votre code. mais je reçois toujours ce problème – Anand

+0

je n'ai pas redémarré mon serveur sintara .. c'est le problème ..;) votre code a travaillé comme doux – Anand

0

Essayez ceci:

jdata = {:key => 'I am a value'}.to_json  
response = RestClient.post 'http://localhost:4567/solve', :data => jdata, :content_type => :json, :accept => :json 

Et puis essayez ceci:

post '/solve' do 
    jdata = JSON.parse(params[:data]) 
    puts jdata 
end 

Je n'ai pas testé, mais peut-être vous devriez envoyer les données JSON en tant que valeur plutôt qu'une clé. Est-il possible que vos données ressemblent à ceci: {: key => 'Je suis une valeur'} => nil. Vos données n'ont pas besoin d'être dans url du tout. Vous n'avez pas besoin de/solve /: data url. Les valeurs POST ne sont pas à envoyer dans l'URL Une bonne façon de déboguer ce que vous recevez dans votre itinéraire est d'imprimer les params:

puts params 

Hope this helps!

Questions connexes