Отправка и получение JSON с помощью RestClient и Sinatra

Я пытаюсь отправить данные JSON в приложение Sinatra с помощью Ruby API RestClient.

На клиенте (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 и получить данные JSON обратно, используя RestClient и Sinatra... но что бы я ни пытался, я получаю указанную выше ошибку. Я застрял с этим в течение 3 часов. Пожалуйста помоги


person Anand    schedule 08.06.2010    source источник


Ответы (2)


Ваше приложение Sinatra не соответствует URL-адресу http://localhost:4567/solve, поэтому оно возвращает ошибку 404. с вашего сервера.

Вам нужно изменить приложение Sinatra, например:

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}
person shingara    schedule 08.06.2010
comment
я не перезапускал свой сервер sintara .. вот в чем проблема .. ;) ваш код работал отлично - person Anand; 08.06.2010

Попробуй это:

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 => 'I am a value'} => nil. Ваши данные вообще не обязательно должны быть в URL. Вам не нужен /solve/: URL-адрес данных. Значения POST не должны отправляться в URL-адресе. Хороший способ отладить то, что вы получаете в своем маршруте, — распечатать параметры:

puts params

Надеюсь это поможет!

person claudiut    schedule 19.10.2011