6

私はしばらくこれを見てきましたが、現在途方に暮れています。問題を 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

私はそれを機能させましたが、

  1. Content-Type ヘッダーを明示的に設定する必要があるようです。そうしないと、415:Media Unrecognized エラーが発生します。

  2. ActiveResource オブジェクトに Content-Type ヘッダーを設定しても、まだ 409:Conflict エラーが発生するため、JSON がまだ適切に形成されていないと思われます。

編集(もう一度)

JSON のどこに問題があるかを突き止めました。Rails は JSON にルートを保持しています。したがって、リソースを次のように送り返す代わりに

{"name":"value", "name":"value"}

送信中です

{"ResourceName": {"name":"value", "name":"value"}}

ただし、include_root_in_jsonfalse に設定しました。初期化ファイルとモデル自体の両方でこれを試しましたが、変更はありませんでした。

4

2 に答える 2

1

ActiveResource::Base.include_root_in_json が Rails 3-2-stable (3.2.13 を含む) で壊れているようです。この問題は、スタンドアロンのアクティブ リソース リポジトリで修正されています。

def to_json(options={})
  super(include_root_in_json ? { :root => self.class.element_name }.merge(options) : options)
end

同じことを行うことで、イニシャライザの 1 つでモンキー パッチを適用できます。

更新: この問題は rails 3-2-stable backport commitで修正されました

于 2013-05-11T03:31:46.367 に答える
1

to_jsonしたがって、モデルのメソッドをオーバーライドして単純に返すことで、これを「修正」しました(回避しました)。self.attributes.to_json

class Document < ActiveResource::Base
  self.site += 'user/:user_id'
  self.element_name = "docs"

  def to_json(options={})
    self.attributes.to_json(options)
  end
end
于 2012-10-10T19:25:33.440 に答える