2011-01-25 6 views
1

Mon but est d'adresser le "problème de mise à jour perdue" (voir http://www.w3.org/1999/04/Editing/) dans les opérations PUT. J'utilise sinatra, et en tant que client, j'utilise rest_client. Comment je peux vérifier si ça marche? Mon client renvoie toujours 200 code. Est-ce que j'utilise des arguments pour l'appeler correctement? (PUT travaille lui-même)sinatra rest-client etag

Code sinatra:

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 

invocation client:

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 
} 

J'ai essayé déjà de mettre: if_none_match => "quelque chose", j'ai essayé: if_match. Rien ne change. Comment puis-je mettre les en-têtes dans la requête RestClient? Comment faire pour obtenir sth différent de 200 statut? (c'est-à-dire 304 non modifié)?

Répondre

0

Votre charge et les en-têtes sont dans le même hachage. Vous devez spécifier les en-têtes pour RestClient dans le deuxième hachage. Essayez:

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 

Je ne sais pas si les en-têtes RestClient traduit correctement. Si ce qui précède ne fonctionne pas, essayez avec:

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