Я некоторое время смотрел на это и в настоящее время в недоумении. Я сузил проблему до того, что она связана с JSON, и что JSON, похоже, не отправляется в разборчивом формате.
Ранее мы использовали Rails 3.0.7 (где проблема, которую я собираюсь описать, НЕ существовала). Нам нужно обновить Rails, чтобы воспользоваться некоторыми новыми функциями, но теперь возникла эта проблема. Я почти уверен, что на данный момент это простая конфигурация или что-то в этом роде, но мне нужно больше внимания на нее.
Мы используем объекты ActiveResource, и после установки значений объекта и его сохранения (таким образом, выполняя PUT) мы получаем ab 403: Forbidden, возвращаемый удаленной веб-службой. Это не проблема на уровне веб-сервиса.
После создания нового объекта и выполнения POST мы получаем 409:Конфликт, возвращаемый при попытке обновить базу данных значениями по умолчанию, что означает, что данные json не достигают службы или неразборчивы.
Моя проблема в том, что это работало в Rails 3.0.7 и больше не работает в 3.2.3 (или 3.1.3, которую я тоже пробовал). Я открыт для предложений, отличных от данных JSON, однако я уверен, что проблема именно в этом.
Моя модель ActiveResource имеет
self.format = :json
В одном из моих файлов инициализатора есть следующее:
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 error
Если я устанавливаю заголовок Content-Type в объекте ActiveResource, я все равно получаю ошибку 409:Conflict, что заставляет меня полагать, что JSON все еще неправильно сформирован.
РЕДАКТИРОВАТЬ (снова)
Я понял, в чем проблема с JSON - Rails сохраняет корень в JSON. Таким образом, вместо того, чтобы отправлять ресурс обратно как
{"name":"value", "name":"value"}
, он отправляет
{"ResourceName": {"name":"value", "name":"value"}}
. Однако я установил include_root_in_json
в false — я пробовал это и в файлах инициализатора, и непосредственно в самой модели, и нет. изменять.