【问题标题】:Firestore REST API use with appGyver Composer ProFirestore REST API 与 appGyver Composer Pro 一起使用
【发布时间】:2020-04-11 15:04:48
【问题描述】:

我正在使用 Google Firebase 尝试新的 appGyver Composer Pro(没有成功)。 AppGyver 使用 REST API 来获取数据库上的数据,但我无法让它工作。 数据库非常简单,只有两个文档,所以我使用 SoapUI 和 Postman 来尝试不同的 uri 来确定如何设置 Composer Pro:

所以,使用 GET https://firestore.googleapis.com/v1/projects/{project}/databases/(default)/documents/{collection}/

这是请求的结果:

{"documents": [
      {
      "name": "projects/{project}/databases/(default)/documents/{collection}/{id}",
      "fields":       {
         "Nombre": {"stringValue": "Cerros"},
         "Resolucion": {"mapValue": {"fields":          {
            "Numero": {"stringValue": "22"},
            "Entidad": {"stringValue": "Curaduria"},
            "FechaResolucion": {"timestampValue": "2020-04-09T05:00:00Z"}
         }}}
      },
      "createTime": "2020-04-10T13:11:35.364097Z",
      "updateTime": "2020-04-10T13:11:35.364097Z"
   },
      {
      "name": "projects/{project}/databases/(default)/documents/{collection}/{id}",
      "fields":       {
         "Nombre": {"stringValue": "Urbanizacion Guayacanes"},
         "Resolucion": {"mapValue": {"fields":          {
            "Numero": {"stringValue": "14"},
            "Entidad": {"stringValue": "Municipio de Chinchina"},
            "FechaResolucion": {"timestampValue": "2013-11-13T05:00:00Z"}
         }}}
      },
      "createTime": "2020-04-09T14:29:09.633853Z",
      "updateTime": "2020-04-09T14:29:09.633853Z"
   }
]}

但是如果我使用 https://firestore.googleapis.com/v1/projects/{project}/databases/(default)/documents/{collection}/?Nombre=Cerros

我明白了

{"error": {
   "code": 400,
   "message": "Invalid JSON payload received. Unknown name \"Nombre\": Cannot bind query parameter. Field 'Nombre' could not be found in request message.",
   "status": "INVALID_ARGUMENT",
   "details": [   {
      "@type": "type.googleapis.com/google.rpc.BadRequest",
      "fieldViolations": [{"description": "Invalid JSON payload received. Unknown name \"Nombre\": Cannot bind query parameter. Field 'Nombre' could not be found in request message."}]
   }]
}}

我使用以下任何一种而不是 ?Nombre=Cerros:

  • ?"Nombre"="Cerros"
  • ?"documents.Nombre"="Cerros"
  • ?"documents.fields.Nombre"="Cerros"

或者使用之前?以下任何一项:

  • :运行查询
  • 搜索

我做错了什么? 我真的很感激任何帮助

爱德华多

P.D. 我在 REST API Explorer 上试过:

curl --request POST \
  'https://firestore.googleapis.com/v1/projects/permisos-23395/databases/(default)/documents/Inmueble/:runQuery' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"structuredQuery":{"select":{"fields":[{"fieldPath":"Nombre"},{"fieldPath":"matInm"}]},"from":[{"collectionId":"Inmueble","allDescendants":false}],"where":{"fieldFilter":{"field":{"fieldPath":"Nombre"},"op":"EQUAL","value":{"stringValue":"Cerros"}}}}}' \
  --compressed

得到了

{
  "error": {
    "code": 400,
    "message": "Invalid JSON payload received. Unknown name \"structuredQuery\" at 'document': Cannot find field.",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "field": "document",
            "description": "Invalid JSON payload received. Unknown name \"structuredQuery\" at 'document': Cannot find field."
          }
        ]
      }
    ]
  }
}

【问题讨论】:

    标签: rest google-cloud-firestore appgyver


    【解决方案1】:

    您使用的端点用于列出集合的文档,而不是用于检索其内容。

    当您调用https://firestore.googleapis.com/v1/projects/{project}/databases/(default)/documents/{collection}/ 时,您调用的是projects.databases.documents.list 方法,如您所见,该方法返回属于该集合的文档列表。

    之后,您在指向列表端点时尝试使用查询参数检索与限制“Nombre=Cierros”匹配的文档,这不是一个有效的请求。

    如果您确实想要检索文档,您需要使用以下方法之一:

    • 要请求单个文档,您需要使用projects.databases.documents.get 方法和对端点https://firestore.googleapis.com/v1/projects/{project_id}/databases/{database_id}/documents/{document_path} 的get 请求。其中文档路径的格式为 {collection}/{documentId}
    • 要根据过滤器查询文档,您需要使用 projects.databases.documents.runQuery 方法以文档中描述的格式提供请求正文。

    【讨论】:

    • 已尝试:在 API 资源管理器上运行查询,但无法正常工作。它返回:错误 400...收到无效的 JSON 有效负载。 'document' 处的未知名称 \"structuredQuery\" ... INVALID_ARGUMENT
    • '{"structuredQuery":{"from":[{"collectionId":"Inmueble","allDescendants":true}],"select":{"fields":[{"fieldPath ":"Nombre"},{"fieldPath":"nic_Inm"}]},"where":{"fieldFilter":{"field":{"fieldPath":"Nombre"},"op":"EQUAL" ,"value":{"stringValue":"Cerros"}}}}}'
    【解决方案2】:

    感谢 Happy-Monad。我听从了你的建议并开始工作了:

    除了默认索引之外,还需要按 {collection} {query field} 创建索引。

    从来没有让它与 API EXPLORER 一起使用,因为它需要父路径上的集合 id,但如果 :runQuery 在那里,它就不起作用。

    :runQuery 是通过 POST 调用(不是 GET)请求的:https://firebase.google.com/docs/firestore/reference/rest#rest-resource:-v1.projects.databases.documents

    有效的 curl 调用如下:

    curl --request POST \
      'https://firestore.googleapis.com/v1/projects/{database}/databases/(default)/documents:runQuery' \
      --header 'Accept: application/json' \
      --header 'Content-Type: application/json' \
      --data '{"structuredQuery":{"select":{"fields":[{"fieldPath":"Nombre"},{"fieldPath":"nicInm"}]},"from":[{"collectionId":"{collection}","allDescendants":true}],"where":{"fieldFilter":{"field":{"fieldPath":"Nombre"},"op":"EQUAL","value":{"stringValue":"Cerros"}}}}}' \
      --compressed
    

    它返回(JSON):

    array [1]
    0 {2}
    document {4}
    name : projects/{database}/databases/(default)/documents/{collection}/{document id}
    fields {2}
    nicInm {1}
    stringValue : 17-00-01-0001
    nameInm {1}
    stringValue : Cerros
    createTime : 2020-04-14T15:22:53.782673Z
    updateTime : 2020-04-14T15:22:53.782673Z
    readTime : 2020-04-14T16:04:55.392601Z
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 2017-07-22
      相关资源
      最近更新 更多