私はしばらくこれを見てきましたが、現在途方に暮れています。問題を JSON に関連するものに絞り込み、JSON が判読可能な形式で送信されていないようです。
以前はRails 3.0.7を使用していました(ここで説明する問題は存在しませんでした)。いくつかの新しい機能を利用するには、Rails をアップグレードする必要がありますが、この問題が発生しています。現時点では単純な構成か何かであるとほぼ確信していますが、もう少し注意が必要です。
ActiveResource オブジェクトを使用しており、オブジェクトの値を設定して保存すると (PUT が作成されます)、リモート Web サービスから ab 403:Forbidden が返されます。これは、Web サービス層の問題ではありません。
新しいオブジェクトを作成して POST を実行すると、デフォルト値でデータベースを更新しようとするため、409:Conflict が返されます。つまり、json データがサービスに到達していないか、判読できません。
私の問題は、これがRails 3.0.7で機能し、3.2.3(または私も試した3.1.3)では機能しなくなったことです。JSON データ以外の提案も受け付けていますが、そこに問題があることは確かです。
私の ActiveResource モデルは
self.format = :json
初期化ファイルの 1 つに次のものがあります。
ActiveResource::Base.include_root_in_json = false
ActiveSupport::JSON.backend = "json_gem"
ご提案ありがとうございます。
アップデート
私はcurlでテストしており、次の方法で動作するようになりました:
curl -H "Content-Type: application/json" -d "{\"userID\":\"xxx\", \"label\":\"doc.test.test\", \"value\":\"1,19\", \"id\":\"-1\"}" -v -X POST http://host:port/usermanagement/users/xxx/prefs
私はそれを機能させましたが、
Content-Type ヘッダーを明示的に設定する必要があるようです。そうしないと、415:Media Unrecognized エラーが発生します。
ActiveResource オブジェクトに Content-Type ヘッダーを設定しても、まだ 409:Conflict エラーが発生するため、JSON がまだ適切に形成されていないと思われます。
編集(もう一度)
JSON のどこに問題があるかを突き止めました。Rails は JSON にルートを保持しています。したがって、リソースを次のように送り返す代わりに
{"name":"value", "name":"value"}
送信中です
{"ResourceName": {"name":"value", "name":"value"}}
ただし、include_root_in_json
false に設定しました。初期化ファイルとモデル自体の両方でこれを試しましたが、変更はありませんでした。