2010-06-08 67 views
4

我想通过RestClient ruby​​ API将JSON数据发送到Sinatra应用程序。使用RestClient和Sinatra发送和接收JSON

在客户端(client.rb)(使用RESTClient实现API)

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

在服务器(西纳特拉)

require "rubygems" 
require "sinatra" 


post '/solve/:data' do 

    jdata = params[:data] 

    for_json = JSON.parse(jdata) 

end 

我收到以下错误

/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 

所有我想要的是发送JSON数据并使用RestClient和Sinatra接收JSON数据。但无论我尝试什么,我都会收到上述错误。我坚持了3个小时。请帮助

回答

14

您的sinatra应用程序与http://localhost:4567/solve URL不匹配,所以它会从您的服务器返回404。

您需要通过例如改变你的末日应用:

require "rubygems" 
require "sinatra" 


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

你有一个问题,你的RESTClient实现的要求了。您需要定义jdata的参数名称。

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

我用你的代码做了。但我仍然得到这个概率 – Anand 2010-06-08 12:39:00

+0

我没有重新启动我的sintara服务器..多数民众赞成的概率..;)你的代码工作像甜 – Anand 2010-06-08 13:57:09

0

试试这个:

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

然后试试这个:

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

我没有测试它,但也许你应该值发送JSON数据,而不是一个关键。有可能你的数据如下所示:{:key =>'我是一个值'} => nil。你的数据不一定必须在URL中。你不需要/解决/:数据网址。 POST值不会在URL 调试你在你的路线收到什么好办法来送是打印PARAMS:

puts params 

希望这有助于!