Синатра отдых-клиент Этаг - PullRequest
1 голос
/ 25 января 2011

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

код синатры:

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? Как получить статус, отличный от 200? (т.е. 304 не изменен)?

1 Ответ

0 голосов
/ 19 октября 2011

Ваша полезная нагрузка и заголовки находятся в одном хеше. Вы должны указать заголовки для 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"'}
...