2011-01-25 4 views
1

Моя цель - обратиться к «проблеме с потерянным обновлением» (см. http://www.w3.org/1999/04/Editing/) в операциях PUT. Я использую синатра, а в качестве клиента я использую rest_client. Как я могу проверить, работает ли это? Мой клиент всегда возвращает код 200. Я использую аргументы, чтобы правильно его называть? (PUT сам работает)sinatra rest-client etag

код Синатра:

put '/players/:id' do |id| 
    etag 'something' 
    if Player[id].nil? then 
     halt 404 
    end 
    begin 
     data = JSON.parse(params[:data]) 
     pl = Player[id] 
     pl.name = data['name'] 
     pl.position = data['position'] 
     if pl.save 
      "Resource modified." 
     else 
      status 412 
      redirect '/players' 
     end 

    rescue Sequel::DatabaseError 
     409 #Conflict - The request was unsuccessful due to a conflict in the state of the resource. 
    rescue Exception => e 
     400 
     puts e.message 
    end 
end 

клиент призывание:

player = {"name" => "John Smith", "position" => "def"}.to_json 

RestClient.put('http://localhost:4567/players/1', {:data => player, :content_type => :json, :if_none_match => '"something"'}){ |response, request, result, &block| 
    p response.code.to_s + " " + response 
} 

Я уже пробовал ставить: if_none_match => "что-то", я пробовал: if_match. Ничего не меняется. Как я могу помещать заголовки в запрос RestClient? Как получить статус sth, отличный от 200? (т.е. 304 не изменен)?

ответ

0

Ваша полезная нагрузка и заголовки находятся в одном и том же хеше. Вы должны указать заголовки для RestClient во втором хэше. Попробуйте:

player = {"name" => "John Smith", "position" => "def"}.to_json 
headers = {:content_type => :json, :if_none_match => '"something"'} 

RestClient.put('http://localhost:4567/players/1', {:data => player}, headers) do |response, request, result, &block| 
    p response.code.to_s + " " + response 
end 

Я не уверен, что RestClient правильно переводит заголовки. Если вышеуказанное не работает, попробуйте его:

headers = {'Content-Type' => :json, 'If-None-Match' => '"something"'}