проблемы при публикации данных из curl в Firestore throw curl - PullRequest
2 голосов
/ 04 апреля 2020

Я очень новичок в Google Firestore (также в Firebase). Я делаю простой PO C и немного страдаю от взаимодействия с 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"
  }

Я основывал в основном свои предположения на Выполнение вызовов на отдых и другой вопрос переполнения стека

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

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 Database Console

Другие предположения, вероятно, в неправильном направлении:

  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"}}

* РЕШЕНИЕ *

от cUrl

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>

1 Ответ

3 голосов
/ 06 апреля 2020

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

Вместо использования этого:

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

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

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

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

-d @file_with_data.json
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...