用R调用Firestore REST API查询指定字段值遇400错误如何解决?
解决Cloud Firestore REST API查询的400错误(R语言实现)
问题背景
我正在使用R语言通过Cloud Firestore REST API进行数据的GET和POST操作,目标是获取Demographics集合中Instructor字段等于instructor2@fssi.com的所有文档数据(文档以用户邮箱命名)。
初始读取函数
library(httr) library(jsonlite) read.db <- function(db_endpoint, auth_token) { r <- GET( sprintf("https://firestore.googleapis.com/v1beta1/%s", db_endpoint), add_headers( "Content-Type" = "application/json", "Authorization" = paste("Bearer", auth_token) ) ) return(r) }
修改后的查询函数(触发400错误)
read.db <- function(db_endpoint, auth_token) { query <- list( structuredQuery = list( from = list( collectionId = "Demographics", allDescendants = TRUE ), where = list( fieldFilter = list( field = list( fieldPath = "Instructor" ), op = "EQUAL", value = list( stringValue = "instructor2@fssi.com" ) ) ) ) ) r <- POST( sprintf("https://firestore.googleapis.com/v1beta1/%s:runQuery", db_endpoint), body = toJSON(query), add_headers( "Content-Type" = "application/json", "Authorization" = paste("Bearer", auth_token) ) ) return(r) } response <- read.db("projects/MY-PROJECT/databases/(default)/documents", "MY-accessToken")
返回的400错误信息
Response [https://firestore.googleapis.com/v1beta1/projects/MY-PROJECT/databases/(default)/documents:runQuery] Date: 2023-10-17 12:35 Status: 400 Content-Type: application/json; charset=UTF-8 Size: 1.87 kB [{ "error": { "code": 400, "message": "Invalid JSON payload received. Unknown name \"collectionId\" at 'structured_query.from': Proto field is n... "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleapis.com/google.rpc.BadRequest", "fieldViolations": [ { ...
解决方案
错误原因
Firestore REST API的:runQuery接口要求structuredQuery.from是数组类型,但原代码直接传入了单个对象;同时jsonlite的toJSON默认会自动简化单元素数组为单个对象,导致API无法识别格式。
修正后的代码
library(httr) library(jsonlite) read.db <- function(db_endpoint, auth_token) { query <- list( structuredQuery = list( from = list( list( # 嵌套列表确保生成JSON数组格式 collectionId = "Demographics", allDescendants = TRUE ) ), where = list( fieldFilter = list( field = list( fieldPath = "Instructor" ), op = "EQUAL", value = list( stringValue = "instructor2@fssi.com" ) ) ) ) ) r <- POST( sprintf("https://firestore.googleapis.com/v1beta1/%s:runQuery", db_endpoint), body = toJSON(query, auto_unbox = FALSE), # 禁用自动解包,保留数组结构 add_headers( "Content-Type" = "application/json", "Authorization" = paste("Bearer", auth_token) ) ) return(r) } # 调用并解析结果 response <- read.db("projects/MY-PROJECT/databases/(default)/documents", "MY-accessToken") result <- fromJSON(content(response, "text")) print(result)
关键修改点
- 将
from字段的内容包裹在额外的list()中,确保生成[{"collectionId": "...", ...}]的数组格式 - 在
toJSON中添加auto_unbox = FALSE参数,避免单元素数组被扁平化,完全匹配Firestore API的格式要求
内容的提问来源于stack exchange,提问作者umair durrani
相关产品推荐
相关产品推荐

