проблемы при отправке данных из curl в Firestore throw curl

Я очень новичок в Google Firestore (также в Firebase). Я делаю простой POC, и мне немного тяжело взаимодействовать с FireStore. Что ж, чтение данных из Angular сработало так просто. Тем не менее, простые действия вроде добавления новых данных из curl или удаления коллекции из FireBase Cli заняли у меня целый день без прогресса. Просто чтобы подчеркнуть, насколько я тупица в FireStore, я использовал локально установленный ElasticSearch, поэтому я пробую аналогичные поведения/инструменты/функции, такие как публикация/создание полей из curl/postman (это не является частью этого вопроса, сравнивайте друг друга, просто выставляя свои ограничения), но я просто не могу двигаться вперед.

Вот как я успешно подключился из Angular:

  firebaseConfig : {
    apiKey: "*** removed ***",
    authDomain: "transfer-status-realtime.firebaseapp.com",
    databaseURL: "https://transfer-status-realtime.firebaseio.com",
    projectId: "transfer-status-realtime",
    storageBucket: "transfer-status-realtime.appspot.com",
    messagingSenderId: "143612370857",
    appId: "1:143612370857:web:a9d0b21e3a58520ed02eb8",
    measurementId: "G-WT5C346D7T"
  }

В основном я основывал свои предварительные предположения на вызовах отдыха и < href="https://stackoverflow.com/a/46776308/4148175">другой вопрос о переполнении стека

Моя последняя и недавняя попытка:

c:\temp>curl -X POST -H "Content-Type: application/json" -d'{"fields": {"status": "success"}}' "https://firestore.googleapis.com/v1beta1/projects/transfer-status-realtime/databases/(default)/documents/transfers?&key=***removed***"
curl: (3) [globbing] unmatched brace in column 1
curl: (3) [globbing] unmatched close brace/bracket in column 8
{
  "error": {
    "code": 400,
    "message": "Invalid JSON payload received. Closing quote expected in string.\n\n^",
    "status": "INVALID_ARGUMENT"
  }
}

Итак, моя главная проблема: как добавить данные в FireStore из curl?

Если это имеет значение, вот моя консоль базы данных:

Консоль базы данных FireStore

Другие попытки, вероятно, в неправильном направлении, которые я пробовал:

  1. Согласно https://firebase.google.com/docs/database/rest/save-data, я могу сохранять поля с помощью PUT, поэтому я попытался написать команду curl, но застрял, потому что не знаю, что будет «fireblog» в моем случае?

    curl -X PUT -d '{
      "transfers": {
        "id": "idfromPut",
        "status": 1
      }
    }' 'https://transfer-status-realtime.firebaseio.com/rest/saving-data/fireblog/users.json'
    
  2. Я тоже пробовал, но что в моем случае будет message_list? curl -X POST -d '{"status" : 2}' 'https://transfer-status-realtime.firebaseio.com/message_list.json'

*** отредактировано

c:\temp>curl -X POST -H "Content-Type: application/json" -d "{\"fields\": {\"status\": \"success\"}}" "https://firestore.googleapis.com/v1/projects/transfer-status-realtime/databases/(default)/documents/transfers?&key=*** removed ***"
{
  "error": {
    "code": 400,
    "message": "Invalid value at 'document.fields[0].value' (type.googleapis.com/google.firestore.v1.Value), \"success\"",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "field": "document.fields[0].value",
            "description": "Invalid value at 'document.fields[0].value' (type.googleapis.com/google.firestore.v1.Value), \"success\""
          }
        ]
      }
    ]
  }
}

Если это актуально, та же проблема с использованием внешнего файла json

C:\WSs\reactive-stack\reactive-front\src>curl -X POST -H "Content-Type: application/json" -d @load-data-tofirestore.json "https://firestore.googleapis.com/v1/projects/transfer-status-realtime/databases/(default)/documents/transfers?&key=***removed"
{
  "error": {
    "code": 400,
    "message": "Invalid value at 'document.fields[0].value' (type.googleapis.com/google.firestore.v1.Value), \"success\"",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "field": "document.fields[0].value",
            "description": "Invalid value at 'document.fields[0].value' (type.googleapis.com/google.firestore.v1.Value), \"success\""
          }
        ]
      }
    ]
  }
}

