You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用纯PHP与REST API无法从Firestore查询数据求助

解决Firestore REST API结构化查询返回空结果的问题

我一眼就看出问题出在哪了——你用错了Firestore REST API的请求方式!结构化查询(structuredQuery)不能通过GET请求的URL参数传递,Firestore要求这类查询必须用POST请求,把JSON格式的查询体放在请求正文中。

问题根源

你用http_build_query()把嵌套的查询数组转成了URL参数,但Firestore的API无法正确解析这种嵌套结构的GET参数,所以虽然返回了200状态码,但实际上没有执行有效的查询,自然返回空的{}。

修正后的代码

下面是调整后的完整代码,我标注了关键修改点:

<?php
$firestoreUrl = 'https://firestore.googleapis.com/v1/projects/[MY-PROJECT-ID]/databases/(default)/documents:runQuery';
// 1. 定义结构化查询数组,注意嵌套结构的正确性
$structuredQuery = [ 
    "select" => [ "fields" => [ ["fieldPath" => "email"] ] ], // fields需要是数组的数组(支持多选字段)
    "where" => [ 
        "fieldFilter" => [ 
            "field" => [ "fieldPath" => "email" ], 
            "op" => "EQUAL", 
            "value" => [ "stringValue" => "test@gmail.com" ] 
        ] 
    ],
    "from" => [ ["collectionId" => "users"] ] // from同样需要是数组的数组(支持多集合查询)
];

$ch = curl_init();
// 2. 设置POST请求,使用专门的runQuery端点
curl_setopt($ch, CURLOPT_URL, $firestoreUrl);
curl_setopt($ch, CURLOPT_POST, true);
// 3. 把查询数组转成JSON作为POST请求体
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($structuredQuery));
// 4. 添加必要的请求头,指定JSON格式
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer [MY-ACCESS-TOKEN]',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);
echo $response;
curl_close($ch);
?>

关键修改说明

  • API端点变更:改用documents:runQuery,这是Firestore专门用于执行结构化查询的路径
  • 请求方式改为POST:结构化查询必须通过POST发送,GET只支持简单的列表查询
  • 修复数组结构:fields和from字段要求是数组嵌套(支持多字段/多集合),之前的写法缺少外层数组,会导致查询解析失败
  • 正确传递查询体:用json_encode()把查询转成JSON字符串,放在POST请求体中,而非URL参数
  • 添加Content-Type头:告诉服务器请求体是JSON格式,确保API能正确解析

额外验证建议

  1. 确认你的Access Token拥有datastore.query权限,否则会返回权限相关错误
  2. 检查users集合中确实存在email字段值为test@gmail.com的文档
  3. 若仍有问题,可开启curl的 verbose 模式(添加curl_setopt($ch, CURLOPT_VERBOSE, true);),查看详细的请求/响应日志,辅助排查问题

内容的提问来源于stack exchange,提问作者goop51

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:57:32