Использование REST API Firestore с appGyver Composer Pro

Я пробую новое приложение Gyver Composer Pro с Google Firebase (безуспешно). AppGyver использует REST API для получения данных в базе данных, но я не могу заставить его работать. База данных очень проста и содержит только два документа, поэтому я использую SoapUI и Postman, чтобы попробовать разные способы определения того, как установить Composer Pro:

Итак, используя GET https://firestore.googleapis.com/v1/projects/%7Bproject%7D/databases/(default)/documents/%7Bcollection%7D/

Это результат запроса:

{"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/%7Bproject%7D/databases/(default)/documents/%7Bcollection%7D/?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"

Или использовали раньше? любое из следующего:

  • : runQuery
  • поиск

Что я делаю неправильно? Я был бы очень признателен за любую помощь

Эдуардо

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

person Eduardo Jaramillo Robledo    schedule 11.04.2020    source источник


Ответы (2)


Конечная точка, которую вы используете, предназначена для перечисления документов коллекции, а не для получения ее содержимого.

Когда вы вызываете 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}. Где путь к документу будет иметь форму {collection}/{documentId}.
  • Для запроса документов на основе фильтра вам необходимо использовать метод projects.databases.documents.runQuery, предоставляющий тело запроса в формате, описанном в документации.
person Happy-Monad    schedule 13.04.2020
comment
Пытался: запустить Query в проводнике API, но не смог заставить его работать. Он возвращает: error 400 ... Получены недопустимые данные JSON. Неизвестное имя \ structuredQuery \ в 'документе' ... INVALID_ARGUMENT - person Eduardo Jaramillo Robledo; 13.04.2020
comment
'{structuredQuery: {from: [{collectionId: Inmueble, allDescendants: true}], выберите: {fields: [{fieldPath: Nombre}, {fieldPath: nic_Inm}]}, где: {fieldFilter: {field: {fieldPath: Nombre}, op: EQUAL, value: {stringValue: Cerros}}}}} ' - person Eduardo Jaramillo Robledo; 13.04.2020

Спасибо Happy-Monad. Я последовал вашему примеру и заставил его работать:

Должен быть Индекс по {коллекции} {полю запроса}, созданный в дополнение к индексам по умолчанию.

Никогда не заставлял его работать с API EXPLORER, потому что ему нужен идентификатор коллекции на родительском пути, но: 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
person Eduardo Jaramillo Robledo    schedule 14.04.2020