Firebase REST API — запрос ИСПРАВЛЕНИЯ Guzzle удаляет данные

#http #rest #firebase #guzzle

# #http #отдых #огневая база #жрать

Вопрос:

Согласно документам firebase, https://www.firebase.com/docs/rest-api.html , в нем говорится:

 PATCH - Updating Data
You can update specific children at a location without overwriting existing data 
with a PATCH request. Named children in the data being written with PATCH will be 
written, but omitted children will not be deleted. This is equivalent to the 
update( ) function.

curl -X PATCH -d '{"last":"Jones"}' 
 https://SampleChat.firebaseIO-demo.com/users/jack/name/.json
A successful request will be indicated by a 200 OK HTTP status code. 
The response will contain the data written:

{"last":"Jones"}
 

Теперь я понимаю, что если я хочу обновить только части ресурса, то я могу использовать запрос ИСПРАВЛЕНИЯ.

Моя упрощенная база данных firebase выглядит следующим образом:

   "exchange-rates" : {
    "eur" : {
      "fx" : 1.2,
      "currency_symbol" : "€",
      "updated_at" : "2014-06-13T22:49:23 0100",
    },
    "usd" : {
      "fx" : 1.6,
      "currency_symbol" : "$",
      "updated_at" : "2014-06-13T22:49:23 0100",
    },
    "gbp" : {
      "fx" : 1,
      "currency_symbol" : "£",
      "updated_at" : "2014-06-16T15:43:15 0100",
    }
  }
 

Однако, если я опущу currency_symbol и updated_at из полезной нагрузки в своем запросе исправления, Firebase удалит эти атрибуты из базы данных.

     $auth = 'SUPER_SECRET_CODE';
    $guzzleClient = new GuzzleHttpClient();
    $url = https://DATABASE.firebaseio.com/.json;


    $data['exchange-rates']['gbp']['fx'] = (float) 1;
    $data['exchange-rates']['usd']['fx'] = (float) 1.66;
    $data['exchange-rates']['eur']['fx'] = (float) 1.22;

    $payload =
        [
            'query' => [ 'auth' => $auth ],
            'json' => $data
        ];

    $response = $guzzleClient->patch($url, $payload);
 

Таким образом, запрос ИСПРАВЛЕНИЯ не работает должным образом, или я неправильно понял, что Firebase должна делать с этим запросом ИСПРАВЛЕНИЯ, или я что-то упускаю. Есть мысли?

Кроме того, если я хочу добавить объект к объекту обменных курсов, я должен быть в состоянии это сделать.

 $data['exchange-rates']['chf']['fx'] = 2.13;

    $payload =
        [
            'query' => [ 'auth' => $auth ],
            'json' => $data
        ];

    $response = $guzzleClient->patch($url, $payload);
 

Однако все, что это делает, это просто перезаписывает все существующие обменные курсы, и теперь у меня есть только 1 обменный курс в БД.

Ответ №1:

Операции обновления / ИСПРАВЛЕНИЯ не являются рекурсивными. Они наблюдают только за ключами для прямых дочерних элементов вашего обновления. Пример:

 // assume data:  { foo: 'bar', baz: {uno: 1, dos: 2}, zeta: {hello: 'world'} };

curl -X PATCH -d  '{"tres": 3}' $URL

// baz is now: {uno: 1, dos: 2, tres: 3}

curl -X PATCH -d '{"foo": "barr", baz: {"tres": 3}}' $URL

// baz is now {tres: 3}
 

Таким образом, обновление происходит только на один уровень глубиной. Если одна из предоставленных вами дочерних записей является объектом, она заменяет дочернюю запись по этому пути, а не пытается объединить их.