使用纯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能正确解析
额外验证建议
- 确认你的Access Token拥有
datastore.query权限,否则会返回权限相关错误 - 检查
users集合中确实存在email字段值为test@gmail.com的文档 - 若仍有问题,可开启curl的 verbose 模式(添加
curl_setopt($ch, CURLOPT_VERBOSE, true);),查看详细的请求/响应日志,辅助排查问题
内容的提问来源于stack exchange,提问作者goop51
相关产品推荐
相关产品推荐

