Дочерняя база данных Firebase RT не обновляется с httpPostJson
Я пытаюсь записать событие, которое происходит с устройством Smartthings, в базу данных Firebase. Функция в моем приложении Smartthings:
def reportSwitchOnHandler(evt){
log.debug "reportSwitchOnHandler called: $evt"
def params = [
uri: "https://<project-id>.firebaseio.com/switchStateData/params.json?auth=<key>",
body: [
switchState: "test"
]
]
try {
httpPostJson(params) { resp ->
resp.headers.each {
log.debug "${it.name} : ${it.value}"
}
log.debug "DEBUG (POST FIREBASE): response contentType: ${resp. contentType}"
}
} catch (e) {
log.debug "something went wrong: $e"
}
Моя структура базы данных "params" вернула json:
{"lights":0,"switchState":"off"}
Я только хочу обновить switchState.
С учетом вышесказанного, когда я запускаю приведенный выше код в структуре "params", а не обновляю дочерний элемент switchState, он создает нового дочернего элемента с некоторым случайным значением, например "-Kyn_TIEItKNNACLuEk5", и под этим switchState имеется "test " значение.
{"-Kyn_TIEItKNNACLuEk5":{"switchState":"test"},"lights":0,"state":"off"}
Любые идеи, что мне не хватает, чтобы на самом деле обновить оригинальный дочерний элемент switchState, а не создавать новый дочерний дочерний элемент (-Kyn_TIEItKNNACLuEk5)?
2 ответа
С помощью POST
отправляет данные в определенное место, вам нужно использовать PATCH
обновить данные без перезаписи ключей, которые отсутствуют.
curl -X PATCH -d '{"last":"Jones"}' \
'https://[PROJECT_ID].firebaseio.com/users/jack/name/.json'
Вы можете обновить определенные дочерние элементы в местоположении, не перезаписывая существующие данные, используя запрос PATCH. Именованные дочерние элементы в данных, записываемых с помощью PATCH, перезаписываются, но пропущенные дочерние элементы не удаляются.
Для дальнейшего использования в документах Smartthings я обнаружил бета-версию (на момент написания этой статьи), которая теперь позволяет использовать команду PATCH. Проверьте здесь, http://docs.smartthings.com/en/latest/smartapp-developers-guide/async-http.html.