将数据从 curl 发布到 Firestore 时出现问题抛出 curl

issues while posting data from curl to Firestore throw curl

我是 Google Firestore(也是 Firebase)的新手。我正在做一个简单的 POC,我在与 FireStore 交互时遇到了一些问题。好吧,从 Angular 读取数据如此简单。然而,像从 curl 添加新数据或从 FireBase Cli 删除集合这样的简单操作让我一整天都没有进展。只是为了强调我在 FireStore 中有多虚伪,我已经使用本地安装的 ElasticSearch,所以我正在尝试类似 behaviours/tools/functionalities 的 posting/creating 来自 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"
  }

我的初步设想主要基于 Making Rest Calls and

我最近一次尝试:

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

所以我的主要问题是:如何从 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"}}

* 解决方案 *

来自 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>

我认为您的问题的根本原因是 windows 系统上的 cURL。如 this other question 中所示,在 windows shell.

中解析命令行参数的方式存在限制

而不是使用这个:

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

您应该将您的负载声明为:

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

另一种解决方案是将 JSON 写入文件并在 cURL 查询中使用其路径。我相信您可以通过这种方式保留 right JSON 格式,但是您将被迫使用一个文件,如果您不打算发送多次相同的负载:

-d @file_with_data.json