А вот файл json

{"fields": {"status": "success"}}

* РЕШЕНИЕ *

из url

C:\WSs\reactive-stack\reactive-front\src>curl -H "Content-Type: application/json" -X POST https://firestore.googleapis.com/v1/projects/transfer-status-realtime/databases/(default)/documents/transfers -d "{\"fields\": { \"status\": { \"stringValue\": \"outro status\" } }}"
{
  "name": "projects/transfer-status-realtime/databases/(default)/documents/transfers/ddwHxjy7eQV3640pW0Xx",
  "fields": {
    "status": {
      "stringValue": "outro status"
    }
  },
  "createTime": "2020-04-06T16:21:16.453553Z",
  "updateTime": "2020-04-06T16:21:16.453553Z"
}

из PowerShell

PS C:\Users> $body = @"
>> {
>>   "fields": {
>>     "status": {
>>       "stringValue": "fracasso"
>>     }
>>   }
>> }
>> "@
>>
PS C:\Users\Cast> $params = @{
>>     Uri         = 'https://firestore.googleapis.com/v1/projects/transfer-status-realtime/databases/(default)/documents/transfers'
>>     Method      = 'POST'
>>     Body        = $body
>>     ContentType = 'application/json'
>> }
>>
PS C:\Users\Cast> Invoke-RestMethod @params

name                                                                                           fields     createTime
----                                                                                           ------     ----------
projects/transfer-status-realtime/databases/(default)/documents/transfers/z4TB6gzcgXMRUGR8ecek @{status=} 2020-04-06...


PS C:\Users>

comment
имея в виду решение, вы пробовали Cygwin? терминал Cygwin следует правилам выхода linux/bash :) (в основном это порт GNU bash для Windows)   -  person hanshenrik    schedule 09.04.2020
comment
Честно говоря, я мало что знал о Cygwin, но скоро попробую. Для очень тупого Cygwin, в чем разница между терминалом Cigwin и PowerShell? Они предназначены для той же цели, не так ли? Запускайте команды Linux на терминале Windows, верно?   -  person Jim C    schedule 09.04.2020
comment
Нет, PowerShell предназначен для запуска... C-Sharp? -как Windows-команды в Windows. PowerShell не имеет ничего общего с Linux. но Cygwin предназначен для запуска команд Linux в Windows. Кстати, пока у вас есть Cygwin, сохраните и установщик. установщик Cygwin - это, по сути, ваш менеджер пакетов, когда вам нужны новые linux-программы (например, rsync или что-то еще), вам нужно повторно запустить программу установки Cygwin. он не будет устанавливать все заново, он просто добавит запрошенные дополнительные пакеты   -  person hanshenrik    schedule 10.04.2020


Ответы (1)


Я считаю, что основная причина вашей проблемы связана с cURL в системе Windows. Как видно из другого вопроса, существуют ограничения на анализ аргументов командной строки в оболочке Windows.

Вместо этого:

-d'{"fields": {"status": "success"}}'

Вы должны указать свою полезную нагрузку как:

-d "{\"fields\": {\"status\": \"success\"}}"

Другим решением может быть запись JSON в файл и использование его пути в запросе cURL. Я полагаю, что таким образом можно сохранить правильный формат JSON, но вам придется использовать файл, что далеко не оптимально, если вы не собираетесь отправлять одну и ту же полезную нагрузку несколько раз:

-d @file_with_data.json
person Ajordat    schedule 06.04.2020
comment
Я получил... fieldViolations: [ {поле: document.fields[0].value, описание: недопустимое значение в 'document.fields[0].value'... как вставлено выше. Кажется, я неправильно пишу команду с точки зрения Google Firestore, так как вижу недопустимое значение. - person Jim C; 06.04.2020
comment
@JimC Я не могу понять эту последнюю ошибку, в чем была основная причина второй проблемы? URL-адрес или содержимое JSON? - person Ajordat; 07.04.2020
comment
ошибка ... type.googleapis.com/google.rpc.BadRequest, fieldViolations... определенно была вызвана неправильным форматом команды. Если вы сравните, возможно, последнее, что было успешным, со всеми остальными неудачными, я использовал до... {... stringValue... во всех остальных неудачных - person Jim C; 09.04.2020