1

私の目標は、PUT 操作における「失われた更新の問題」 ( http://www.w3.org/1999/04/Editing/を参照) に対処することです。私は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 => "something" を入れようとしましたが、:if_match を試しました。何も変わりません。RestClient リクエストにヘッダーを挿入するにはどうすればよいですか? 200 ステータス以外の sth を取得するにはどうすればよいですか? (つまり、304 は変更されていません)?

4

1 に答える 1

0

ペイロードとヘッダーは同じハッシュにあります。RestClient2 番目のハッシュでヘッダーを指定する必要があります。試す:

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"'}
于 2011-10-19T11:22:12.047 に答える